From 54a53dcc328cea7d7c89d10fd9f25700038208b0 Mon Sep 17 00:00:00 2001 From: David Federman Date: Sun, 30 Aug 2026 09:10:56 -0700 Subject: [PATCH] specs: Update SDS13781, Add SDS13782, SDS13783, SDS13784 --- .../01-abbreviations.md | 34 ++ .../02.01-precedence-of-definitions.md | 2 +- .../02.02-terms-used-in-this-document.md | 8 +- .../02-introduction/index.md | 8 +- .../03.01-overview.md | 10 + .../03.02-command-class-format.md | 79 +++ ...ontrolled-and-supported-command-classes.md | 4 +- .../03.04-node-information-frame.md | 144 +++++ .../03.05-multicast-and-broadcast-commands.md | 4 +- .../03.06-actuator-control.md | 28 +- .../03.07-common-fields-and-encoding.md | 130 +++++ .../03-command-class-overview/index.md | 4 +- ...larm-command-class-version-1-deprecated.md | 30 +- ...larm-command-class-version-2-deprecated.md | 112 ++-- ...nsor-command-class-version-1-deprecated.md | 74 +-- ...4-alarm-silence-command-class-version-1.md | 51 ++ ...witch-command-class-version-1-obsoleted.md | 81 +++ ...heft-command-class-version-1-obsoleted.md} | 10 +- ...eft-command-class-version-2-deprecated.md} | 176 ++++--- ...4.08-anti-theft-command-class-version-3.md | 196 +++++++ ...ti-theft-unlock-command-class-version-1.md | 131 +++++ .../04.10.01-terminology.md | 16 + ...4.10.02-interoperability-considerations.md | 18 + ...3-authentication-capability-get-command.md | 19 + ...uthentication-capability-report-command.md | 110 ++++ ...4.10.05-authentication-data-set-command.md | 63 +++ ...4.10.06-authentication-data-get-command.md | 40 ++ ...0.07-authentication-data-report-command.md | 73 +++ ...on-technologies-combination-set-command.md | 110 ++++ ...on-technologies-combination-get-command.md | 40 ++ ...technologies-combination-report-command.md | 125 +++++ ....11-authentication-checksum-get-command.md | 44 ++ ...-authentication-checksum-report-command.md | 74 +++ .../04.10.13-examples-and-use-cases.md | 16 + .../index.md | 26 + ...00-sound-switch-command-class-version-2.md | 72 +++ ...e-configuration-command-class-version-1.md | 165 ++++++ ...f-table-monitor-command-class-version-1.md | 235 +++++++++ ...ostat-fan-mode-command-class-version-1.md} | 72 +-- ...mostat-fan-mode-command-class-version-2.md | 52 ++ ...ostat-fan-mode-command-class-version-3.md} | 50 +- ...tat-fan-mode-command-class-version-4-5.md} | 128 +++-- ...tat-fan-state-command-class-version-1-2.md | 63 +++ ...ermostat-mode-command-class-version-1-2.md | 112 ++++ ...thermostat-mode-command-class-version-3.md | 118 +++++ ...ion-media-write-command-class-version-1.md | 162 ++++++ ...operating-state-command-class-version-1.md | 41 ++ ...operating-state-command-class-version-2.md | 160 ++++++ ...rmostat-setback-command-class-version-1.md | 86 +++ ...stat-setpoint-command-class-version-1-2.md | 177 +++++++ ...mostat-setpoint-command-class-version-3.md | 336 ++++++++++++ ...4.115-user-code-command-class-version-1.md | 140 +++++ .../04.116.01-terminology.md | 18 + .../04.116.02-compatibility-considerations.md | 32 ++ ....116.03-interoperability-considerations.md | 22 + .../04.116.04-security-considerations.md | 18 + .../04.116.05-user-code-set-command.md | 40 ++ .../04.116.06-users-number-report-command.md | 32 ++ ...6.07-user-code-capabilities-get-command.md | 21 + ...8-user-code-capabilities-report-command.md | 121 +++++ ...16.09-user-code-keypad-mode-set-command.md | 35 ++ ...16.10-user-code-keypad-mode-get-command.md | 19 + ...11-user-code-keypad-mode-report-command.md | 22 + ...4.116.12-extended-user-code-set-command.md | 99 ++++ ...4.116.13-extended-user-code-get-command.md | 46 ++ ...16.14-extended-user-code-report-command.md | 88 ++++ .../04.116.15-master-code-set-command.md | 53 ++ .../04.116.16-master-code-get-command.md | 19 + .../04.116.17-master-code-report-command.md | 39 ++ ...4.116.18-user-code-checksum-get-command.md | 23 + ...16.19-user-code-checksum-report-command.md | 43 ++ .../index.md | 34 ++ ...window-covering-command-class-version-1.md | 365 +++++++++++++ ...arrier-operator-command-class-version-1.md | 221 ++++++++ .../04.13-basic-command-class-version-1.md} | 76 +-- .../04.14-basic-command-class-version-2.md} | 40 +- ...ff-information-command-class-version-1.md} | 56 +- ...ering-command-class-version-1-obsoleted.md | 43 ++ ...sor-command-class-version-1-deprecated.md} | 30 +- ...sor-command-class-version-2-deprecated.md} | 110 ++-- ...9-binary-switch-command-class-version-1.md | 87 ++++ ...0-binary-switch-command-class-version-2.md | 73 +++ ...witch-command-class-version-1-obsoleted.md | 50 ++ ...cene-command-class-version-1-obsoleted.md} | 72 +-- ...scene-command-class-version-2-obsoleted.md | 113 ++++ ...-central-scene-command-class-version-3.md} | 128 ++--- ...dule-command-class-version-1-deprecated.md | 234 +++++++++ .../04.26-clock-command-class-version-1.md | 98 ++++ ...27-color-switch-command-class-version-1.md | 234 +++++++++ ...28-color-switch-command-class-version-2.md | 72 +++ ...9-color-switch-command-class-version-3.md} | 72 +-- ...0-configuration-command-class-version-1.md | 120 +++++ ...1-configuration-command-class-version-2.md | 241 +++++++++ ...-configuration-command-class-version-3.md} | 226 ++++---- ...3-configuration-command-class-version-4.md | 223 ++++++++ ...ler-replication-command-class-version-1.md | 115 ++++ ...-configuration-command-class-version-1.md} | 182 +++---- ...ol-plan-monitor-command-class-version-1.md | 124 +++++ ....37-door-lock-command-class-version-1-2.md | 289 ++++++++++ ...04.38-door-lock-command-class-version-3.md | 56 ++ ...04.39-door-lock-command-class-version-4.md | 492 ++++++++++++++++++ ...or-lock-logging-command-class-version-1.md | 171 ++++++ ...ergy-production-command-class-version-1.md | 79 +++ ...-entry-control-command-class-version-1.md} | 277 +++++----- ...neric-schedule-capabilities-get-command.md | 19 + ...ic-schedule-capabilities-report-command.md | 59 +++ ...generic-schedule-time-range-set-command.md | 196 +++++++ ...generic-schedule-time-range-get-command.md | 29 ++ ...eric-schedule-time-range-report-command.md | 54 ++ .../01.01.06-generic-schedule-set-command.md | 109 ++++ .../01.01.07-generic-schedule-get-command.md | 29 ++ ...1.01.08-generic-schedule-report-command.md | 61 +++ .../04.43.01-terminology.md | 16 + ...4.43.02-interoperability-considerations.md | 12 + .../index.md | 27 + ...raphic-location-command-class-version-1.md | 63 +++ ...4.45-hrv-status-command-class-version-1.md | 118 +++++ ....46-hrv-control-command-class-version-1.md | 218 ++++++++ ...-control-mode-command-class-version-1-2.md | 114 ++++ ...operating-state-command-class-version-1.md | 51 ++ ...trol-setpoint-command-class-version-1-2.md | 239 +++++++++ ...01-ir-repeater-capabilities-get-command.md | 19 + ...ir-repeater-capabilities-report-command.md | 123 +++++ ...repeater-ir-code-learning-start-command.md | 45 ++ ...-repeater-ir-code-learning-stop-command.md | 21 + ...epeater-ir-code-learning-status-command.md | 38 ++ ...-repeater-learnt-ir-code-remove-command.md | 26 + ...-ir-repeater-learnt-ir-code-get-command.md | 23 + ...-repeater-learnt-ir-code-report-command.md | 37 ++ ...ter-learnt-ir-code-readback-get-command.md | 38 ++ ...-learnt-ir-code-readback-report-command.md | 64 +++ ...1-ir-repeater-configuration-set-command.md | 81 +++ ...2-ir-repeater-configuration-get-command.md | 23 + ...r-repeater-configuration-report-command.md | 29 ++ ...-ir-repeater-repeat-learnt-code-command.md | 24 + .../01.01.15-ir-repeater-repeat-command.md | 135 +++++ .../index.md | 30 ++ .../04.51.01-terminology.md} | 10 +- .../04.51.02-compatibility-considerations.md | 12 + ....51.03-interoperability-considerations.md} | 24 +- ...1.04-irrigation-system-info-get-command.md | 21 + ...-irrigation-system-info-report-command.md} | 24 +- ...06-irrigation-system-status-get-command.md | 21 + ...irrigation-system-status-report-command.md | 142 +++++ ...08-irrigation-system-config-set-command.md | 68 +++ ...09-irrigation-system-config-get-command.md | 21 + ...irrigation-system-config-report-command.md | 27 + ...1.11-irrigation-valve-info-get-command.md} | 28 +- ...2-irrigation-valve-info-report-command.md} | 36 +- ....13-irrigation-valve-config-set-command.md | 116 +++++ ...14-irrigation-valve-config-get-command.md} | 20 +- ...-irrigation-valve-config-report-command.md | 36 ++ .../04.51.16-irrigation-valve-run-command.md | 41 ++ ...1.17-irrigation-valve-table-set-command.md | 39 ++ ....18-irrigation-valve-table-get-command.md} | 18 +- ...9-irrigation-valve-table-report-command.md | 27 + ...1.20-irrigation-valve-table-run-command.md | 24 + ...1.21-irrigation-system-shutoff-command.md} | 26 +- .../index.md | 34 ++ .../04.52-language-command-class-version-1.md | 81 +++ ...lock-command-class-version-1-deprecated.md | 55 ++ ...er-proprietary-command-class-version-1.md} | 30 +- .../04.55-meter-command-class-version-1.md | 87 ++++ .../04.56-meter-command-class-version-2.md | 209 ++++++++ .../04.57-meter-command-class-version-3.md | 104 ++++ .../04.58-meter-command-class-version-4.md | 204 ++++++++ .../04.59-meter-command-class-version-5.md | 143 +++++ .../04.60-meter-command-class-version-6.md | 53 ++ ...e-configuration-command-class-version-1.md | 37 ++ ...eter-table-point-adm-number-get-command.md | 21 + ...r-table-point-adm-number-report-command.md | 21 + .../04.62.03-meter-table-id-get-command.md | 21 + .../04.62.04-meter-table-id-report-command.md | 37 ++ ...2.05-meter-table-capability-get-command.md | 21 + ...6-meter-table-capability-report-command.md | 68 +++ ...eter-table-status-supported-get-command.md | 21 + ...r-table-status-supported-report-command.md | 39 ++ ...09-meter-table-status-depth-get-command.md | 32 ++ ....10-meter-table-status-date-get-command.md | 68 +++ ...62.11-meter-table-status-report-command.md | 88 ++++ ...12-meter-table-current-data-get-command.md | 30 ++ ...meter-table-current-data-report-command.md | 102 ++++ ...meter-table-historical-data-get-command.md | 77 +++ ...er-table-historical-data-report-command.md | 104 ++++ .../index.md | 28 + ...r-table-monitor-command-class-version-2.md | 182 +++++++ ...r-table-monitor-command-class-version-3.md | 18 + ...h-configuration-command-class-version-1.md | 104 ++++ ...ering-command-class-version-1-obsoleted.md | 74 +++ ...ilevel-sensor-command-class-version-1-4.md | 75 +++ ...level-sensor-command-class-version-5-11.md | 316 +++++++++++ ...tilevel-switch-command-class-version-1.md} | 104 ++-- ...tilevel-switch-command-class-version-2.md} | 42 +- ...tilevel-switch-command-class-version-3.md} | 140 +++-- ...tilevel-switch-command-class-version-4.md} | 34 +- ...tch-command-class-version-1-deprecated.md} | 64 +-- .../04.74.01-terminology.md} | 32 +- .../04.74.02-compatibility-considerations.md} | 140 +++-- ....74.03-interoperability-considerations.md} | 18 +- .../04.74.04-notification-set-command.md | 54 ++ .../04.74.05-notification-get-command.md} | 48 +- .../04.74.06-notification-report-command.md | 161 ++++++ ....07-notification-supported-get-command.md} | 16 +- ...8-notification-supported-report-command.md | 47 ++ .../04.74.09-event-supported-get-command.md | 26 + ...04.74.10-event-supported-report-command.md | 52 ++ .../index.md | 29 ++ ...4.75-prepayment-command-class-version-1.md | 143 +++++ ...t-encapsulation-command-class-version-1.md | 26 + ...tary-command-class-version-1-deprecated.md | 64 +++ ...4.78-protection-command-class-version-1.md | 61 +++ ...4.79-protection-command-class-version-2.md | 210 ++++++++ ...eter-command-class-version-1-deprecated.md | 44 ++ ...-configuration-command-class-version-1.md} | 76 +-- ...e-table-monitor-command-class-version-1.md | 392 ++++++++++++++ ...cene-activation-command-class-version-1.md | 52 ++ ...r-configuration-command-class-version-1.md | 123 +++++ ...-configuration-command-class-version-1.md} | 64 +-- .../04.86.01-terminology.md} | 36 +- ....86.02-interoperability-considerations.md} | 22 +- ...04.86.03-schedule-supported-get-command.md | 21 + ...6.04-schedule-supported-report-command.md} | 110 ++-- .../04.86.05-schedule-set-command.md} | 148 +++--- .../04.86.06-schedule-get-command.md | 26 + .../04.86.07-schedule-report-command.md | 60 +++ .../04.86.08-schedule-remove-command.md} | 18 +- .../04.86.09-schedule-state-set-command.md} | 24 +- .../04.86.10-schedule-state-get-command.md | 21 + .../04.86.11-schedule-state-report-command.md | 65 +++ .../index.md | 24 + .../04.87-schedule-command-class-version-2.md | 325 ++++++++++++ .../04.88-schedule-command-class-version-3.md | 276 ++++++++++ .../04.89-schedule-command-class-version-4.md | 275 ++++++++++ ...ock-command-class-version-1-deprecated.md} | 248 ++++----- ...ock-command-class-version-2-deprecated.md} | 58 +-- ...ock-command-class-version-3-deprecated.md} | 114 ++-- ...reen-attributes-command-class-version-1.md | 65 +++ ...reen-attributes-command-class-version-2.md | 54 ++ ...creen-meta-data-command-class-version-1.md | 141 +++++ ...creen-meta-data-command-class-version-2.md | 101 ++++ ...tion-command-class-version-1-obsoleted.md} | 80 +-- ...le-av-control-command-class-version-1-4.md | 136 +++++ ...99-sound-switch-command-class-version-1.md | 275 ++++++++++ .../04-command-class-definitions/index.md | 130 +++++ .../assets/img-04d8f2ead1.png | Bin 0 -> 49843 bytes .../assets/img-078228618f.png | Bin 0 -> 164540 bytes .../assets/img-0d643251a7.png | Bin 0 -> 34666 bytes .../assets/img-10ce66b311.png | Bin .../assets/img-13ece31554.png | Bin .../assets/img-17ed9bdd33.png | Bin .../assets/img-1f27ee63d2.png | Bin .../assets/img-21f86f8019.png | Bin 0 -> 126180 bytes .../assets/img-2ed45acc64.png | Bin .../assets/img-5494f2b277.jpeg | Bin 0 -> 72548 bytes .../assets/img-5c95fb2a15.png | Bin 0 -> 2052 bytes .../assets/img-6620b1beac.png | Bin 0 -> 2377 bytes .../assets/img-6c1e53b1c3.png | Bin 0 -> 85524 bytes .../assets/img-6ceb291c6e.png | Bin .../assets/img-73381c079f.png | Bin .../assets/img-799e562cbe.png | Bin 0 -> 187655 bytes .../assets/img-8101ef46fc.png | Bin 0 -> 1983 bytes .../assets/img-81079508de.jpeg | Bin 0 -> 66164 bytes .../assets/img-817f13d4ec.png | Bin 0 -> 1847 bytes .../assets/img-83fe32ab3f.png | Bin 0 -> 65695 bytes .../assets/img-90f32b94b4.png | Bin 0 -> 2062 bytes .../assets/img-a5a0d9d7be.png | Bin .../assets/img-a6f1afb4ac.png | Bin 0 -> 2037 bytes .../assets/img-b391b0ae58.png | Bin 0 -> 1849 bytes .../assets/img-be382647c3.png | Bin .../assets/img-c52ce0b218.png | Bin .../assets/img-c7049c3f45.png | Bin 0 -> 2516 bytes .../assets/img-cc3757bf06.png | Bin 0 -> 2075 bytes .../assets/img-d3b9d2ea2d.png | Bin 0 -> 2273 bytes .../assets/img-daecc43c03.png | Bin 0 -> 122048 bytes .../assets/img-db9abf0d3d.png | Bin .../assets/img-dcd97ada58.jpeg | Bin 0 -> 73289 bytes .../assets/img-de17561660.png | Bin .../assets/img-e7a467d482.png | Bin 0 -> 21168 bytes .../assets/img-f586b8bafd.png | Bin .../assets/img-fb25e9706c.png | Bin .../assets/img-fd30697c72.png | Bin 0 -> 201092 bytes .../index.md | 9 +- .../01-abbreviations.md | 34 -- .../03.01-overview.md | 10 - .../03.02-command-class-format.md | 77 --- .../03.04-node-information-frame.md | 134 ----- .../03.07-common-fields-and-encoding.md | 136 ----- ...witch-command-class-version-1-obsoleted.md | 81 --- ...4-alarm-silence-command-class-version-1.md | 51 -- ...arrier-operator-command-class-version-1.md | 210 -------- ...ering-command-class-version-1-obsoleted.md | 43 -- ...rmostat-setback-command-class-version-1.md | 84 --- ...stat-setpoint-command-class-version-1-2.md | 151 ------ ...mostat-setpoint-command-class-version-3.md | 260 --------- .../04.103-time-command-class-version-1.md | 115 ---- .../04.104-time-command-class-version-2.md | 131 ----- ...time-parameters-command-class-version-1.md | 81 --- ...4.106-user-code-command-class-version-1.md | 134 ----- ...window-covering-command-class-version-1.md | 381 -------------- ...1-binary-switch-command-class-version-1.md | 77 --- ...2-binary-switch-command-class-version-2.md | 65 --- ...witch-command-class-version-1-obsoleted.md | 50 -- ...dule-command-class-version-1-deprecated.md | 234 --------- ...scene-command-class-version-2-obsoleted.md | 113 ---- .../04.18-clock-command-class-version-1.md | 82 --- ...19-color-switch-command-class-version-1.md | 218 -------- ...20-color-switch-command-class-version-2.md | 76 --- ...2-configuration-command-class-version-1.md | 118 ----- ...3-configuration-command-class-version-2.md | 237 --------- ...5-configuration-command-class-version-4.md | 205 -------- ...ler-replication-command-class-version-1.md | 115 ---- ...ol-plan-monitor-command-class-version-1.md | 124 ----- ....29-door-lock-command-class-version-1-2.md | 277 ---------- ...04.30-door-lock-command-class-version-3.md | 54 -- ...or-lock-logging-command-class-version-1.md | 171 ------ ...ergy-production-command-class-version-1.md | 79 --- ...raphic-location-command-class-version-1.md | 59 --- ...4.35-hrv-status-command-class-version-1.md | 118 ----- ....36-hrv-control-command-class-version-1.md | 212 -------- ...ty-control-mode-command-class-version-1.md | 110 ---- ...operating-state-command-class-version-1.md | 51 -- ...ontrol-setpoint-command-class-version-1.md | 237 --------- ...04.40-indicator-command-class-version-1.md | 53 -- ...04.41-indicator-command-class-version-2.md | 298 ----------- .../04.42.02-compatibility-considerations.md | 12 - ...2.04-irrigation-system-info-get-command.md | 19 - ...06-irrigation-system-status-get-command.md | 19 - ...irrigation-system-status-report-command.md | 136 ----- ...08-irrigation-system-config-set-command.md | 68 --- ...09-irrigation-system-config-get-command.md | 19 - ...irrigation-system-config-report-command.md | 27 - ....13-irrigation-valve-config-set-command.md | 108 ---- ...-irrigation-valve-config-report-command.md | 34 -- .../04.42.16-irrigation-valve-run-command.md | 43 -- ...2.17-irrigation-valve-table-set-command.md | 39 -- ...9-irrigation-valve-table-report-command.md | 25 - ...2.20-irrigation-valve-table-run-command.md | 24 - .../index.md | 34 -- .../04.43-language-command-class-version-1.md | 81 --- ...lock-command-class-version-1-deprecated.md | 55 -- .../04.46-meter-command-class-version-1.md | 93 ---- .../04.47-meter-command-class-version-2.md | 246 --------- .../04.48-meter-command-class-version-3.md | 186 ------- .../04.49-meter-command-class-version-4.md | 216 -------- .../04.50-meter-command-class-version-5.md | 146 ------ ...e-configuration-command-class-version-1.md | 37 -- ...eter-table-point-adm-number-get-command.md | 19 - ...r-table-point-adm-number-report-command.md | 21 - .../04.52.03-meter-table-id-get-command.md | 19 - .../04.52.04-meter-table-id-report-command.md | 31 -- ...2.05-meter-table-capability-get-command.md | 19 - ...6-meter-table-capability-report-command.md | 145 ------ ...eter-table-status-supported-get-command.md | 19 - ...r-table-status-supported-report-command.md | 59 --- ...09-meter-table-status-depth-get-command.md | 24 - ....10-meter-table-status-date-get-command.md | 62 --- ...52.11-meter-table-status-report-command.md | 74 --- ...12-meter-table-current-data-get-command.md | 26 - ...meter-table-current-data-report-command.md | 135 ----- ...meter-table-historical-data-get-command.md | 69 --- ...er-table-historical-data-report-command.md | 88 ---- .../index.md | 28 - ...eter-table-point-adm-number-get-command.md | 19 - ...r-table-point-adm-number-report-command.md | 23 - .../04.53.03-meter-table-id-get-command.md | 19 - .../04.53.04-meter-table-id-report-command.md | 33 -- ...3.05-meter-table-capability-get-command.md | 19 - ...6-meter-table-capability-report-command.md | 60 --- ...eter-table-status-supported-get-command.md | 19 - ...r-table-status-supported-report-command.md | 27 - ...09-meter-table-status-depth-get-command.md | 24 - ....10-meter-table-status-date-get-command.md | 62 --- ...53.11-meter-table-status-report-command.md | 78 --- ...12-meter-table-current-data-get-command.md | 26 - ...meter-table-current-data-report-command.md | 96 ---- ...meter-table-historical-data-get-command.md | 69 --- ...er-table-historical-data-report-command.md | 96 ---- .../index.md | 28 - ...h-configuration-command-class-version-1.md | 104 ---- ...ering-command-class-version-1-obsoleted.md | 74 --- ...ilevel-sensor-command-class-version-1-4.md | 69 --- ...level-sensor-command-class-version-5-11.md | 312 ----------- .../04.63.04-notification-set-command.md | 54 -- .../04.63.06-notification-report-command.md | 157 ------ ...8-notification-supported-report-command.md | 39 -- .../04.63.09-event-supported-get-command.md | 26 - ...04.63.10-event-supported-report-command.md | 44 -- .../04.63.11-controller-guidelines.md | 114 ---- .../index.md | 30 -- ...4.64-prepayment-command-class-version-1.md | 141 ----- ...t-encapsulation-command-class-version-1.md | 26 - ...tary-command-class-version-1-deprecated.md | 66 --- ...4.67-protection-command-class-version-1.md | 63 --- ...4.68-protection-command-class-version-2.md | 214 -------- ...eter-command-class-version-1-deprecated.md | 44 -- ...e-table-monitor-command-class-version-1.md | 396 -------------- ...cene-activation-command-class-version-1.md | 50 -- ...r-configuration-command-class-version-1.md | 119 ----- ...04.75.03-schedule-supported-get-command.md | 19 - .../04.75.06-schedule-get-command.md | 24 - .../04.75.07-schedule-report-command.md | 60 --- .../04.75.10-schedule-state-get-command.md | 19 - .../04.75.11-schedule-state-report-command.md | 65 --- .../index.md | 24 - .../04.76-schedule-command-class-version-2.md | 315 ----------- .../04.77-schedule-command-class-version-3.md | 274 ---------- .../04.78-schedule-command-class-version-4.md | 265 ---------- ...reen-attributes-command-class-version-1.md | 65 --- ...reen-attributes-command-class-version-2.md | 54 -- ...creen-meta-data-command-class-version-1.md | 141 ----- ...creen-meta-data-command-class-version-2.md | 103 ---- ...le-av-control-command-class-version-1-4.md | 130 ----- ...88-sound-switch-command-class-version-1.md | 255 --------- ...e-configuration-command-class-version-1.md | 165 ------ ...f-table-monitor-command-class-version-1.md | 235 --------- ...mostat-fan-mode-command-class-version-2.md | 52 -- ...tat-fan-state-command-class-version-1-2.md | 67 --- ...ermostat-mode-command-class-version-1-2.md | 112 ---- ...thermostat-mode-command-class-version-3.md | 157 ------ ...operating-state-command-class-version-1.md | 41 -- ...operating-state-command-class-version-2.md | 153 ------ .../04-command-class-definitions/index.md | 124 ----- .../assets/img-031d09cc57.jpeg | Bin 70705 -> 0 bytes .../assets/img-0546536017.png | Bin 19503 -> 0 bytes .../assets/img-0d25374112.png | Bin 2238 -> 0 bytes .../assets/img-0f5e748af7.png | Bin 16082 -> 0 bytes .../assets/img-234b052b98.png | Bin 2706 -> 0 bytes .../assets/img-2f5fb50cdf.png | Bin 280 -> 0 bytes .../assets/img-41477511d5.png | Bin 27969 -> 0 bytes .../assets/img-5e2a35351b.png | Bin 19288 -> 0 bytes .../assets/img-68e758a97d.png | Bin 20982 -> 0 bytes .../assets/img-762e99613e.png | Bin 1968 -> 0 bytes .../assets/img-7e17d638c6.png | Bin 38699 -> 0 bytes .../assets/img-8ec64d3ea0.jpeg | Bin 21594 -> 0 bytes .../assets/img-91ca87aebd.png | Bin 2480 -> 0 bytes .../assets/img-95385a795f.png | Bin 1841 -> 0 bytes .../assets/img-9c7dfcaef5.png | Bin 37976 -> 0 bytes .../assets/img-9fde74cbd0.jpeg | Bin 73045 -> 0 bytes .../assets/img-ac16ca2e4f.png | Bin 22399 -> 0 bytes .../assets/img-b897b5e07d.png | Bin 2109 -> 0 bytes .../assets/img-bda7a771b4.jpeg | Bin 65012 -> 0 bytes .../assets/img-ec0eea3305.png | Bin 25677 -> 0 bytes .../assets/img-ec65ec745a.png | Bin 2233 -> 0 bytes .../assets/img-f5af822b72.png | Bin 2068 -> 0 bytes .../assets/img-f87775eaf2.png | Bin 33507 -> 0 bytes .../assets/img-f8baa4593b.png | Bin 2244 -> 0 bytes .../assets/img-f94675db5a.png | Bin 13860 -> 0 bytes .../assets/img-fbc9bfea32.png | Bin 1902 -> 0 bytes .../01-abbreviations.md | 31 ++ .../02.01-precedence-of-definitions.md | 10 + .../02.02-terms-used-in-this-document.md | 26 + .../02-introduction/index.md | 21 + .../03-command-class-overview.md | 14 + ...ility-command-class-version-1-obsoleted.md | 72 +++ ...lication-status-command-class-version-1.md | 59 +++ ....03-association-command-class-version-1.md | 204 ++++++++ ....04-association-command-class-version-2.md | 125 +++++ ....05-association-command-class-version-3.md | 36 ++ ...d-configuration-command-class-version-1.md | 239 +++++++++ .../04.07.01-compatibility-considerations.md | 16 + .../04.07.02-association-principles.md | 18 + ...07.03-the-association-group-information.md | 178 +++++++ .../04.07.04-association-group-name-get.md | 28 + .../04.07.05-association-group-name-report.md | 36 ++ .../04.07.06-association-group-info-get.md | 51 ++ .../04.07.07-association-group-info-report.md | 77 +++ ...7.08-association-group-command-list-get.md | 41 ++ ...9-association-group-command-list-report.md | 42 ++ .../index.md | 26 + ...information-agi-command-class-version-2.md | 84 +++ ...information-agi-command-class-version-3.md | 67 +++ .../04.10-battery-command-class-version-1.md | 43 ++ .../04.11-battery-command-class-version-2.md | 189 +++++++ .../04.12-battery-command-class-version-3.md | 36 ++ ...e-reset-locally-command-class-version-1.md | 29 ++ ...data-command-class-version-1-deprecated.md | 251 +++++++++ ...pdate-meta-data-command-class-version-2.md | 74 +++ ...pdate-meta-data-command-class-version-3.md | 333 ++++++++++++ ...pdate-meta-data-command-class-version-4.md | 162 ++++++ ...pdate-meta-data-command-class-version-5.md | 405 ++++++++++++++ ...pdate-meta-data-command-class-version-6.md | 91 ++++ ...pdate-meta-data-command-class-version-7.md | 90 ++++ ...name-command-class-version-1-deprecated.md | 108 ++++ ...-hail-command-class-version-1-obsoleted.md | 25 + ...04.23-indicator-command-class-version-1.md | 77 +++ ...04.24-indicator-command-class-version-2.md | 263 ++++++++++ ...04.25-indicator-command-class-version-3.md | 20 + ...04.26-indicator-command-class-version-4.md | 82 +++ ...-ip-association-command-class-version-1.md | 217 ++++++++ ...cturer-specific-command-class-version-1.md | 74 +++ ...cturer-specific-command-class-version-2.md | 86 +++ ...ation-command-class-version-1-obsoleted.md | 14 + .../04.31.01-compatibility-considerations.md | 46 ++ .../04.31.02-z-wave-plus-considerations.md | 14 + .../04.31.03-security-considerations.md | 16 + ...4-multi-channel-association-set-command.md | 69 +++ ...5-multi-channel-association-get-command.md | 28 + ...ulti-channel-association-report-command.md | 61 +++ ...ulti-channel-association-remove-command.md | 321 ++++++++++++ ...ciation-supported-groupings-get-command.md | 21 + ...tion-supported-groupings-report-command.md | 28 + .../index.md | 28 + ...nel-association-command-class-version-3.md | 134 +++++ ...nel-association-command-class-version-4.md | 20 + ...ng-and-location-command-class-version-1.md | 162 ++++++ ...ation-command-class-version-1-obsoleted.md | 62 +++ ...ation-command-class-version-1-obsoleted.md | 120 +++++ .../04.37-time-command-class-version-1.md | 139 +++++ .../04.38-time-command-class-version-2.md | 165 ++++++ ...time-parameters-command-class-version-1.md | 83 +++ .../04.40-version-command-class-version-1.md | 150 ++++++ .../04.41-version-command-class-version-2.md | 103 ++++ .../04.42-version-command-class-version-3.md | 204 ++++++++ .../04.43-wake-up-command-class-version-1.md | 131 +++++ .../04.44-wake-up-command-class-version-2.md | 131 +++++ .../04.45-wake-up-command-class-version-3.md | 56 ++ ...ng-and-location-command-class-version-1.md | 148 ++++++ ...-info-command-class-version-1-obsoleted.md | 14 + ...-wave-plus-info-command-class-version-2.md | 272 ++++++++++ .../04-command-class-definitions/index.md | 63 +++ .../assets/img-02b3ab2b70.png | Bin 0 -> 62086 bytes .../assets/img-037dc24bd9.png | Bin 0 -> 4786 bytes .../assets/img-3049bc51b8.png | Bin 0 -> 6852 bytes .../assets/img-4af5a8dd67.png | Bin 0 -> 1720 bytes .../assets/img-5494f2b277.jpeg | Bin 0 -> 72548 bytes .../assets/img-552a3c0bfc.png | Bin 0 -> 14002 bytes .../assets/img-671e4cdb38.png | Bin 0 -> 6995 bytes .../assets/img-696723cfa7.png | Bin 0 -> 42990 bytes .../assets/img-75c2215cbb.png | Bin 0 -> 122434 bytes .../assets/img-81079508de.jpeg | Bin 0 -> 66164 bytes .../assets/img-841ee8d357.png | Bin 0 -> 5585 bytes .../assets/img-87cfd2782b.png | Bin 0 -> 35665 bytes .../assets/img-8d4107a922.png | Bin 0 -> 1909 bytes .../assets/img-9d7166209e.png | Bin 0 -> 5566 bytes .../assets/img-a1d7c27be6.png | Bin 0 -> 21576 bytes .../assets/img-b3a995113e.png | Bin 0 -> 7260 bytes .../assets/img-c30a527f05.png | Bin 0 -> 5986 bytes .../assets/img-c40eec3abf.png | Bin 0 -> 6525 bytes .../assets/img-cc66c4e9cc.png | Bin 0 -> 2473 bytes .../assets/img-d93c722ca1.png | Bin 0 -> 14740 bytes .../assets/img-dcd97ada58.jpeg | Bin 0 -> 73289 bytes .../index.md | 19 + .../01-abbreviations.md | 29 ++ .../02.01-precedence-of-definitions.md | 10 + .../02.02-terms-used-in-this-document.md | 26 + .../02-introduction/index.md | 25 + .../03-command-class-overview.md | 14 + ...sion-controller-command-class-version-1.md | 125 +++++ ...ation-command-class-version-1-obsoleted.md | 169 ++++++ .../04.03-mailbox-command-class-version-1.md | 274 ++++++++++ .../04.04-mailbox-command-class-version-2.md | 30 ++ .../04.05.01-compatibility-considerations.md | 51 ++ .../04.05.02-scope-of-network-management.md | 32 ++ .../04.05.03-security-considerations.md | 34 ++ ...anagement-proxy-command-class-version-1.md | 222 ++++++++ ...anagement-proxy-command-class-version-2.md | 277 ++++++++++ ...anagement-proxy-command-class-version-3.md | 67 +++ ...ment-basic-node-command-class-version-1.md | 251 +++++++++ ...ment-basic-node-command-class-version-2.md | 172 ++++++ .../04.05.09.01-node-add-command.md | 68 +++ .../04.05.09.02-node-add-status-command.md | 88 ++++ .../04.05.09.03-node-remove-command.md | 47 ++ .../04.05.09.04-node-remove-status-command.md | 37 ++ .../04.05.09.05-failed-node-remove-command.md | 33 ++ ...09.06-failed-node-remove-status-command.md | 42 ++ ...04.05.09.07-failed-node-replace-command.md | 55 ++ ...9.08-failed-node-replace-status-command.md | 44 ++ ...09-node-neighbor-update-request-command.md | 29 ++ ....10-node-neighbor-update-status-command.md | 32 ++ ...04.05.09.11-return-route-assign-command.md | 38 ++ ...12-return-route-assign-complete-command.md | 38 ++ ...04.05.09.13-return-route-delete-command.md | 31 ++ ...14-return-route-delete-complete-command.md | 35 ++ .../04.05.09.15-use-cases-and-frame-flows.md | 16 + .../index.md | 28 + ...ement-inclusion-command-class-version-2.md | 362 +++++++++++++ ...ement-inclusion-command-class-version-3.md | 178 +++++++ ...imary-command-class-version-1-obsoleted.md | 94 ++++ ...and-maintenance-command-class-version-1.md | 345 ++++++++++++ ...and-maintenance-command-class-version-2.md | 68 +++ .../index.md | 25 + ...06-no-operation-command-class-version-1.md | 18 + ...de-provisioning-command-class-version-1.md | 335 ++++++++++++ ...4.08-powerlevel-command-class-version-1.md | 183 +++++++ ...9-zip-command-class-version-1-obsoleted.md | 12 + .../04.10-zip-command-class-version-2.md | 381 ++++++++++++++ .../04.11-zip-command-class-version-3.md | 34 ++ .../04.12-zip-command-class-version-4.md | 456 ++++++++++++++++ ....13-zip-6lowpan-command-class-version-1.md | 14 + ....14-zip-gateway-command-class-version-1.md | 363 +++++++++++++ .../04.15-zip-nd-command-class-version-1.md | 156 ++++++ ...4.16-zip-portal-command-class-version-1.md | 223 ++++++++ .../04-command-class-definitions/index.md | 31 ++ .../assets/img-08e1758c21.png | Bin 0 -> 24662 bytes .../assets/img-13d59fa9bc.png | Bin 0 -> 25002 bytes .../assets/img-2674b78219.png | Bin 0 -> 23736 bytes .../assets/img-2bd7dd5ad6.png | Bin 0 -> 41877 bytes .../assets/img-3c34ebebda.png | Bin 0 -> 23863 bytes .../assets/img-5f06f48277.png | Bin 0 -> 16809 bytes .../assets/img-663fb7b675.png | Bin 0 -> 23653 bytes .../assets/img-69a524a802.png | Bin 0 -> 17223 bytes .../assets/img-8948947f8d.png | Bin 0 -> 15636 bytes .../assets/img-a5a5560659.png | Bin 0 -> 45571 bytes .../assets/img-aacefd1a94.png | Bin 0 -> 34669 bytes .../assets/img-b56b7d57c5.png | Bin 0 -> 26950 bytes .../assets/img-bf6af05d2a.png | Bin 0 -> 23522 bytes .../assets/img-c95b8ef8eb.png | Bin 0 -> 53916 bytes .../assets/img-d4d26891f2.png | Bin 0 -> 18924 bytes .../assets/img-d9e53f1b09.png | Bin 0 -> 24176 bytes .../assets/img-dde52d6732.png | Bin 0 -> 26830 bytes .../assets/img-efd36376f2.png | Bin 0 -> 19846 bytes .../assets/img-f5c5271e57.png | Bin 0 -> 22237 bytes .../assets/img-fa2278fdcf.png | Bin 0 -> 54050 bytes .../index.md | 20 + ...pplication Command Class Specification.pdf | Bin 0 -> 132 bytes ...pplication Command Class Specification.pdf | Bin 132 -> 0 bytes ...Management Command Class Specification.pdf | Bin 0 -> 132 bytes ...apsulation Command Class Specification.pdf | Bin 0 -> 132 bytes ...k-Protocol Command Class Specification.pdf | Bin 0 -> 132 bytes .../01.01-precedence-of-definitions.md | 10 + .../01.02-terms-used-in-this-document.md | 26 + .../01-introduction/index.md | 21 + .../02-command-class-overview.md | 110 ++++ ...tion-command-class-version-1-deprecated.md | 93 ++++ ...2-multi-channel-command-class-version-3.md | 363 +++++++++++++ ...3-multi-channel-command-class-version-4.md | 168 ++++++ ...4-multi-command-command-class-version-1.md | 105 ++++ .../03.05.01.01-node-information-frame-nif.md | 18 + ...ncapsulation-and-command-class-handling.md | 164 ++++++ .../03.05.03-network-key-management.md | 192 +++++++ ....04-encapsulated-command-class-handling.md | 132 +++++ .../index.md | 29 ++ .../03.06.01-compatibility-considerations.md | 48 ++ .../03.06.02-security-considerations.md | 56 ++ ...3.06.03-interoperability-considerations.md | 22 + .../03.06.04-building-blocks.md | 225 ++++++++ ...singlecast-messages-and-span-management.md | 117 +++++ ...-multicast-messages-and-mpan-management.md | 105 ++++ ...06.05.03-message-encapsulation-commands.md | 359 +++++++++++++ ...03.06.05.04-duplicate-message-detection.md | 18 + .../03.06.05-message-encapsulation/index.md | 21 + .../03.06.06-key-management.md | 173 ++++++ ....06.07-security-2-key-exchange-commands.md | 366 +++++++++++++ ...overy-of-security-capabilities-commands.md | 73 +++ .../index.md | 43 ++ ....07-supervision-command-class-version-1.md | 308 +++++++++++ ...rvice-command-class-version-1-obsoleted.md | 16 + ...ansport-service-command-class-version-2.md | 60 +++ .../03-command-class-definitions/index.md | 24 + .../assets/img-045fd7a7ed.png | Bin 0 -> 27252 bytes .../assets/img-123e637c00.png | Bin 0 -> 16831 bytes .../assets/img-285090a1bd.png | Bin 0 -> 32406 bytes .../assets/img-29b570937a.png | Bin 0 -> 8662 bytes .../assets/img-36b617071e.png | Bin 0 -> 18457 bytes .../assets/img-3fac2a3dd4.png | Bin 0 -> 14033 bytes .../assets/img-6b099bd97c.png | Bin 0 -> 20032 bytes .../assets/img-6bc5fe3a93.png | Bin 0 -> 18580 bytes .../assets/img-84047b67e4.png | Bin 0 -> 29710 bytes .../assets/img-92a5ed76bb.jpeg | Bin 0 -> 180587 bytes .../assets/img-a07fdefe45.png | Bin 0 -> 9041 bytes .../assets/img-b3dd9dc140.png | Bin 0 -> 28766 bytes .../assets/img-ca9f3d2bed.png | Bin 0 -> 7557 bytes .../assets/img-d7e3def9cd.png | Bin 0 -> 46691 bytes .../assets/img-ddbea20c31.png | Bin 0 -> 56156 bytes .../assets/img-e3186d280e.png | Bin 0 -> 105286 bytes .../index.md | 19 + tools/pdf2md/convert.ps1 | 5 +- 667 files changed, 34850 insertions(+), 15705 deletions(-) create mode 100644 docs/specs/application-command-class-specification/01-abbreviations.md rename docs/specs/{command-class-specification => application-command-class-specification}/02-introduction/02.01-precedence-of-definitions.md (84%) rename docs/specs/{command-class-specification => application-command-class-specification}/02-introduction/02.02-terms-used-in-this-document.md (84%) rename docs/specs/{command-class-specification => application-command-class-specification}/02-introduction/index.md (54%) create mode 100644 docs/specs/application-command-class-specification/03-command-class-overview/03.01-overview.md create mode 100644 docs/specs/application-command-class-specification/03-command-class-overview/03.02-command-class-format.md rename docs/specs/{command-class-specification => application-command-class-specification}/03-command-class-overview/03.03-controlled-and-supported-command-classes.md (81%) create mode 100644 docs/specs/application-command-class-specification/03-command-class-overview/03.04-node-information-frame.md rename docs/specs/{command-class-specification => application-command-class-specification}/03-command-class-overview/03.05-multicast-and-broadcast-commands.md (90%) rename docs/specs/{command-class-specification => application-command-class-specification}/03-command-class-overview/03.06-actuator-control.md (73%) create mode 100644 docs/specs/application-command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md rename docs/specs/{command-class-specification => application-command-class-specification}/03-command-class-overview/index.md (89%) rename docs/specs/{command-class-specification => application-command-class-specification}/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md (51%) rename docs/specs/{command-class-specification => application-command-class-specification}/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md (54%) rename docs/specs/{command-class-specification => application-command-class-specification}/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md (61%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.05-all-switch-command-class-version-1-obsoleted.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.02-anti-theft-command-class-version-1-obsoleted.md => application-command-class-specification/04-command-class-definitions/04.06-anti-theft-command-class-version-1-obsoleted.md} (82%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.03-anti-theft-command-class-version-2.md => application-command-class-specification/04-command-class-definitions/04.07-anti-theft-command-class-version-2-deprecated.md} (55%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.08-anti-theft-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.09-anti-theft-unlock-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.01-terminology.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.02-interoperability-considerations.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.03-authentication-capability-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.04-authentication-capability-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.05-authentication-data-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.06-authentication-data-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.07-authentication-data-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.08-authentication-technologies-combination-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.09-authentication-technologies-combination-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.10-authentication-technologies-combination-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.11-authentication-checksum-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.12-authentication-checksum-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.13-examples-and-use-cases.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.100-sound-switch-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.101-tariff-table-configuration-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.102-tariff-table-monitor-command-class-version-1.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.91-thermostat-fan-mode-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.103-thermostat-fan-mode-command-class-version-1.md} (51%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.104-thermostat-fan-mode-command-class-version-2.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.93-thermostat-fan-mode-command-class-version-3.md => application-command-class-specification/04-command-class-definitions/04.105-thermostat-fan-mode-command-class-version-3.md} (53%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.94-thermostat-fan-mode-command-class-version-4.md => application-command-class-specification/04-command-class-definitions/04.106-thermostat-fan-mode-command-class-version-4-5.md} (54%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.107-thermostat-fan-state-command-class-version-1-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.108-thermostat-mode-command-class-version-1-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.109-thermostat-mode-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.11-authentication-media-write-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.110-thermostat-operating-state-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.111-thermostat-operating-state-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.112-thermostat-setback-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.113-thermostat-setpoint-command-class-version-1-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.114-thermostat-setpoint-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.115-user-code-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.01-terminology.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.02-compatibility-considerations.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.03-interoperability-considerations.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.04-security-considerations.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.05-user-code-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.06-users-number-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.07-user-code-capabilities-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.08-user-code-capabilities-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.09-user-code-keypad-mode-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.10-user-code-keypad-mode-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.11-user-code-keypad-mode-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.12-extended-user-code-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.13-extended-user-code-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.14-extended-user-code-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.15-master-code-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.16-master-code-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.17-master-code-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.18-user-code-checksum-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.19-user-code-checksum-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.117-window-covering-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.12-barrier-operator-command-class-version-1.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.05-basic-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.13-basic-command-class-version-1.md} (51%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.06-basic-command-class-version-2.md => application-command-class-specification/04-command-class-definitions/04.14-basic-command-class-version-2.md} (59%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.07-basic-tariff-information-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.15-basic-tariff-information-command-class-version-1.md} (60%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.16-basic-window-covering-command-class-version-1-obsoleted.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.09-binary-sensor-command-class-version-1-deprecated.md => application-command-class-specification/04-command-class-definitions/04.17-binary-sensor-command-class-version-1-deprecated.md} (51%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.10-binary-sensor-command-class-version-2-deprecated.md => application-command-class-specification/04-command-class-definitions/04.18-binary-sensor-command-class-version-2-deprecated.md} (52%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.19-binary-switch-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.20-binary-switch-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.21-binary-toggle-switch-command-class-version-1-obsoleted.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.15-central-scene-command-class-version-1-obsoleted.md => application-command-class-specification/04-command-class-definitions/04.22-central-scene-command-class-version-1-obsoleted.md} (66%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.23-central-scene-command-class-version-2-obsoleted.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.17-central-scene-command-class-version-3.md => application-command-class-specification/04-command-class-definitions/04.24-central-scene-command-class-version-3.md} (55%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.25-climate-control-schedule-command-class-version-1-deprecated.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.26-clock-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.27-color-switch-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.28-color-switch-command-class-version-2.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.21-color-switch-command-class-version-3.md => application-command-class-specification/04-command-class-definitions/04.29-color-switch-command-class-version-3.md} (52%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.30-configuration-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.31-configuration-command-class-version-2.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.24-configuration-command-class-version-3.md => application-command-class-specification/04-command-class-definitions/04.32-configuration-command-class-version-3.md} (53%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.33-configuration-command-class-version-4.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.34-controller-replication-command-class-version-1.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.27-demand-control-plan-configuration-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.35-demand-control-plan-configuration-command-class-version-1.md} (55%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.36-demand-control-plan-monitor-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.37-door-lock-command-class-version-1-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.38-door-lock-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.39-door-lock-command-class-version-4.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.40-door-lock-logging-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.41-energy-production-command-class-version-1.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.33-entry-control-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.42-entry-control-command-class-version-1.md} (55%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.01-generic-schedule-capabilities-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.02-generic-schedule-capabilities-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.03-generic-schedule-time-range-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.04-generic-schedule-time-range-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.05-generic-schedule-time-range-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.06-generic-schedule-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.07-generic-schedule-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.08-generic-schedule-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.01-terminology.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.02-interoperability-considerations.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.44-geographic-location-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.45-hrv-status-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.46-hrv-control-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.47-humidity-control-mode-command-class-version-1-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.48-humidity-control-operating-state-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.49-humidity-control-setpoint-command-class-version-1-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.01-ir-repeater-capabilities-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.02-ir-repeater-capabilities-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.03-ir-repeater-ir-code-learning-start-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.04-ir-repeater-ir-code-learning-stop-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.05-ir-repeater-ir-code-learning-status-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.06-ir-repeater-learnt-ir-code-remove-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.07-ir-repeater-learnt-ir-code-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.08-ir-repeater-learnt-ir-code-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.09-ir-repeater-learnt-ir-code-readback-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.10-ir-repeater-learnt-ir-code-readback-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.11-ir-repeater-configuration-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.12-ir-repeater-configuration-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.13-ir-repeater-configuration-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.14-ir-repeater-repeat-learnt-code-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.15-ir-repeater-repeat-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/index.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.01-terminology.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.01-terminology.md} (87%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.02-compatibility-considerations.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.03-interoperability-considerations.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.03-interoperability-considerations.md} (56%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.04-irrigation-system-info-get-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.05-irrigation-system-info-report-command.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.05-irrigation-system-info-report-command.md} (59%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.06-irrigation-system-status-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.07-irrigation-system-status-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.08-irrigation-system-config-set-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.09-irrigation-system-config-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.10-irrigation-system-config-report-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.11-irrigation-valve-info-get-command.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.11-irrigation-valve-info-get-command.md} (56%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.12-irrigation-valve-info-report-command.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.12-irrigation-valve-info-report-command.md} (63%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.13-irrigation-valve-config-set-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.14-irrigation-valve-config-get-command.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.14-irrigation-valve-config-get-command.md} (69%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.15-irrigation-valve-config-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.16-irrigation-valve-run-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.17-irrigation-valve-table-set-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.18-irrigation-valve-table-get-command.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.18-irrigation-valve-table-get-command.md} (57%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.19-irrigation-valve-table-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.20-irrigation-valve-table-run-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.21-irrigation-system-shutoff-command.md => application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.21-irrigation-system-shutoff-command.md} (53%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.52-language-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.53-lock-command-class-version-1-deprecated.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.45-manufacturer-proprietary-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.54-manufacturer-proprietary-command-class-version-1.md} (61%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.55-meter-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.56-meter-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.57-meter-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.58-meter-command-class-version-4.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.59-meter-command-class-version-5.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.60-meter-command-class-version-6.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.61-meter-table-configuration-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.01-meter-table-point-adm-number-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.02-meter-table-point-adm-number-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.03-meter-table-id-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.04-meter-table-id-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.05-meter-table-capability-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.06-meter-table-capability-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.07-meter-table-status-supported-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.08-meter-table-status-supported-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.09-meter-table-status-depth-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.10-meter-table-status-date-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.11-meter-table-status-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.12-meter-table-current-data-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.14-meter-table-historical-data-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.15-meter-table-historical-data-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.63-meter-table-monitor-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.64-meter-table-monitor-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.65-meter-table-push-configuration-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.67-multilevel-sensor-command-class-version-1-4.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.68-multilevel-sensor-command-class-version-5-11.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.58-multilevel-switch-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.69-multilevel-switch-command-class-version-1.md} (51%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.59-multilevel-switch-command-class-version-2.md => application-command-class-specification/04-command-class-definitions/04.70-multilevel-switch-command-class-version-2.md} (59%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.60-multilevel-switch-command-class-version-3.md => application-command-class-specification/04-command-class-definitions/04.71-multilevel-switch-command-class-version-3.md} (60%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.61-multilevel-switch-command-class-version-4.md => application-command-class-specification/04-command-class-definitions/04.72-multilevel-switch-command-class-version-4.md} (61%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.62-multilevel-toggle-switch-command-class-version-1-deprecated.md => application-command-class-specification/04-command-class-definitions/04.73-multilevel-toggle-switch-command-class-version-1-deprecated.md} (52%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.01-terminology.md => application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.01-terminology.md} (67%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.02-compatibility-considerations.md => application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.02-compatibility-considerations.md} (55%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.03-interoperability-considerations.md => application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.03-interoperability-considerations.md} (58%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.04-notification-set-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.05-notification-get-command.md => application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.05-notification-get-command.md} (52%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.06-notification-report-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.07-notification-supported-get-command.md => application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.07-notification-supported-get-command.md} (57%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.08-notification-supported-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.09-event-supported-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.10-event-supported-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.75-prepayment-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.76-prepayment-encapsulation-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.77-proprietary-command-class-version-1-deprecated.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.78-protection-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.79-protection-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.80-pulse-meter-command-class-version-1-deprecated.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.70-rate-table-configuration-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.81-rate-table-configuration-command-class-version-1.md} (61%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.82-rate-table-monitor-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.83-scene-activation-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.84-scene-actuator-configuration-command-class-version-1.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.74-scene-controller-configuration-command-class-version-1.md => application-command-class-specification/04-command-class-definitions/04.85-scene-controller-configuration-command-class-version-1.md} (57%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.01-terminology.md => application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.01-terminology.md} (58%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.02-interoperability-considerations.md => application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.02-interoperability-considerations.md} (76%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.03-schedule-supported-get-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.04-schedule-supported-report-command.md => application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.04-schedule-supported-report-command.md} (58%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.05-schedule-set-command.md => application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.05-schedule-set-command.md} (56%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.06-schedule-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.07-schedule-report-command.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.08-schedule-remove-command.md => application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.08-schedule-remove-command.md} (51%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.09-schedule-state-set-command.md => application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.09-schedule-state-set-command.md} (58%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.10-schedule-state-get-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.11-schedule-state-report-command.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/index.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.87-schedule-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.88-schedule-command-class-version-3.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.89-schedule-command-class-version-4.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.79-schedule-entry-lock-command-class-version-1-deprecated.md => application-command-class-specification/04-command-class-definitions/04.90-schedule-entry-lock-command-class-version-1-deprecated.md} (51%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.80-schedule-entry-lock-command-class-version-2-deprecated.md => application-command-class-specification/04-command-class-definitions/04.91-schedule-entry-lock-command-class-version-2-deprecated.md} (58%) rename docs/specs/{command-class-specification/04-command-class-definitions/04.81-schedule-entry-lock-command-class-version-3-deprecated.md => application-command-class-specification/04-command-class-definitions/04.92-schedule-entry-lock-command-class-version-3-deprecated.md} (51%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.93-screen-attributes-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.94-screen-attributes-command-class-version-2.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.95-screen-meta-data-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.96-screen-meta-data-command-class-version-2.md rename docs/specs/{command-class-specification/04-command-class-definitions/04.86-sensor-configuration-command-class-version-1-obsoleted.md => application-command-class-specification/04-command-class-definitions/04.97-sensor-configuration-command-class-version-1-obsoleted.md} (58%) create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.98-simple-av-control-command-class-version-1-4.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/04.99-sound-switch-command-class-version-1.md create mode 100644 docs/specs/application-command-class-specification/04-command-class-definitions/index.md create mode 100644 docs/specs/application-command-class-specification/assets/img-04d8f2ead1.png create mode 100644 docs/specs/application-command-class-specification/assets/img-078228618f.png create mode 100644 docs/specs/application-command-class-specification/assets/img-0d643251a7.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-10ce66b311.png (100%) rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-13ece31554.png (100%) rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-17ed9bdd33.png (100%) rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-1f27ee63d2.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-21f86f8019.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-2ed45acc64.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-5494f2b277.jpeg create mode 100644 docs/specs/application-command-class-specification/assets/img-5c95fb2a15.png create mode 100644 docs/specs/application-command-class-specification/assets/img-6620b1beac.png create mode 100644 docs/specs/application-command-class-specification/assets/img-6c1e53b1c3.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-6ceb291c6e.png (100%) rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-73381c079f.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-799e562cbe.png create mode 100644 docs/specs/application-command-class-specification/assets/img-8101ef46fc.png create mode 100644 docs/specs/application-command-class-specification/assets/img-81079508de.jpeg create mode 100644 docs/specs/application-command-class-specification/assets/img-817f13d4ec.png create mode 100644 docs/specs/application-command-class-specification/assets/img-83fe32ab3f.png create mode 100644 docs/specs/application-command-class-specification/assets/img-90f32b94b4.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-a5a0d9d7be.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-a6f1afb4ac.png create mode 100644 docs/specs/application-command-class-specification/assets/img-b391b0ae58.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-be382647c3.png (100%) rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-c52ce0b218.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-c7049c3f45.png create mode 100644 docs/specs/application-command-class-specification/assets/img-cc3757bf06.png create mode 100644 docs/specs/application-command-class-specification/assets/img-d3b9d2ea2d.png create mode 100644 docs/specs/application-command-class-specification/assets/img-daecc43c03.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-db9abf0d3d.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-dcd97ada58.jpeg rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-de17561660.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-e7a467d482.png rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-f586b8bafd.png (100%) rename docs/specs/{command-class-specification => application-command-class-specification}/assets/img-fb25e9706c.png (100%) create mode 100644 docs/specs/application-command-class-specification/assets/img-fd30697c72.png rename docs/specs/{command-class-specification => application-command-class-specification}/index.md (54%) delete mode 100644 docs/specs/command-class-specification/01-abbreviations.md delete mode 100644 docs/specs/command-class-specification/03-command-class-overview/03.01-overview.md delete mode 100644 docs/specs/command-class-specification/03-command-class-overview/03.02-command-class-format.md delete mode 100644 docs/specs/command-class-specification/03-command-class-overview/03.04-node-information-frame.md delete mode 100644 docs/specs/command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.01-all-switch-command-class-version-1-obsoleted.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.04-barrier-operator-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.08-basic-window-covering-command-class-version-1-obsoleted.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.100-thermostat-setback-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.101-thermostat-setpoint-command-class-version-1-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.102-thermostat-setpoint-command-class-version-3.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.103-time-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.104-time-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.105-time-parameters-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.106-user-code-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.107-window-covering-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.11-binary-switch-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.12-binary-switch-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.13-binary-toggle-switch-command-class-version-1-obsoleted.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.14-climate-control-schedule-command-class-version-1-deprecated.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.16-central-scene-command-class-version-2-obsoleted.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.18-clock-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.19-color-switch-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.20-color-switch-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.22-configuration-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.23-configuration-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.25-configuration-command-class-version-4.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.26-controller-replication-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.28-demand-control-plan-monitor-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.29-door-lock-command-class-version-1-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.30-door-lock-command-class-version-3.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.31-door-lock-logging-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.32-energy-production-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.34-geographic-location-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.35-hrv-status-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.36-hrv-control-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.37-humidity-control-mode-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.38-humidity-control-operating-state-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.39-humidity-control-setpoint-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.40-indicator-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.41-indicator-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.02-compatibility-considerations.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.04-irrigation-system-info-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.06-irrigation-system-status-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.07-irrigation-system-status-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.08-irrigation-system-config-set-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.09-irrigation-system-config-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.10-irrigation-system-config-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.13-irrigation-valve-config-set-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.15-irrigation-valve-config-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.16-irrigation-valve-run-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.17-irrigation-valve-table-set-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.19-irrigation-valve-table-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.20-irrigation-valve-table-run-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/index.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.43-language-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.44-lock-command-class-version-1-deprecated.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.46-meter-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.47-meter-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.48-meter-command-class-version-3.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.49-meter-command-class-version-4.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.50-meter-command-class-version-5.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.51-meter-table-configuration-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.01-meter-table-point-adm-number-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.02-meter-table-point-adm-number-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.03-meter-table-id-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.04-meter-table-id-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.05-meter-table-capability-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.07-meter-table-status-supported-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.08-meter-table-status-supported-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.09-meter-table-status-depth-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.10-meter-table-status-date-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.11-meter-table-status-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.12-meter-table-current-data-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.14-meter-table-historical-data-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.15-meter-table-historical-data-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/index.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.01-meter-table-point-adm-number-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.02-meter-table-point-adm-number-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.03-meter-table-id-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.04-meter-table-id-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.05-meter-table-capability-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.06-meter-table-capability-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.07-meter-table-status-supported-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.08-meter-table-status-supported-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.09-meter-table-status-depth-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.10-meter-table-status-date-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.11-meter-table-status-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.12-meter-table-current-data-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.13-meter-table-current-data-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.14-meter-table-historical-data-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.15-meter-table-historical-data-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/index.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.54-meter-table-push-configuration-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.56-multilevel-sensor-command-class-version-1-4.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.57-multilevel-sensor-command-class-version-5-11.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.04-notification-set-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.06-notification-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.08-notification-supported-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.09-event-supported-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.10-event-supported-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.11-controller-guidelines.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/index.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.64-prepayment-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.65-prepayment-encapsulation-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.66-proprietary-command-class-version-1-deprecated.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.67-protection-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.68-protection-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.69-pulse-meter-command-class-version-1-deprecated.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.71-rate-table-monitor-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.72-scene-activation-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.73-scene-actuator-configuration-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.03-schedule-supported-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.06-schedule-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.07-schedule-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.10-schedule-state-get-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.11-schedule-state-report-command.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/index.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.76-schedule-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.77-schedule-command-class-version-3.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.78-schedule-command-class-version-4.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.82-screen-attributes-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.83-screen-attributes-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.84-screen-meta-data-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.85-screen-meta-data-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.87-simple-av-control-command-class-version-1-4.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.88-sound-switch-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.89-tariff-table-configuration-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.90-tariff-table-monitor-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.92-thermostat-fan-mode-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.95-thermostat-fan-state-command-class-version-1-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.96-thermostat-mode-command-class-version-1-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.97-thermostat-mode-command-class-version-3.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.98-thermostat-operating-state-command-class-version-1.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/04.99-thermostat-operating-state-command-class-version-2.md delete mode 100644 docs/specs/command-class-specification/04-command-class-definitions/index.md delete mode 100644 docs/specs/command-class-specification/assets/img-031d09cc57.jpeg delete mode 100644 docs/specs/command-class-specification/assets/img-0546536017.png delete mode 100644 docs/specs/command-class-specification/assets/img-0d25374112.png delete mode 100644 docs/specs/command-class-specification/assets/img-0f5e748af7.png delete mode 100644 docs/specs/command-class-specification/assets/img-234b052b98.png delete mode 100644 docs/specs/command-class-specification/assets/img-2f5fb50cdf.png delete mode 100644 docs/specs/command-class-specification/assets/img-41477511d5.png delete mode 100644 docs/specs/command-class-specification/assets/img-5e2a35351b.png delete mode 100644 docs/specs/command-class-specification/assets/img-68e758a97d.png delete mode 100644 docs/specs/command-class-specification/assets/img-762e99613e.png delete mode 100644 docs/specs/command-class-specification/assets/img-7e17d638c6.png delete mode 100644 docs/specs/command-class-specification/assets/img-8ec64d3ea0.jpeg delete mode 100644 docs/specs/command-class-specification/assets/img-91ca87aebd.png delete mode 100644 docs/specs/command-class-specification/assets/img-95385a795f.png delete mode 100644 docs/specs/command-class-specification/assets/img-9c7dfcaef5.png delete mode 100644 docs/specs/command-class-specification/assets/img-9fde74cbd0.jpeg delete mode 100644 docs/specs/command-class-specification/assets/img-ac16ca2e4f.png delete mode 100644 docs/specs/command-class-specification/assets/img-b897b5e07d.png delete mode 100644 docs/specs/command-class-specification/assets/img-bda7a771b4.jpeg delete mode 100644 docs/specs/command-class-specification/assets/img-ec0eea3305.png delete mode 100644 docs/specs/command-class-specification/assets/img-ec65ec745a.png delete mode 100644 docs/specs/command-class-specification/assets/img-f5af822b72.png delete mode 100644 docs/specs/command-class-specification/assets/img-f87775eaf2.png delete mode 100644 docs/specs/command-class-specification/assets/img-f8baa4593b.png delete mode 100644 docs/specs/command-class-specification/assets/img-f94675db5a.png delete mode 100644 docs/specs/command-class-specification/assets/img-fbc9bfea32.png create mode 100644 docs/specs/management-command-class-specification/01-abbreviations.md create mode 100644 docs/specs/management-command-class-specification/02-introduction/02.01-precedence-of-definitions.md create mode 100644 docs/specs/management-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md create mode 100644 docs/specs/management-command-class-specification/02-introduction/index.md create mode 100644 docs/specs/management-command-class-specification/03-command-class-overview.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.01-application-capability-command-class-version-1-obsoleted.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.02-application-status-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.03-association-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.04-association-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.05-association-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.06-association-command-configuration-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.01-compatibility-considerations.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.02-association-principles.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.03-the-association-group-information.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.04-association-group-name-get.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.05-association-group-name-report.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.06-association-group-info-get.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.07-association-group-info-report.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.08-association-group-command-list-get.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.09-association-group-command-list-report.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/index.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.08-association-group-information-agi-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.09-association-group-information-agi-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.10-battery-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.11-battery-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.12-battery-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.13-device-reset-locally-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.14-firmware-update-meta-data-command-class-version-1-deprecated.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.15-firmware-update-meta-data-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.16-firmware-update-meta-data-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.17-firmware-update-meta-data-command-class-version-4.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.18-firmware-update-meta-data-command-class-version-5.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.19-firmware-update-meta-data-command-class-version-6.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.20-firmware-update-meta-data-command-class-version-7.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.21-grouping-name-command-class-version-1-deprecated.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.22-hail-command-class-version-1-obsoleted.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.23-indicator-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.24-indicator-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.25-indicator-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.26-indicator-command-class-version-4.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.27-ip-association-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.28-manufacturer-specific-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.29-manufacturer-specific-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.30-multi-channel-association-command-class-version-1-obsoleted.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.01-compatibility-considerations.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.02-z-wave-plus-considerations.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.03-security-considerations.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.04-multi-channel-association-set-command.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.05-multi-channel-association-get-command.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.06-multi-channel-association-report-command.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.07-multi-channel-association-remove-command.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.08-multi-channel-association-supported-groupings-get-command.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.09-multi-channel-association-supported-groupings-report-command.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/index.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.32-multi-channel-association-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.33-multi-channel-association-command-class-version-4.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.34-node-naming-and-location-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.35-remote-association-activation-command-class-version-1-obsoleted.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.36-remote-association-configuration-command-class-version-1-obsoleted.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.37-time-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.38-time-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.39-time-parameters-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.40-version-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.41-version-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.42-version-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.43-wake-up-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.44-wake-up-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.45-wake-up-command-class-version-3.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.46-zip-naming-and-location-command-class-version-1.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.47-z-wave-plus-info-command-class-version-1-obsoleted.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md create mode 100644 docs/specs/management-command-class-specification/04-command-class-definitions/index.md create mode 100644 docs/specs/management-command-class-specification/assets/img-02b3ab2b70.png create mode 100644 docs/specs/management-command-class-specification/assets/img-037dc24bd9.png create mode 100644 docs/specs/management-command-class-specification/assets/img-3049bc51b8.png create mode 100644 docs/specs/management-command-class-specification/assets/img-4af5a8dd67.png create mode 100644 docs/specs/management-command-class-specification/assets/img-5494f2b277.jpeg create mode 100644 docs/specs/management-command-class-specification/assets/img-552a3c0bfc.png create mode 100644 docs/specs/management-command-class-specification/assets/img-671e4cdb38.png create mode 100644 docs/specs/management-command-class-specification/assets/img-696723cfa7.png create mode 100644 docs/specs/management-command-class-specification/assets/img-75c2215cbb.png create mode 100644 docs/specs/management-command-class-specification/assets/img-81079508de.jpeg create mode 100644 docs/specs/management-command-class-specification/assets/img-841ee8d357.png create mode 100644 docs/specs/management-command-class-specification/assets/img-87cfd2782b.png create mode 100644 docs/specs/management-command-class-specification/assets/img-8d4107a922.png create mode 100644 docs/specs/management-command-class-specification/assets/img-9d7166209e.png create mode 100644 docs/specs/management-command-class-specification/assets/img-a1d7c27be6.png create mode 100644 docs/specs/management-command-class-specification/assets/img-b3a995113e.png create mode 100644 docs/specs/management-command-class-specification/assets/img-c30a527f05.png create mode 100644 docs/specs/management-command-class-specification/assets/img-c40eec3abf.png create mode 100644 docs/specs/management-command-class-specification/assets/img-cc66c4e9cc.png create mode 100644 docs/specs/management-command-class-specification/assets/img-d93c722ca1.png create mode 100644 docs/specs/management-command-class-specification/assets/img-dcd97ada58.jpeg create mode 100644 docs/specs/management-command-class-specification/index.md create mode 100644 docs/specs/network-protocol-command-class-specification/01-abbreviations.md create mode 100644 docs/specs/network-protocol-command-class-specification/02-introduction/02.01-precedence-of-definitions.md create mode 100644 docs/specs/network-protocol-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md create mode 100644 docs/specs/network-protocol-command-class-specification/02-introduction/index.md create mode 100644 docs/specs/network-protocol-command-class-specification/03-command-class-overview.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.01-inclusion-controller-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.02-ip-configuration-command-class-version-1-obsoleted.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.03-mailbox-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.04-mailbox-command-class-version-2.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.01-compatibility-considerations.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.02-scope-of-network-management.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.03-security-considerations.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.04-network-management-proxy-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.05-network-management-proxy-command-class-version-2.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.06-network-management-proxy-command-class-version-3.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.07-network-management-basic-node-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.08-network-management-basic-node-command-class-version-2.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.01-node-add-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.02-node-add-status-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.03-node-remove-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.04-node-remove-status-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.05-failed-node-remove-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.06-failed-node-remove-status-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.07-failed-node-replace-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.08-failed-node-replace-status-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.09-node-neighbor-update-request-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.10-node-neighbor-update-status-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.11-return-route-assign-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.12-return-route-assign-complete-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.13-return-route-delete-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.14-return-route-delete-complete-command.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.15-use-cases-and-frame-flows.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/index.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.10-network-management-inclusion-command-class-version-2.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.11-network-management-inclusion-command-class-version-3.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.12-network-management-primary-command-class-version-1-obsoleted.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.13-network-management-installation-and-maintenance-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.14-network-management-installation-and-maintenance-command-class-version-2.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/index.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.06-no-operation-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.07-node-provisioning-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.08-powerlevel-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.09-zip-command-class-version-1-obsoleted.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.10-zip-command-class-version-2.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.11-zip-command-class-version-3.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.12-zip-command-class-version-4.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.13-zip-6lowpan-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.14-zip-gateway-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.15-zip-nd-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.16-zip-portal-command-class-version-1.md create mode 100644 docs/specs/network-protocol-command-class-specification/04-command-class-definitions/index.md create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-08e1758c21.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-13d59fa9bc.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-2674b78219.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-2bd7dd5ad6.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-3c34ebebda.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-5f06f48277.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-663fb7b675.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-69a524a802.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-8948947f8d.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-a5a5560659.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-aacefd1a94.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-b56b7d57c5.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-bf6af05d2a.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-c95b8ef8eb.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-d4d26891f2.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-d9e53f1b09.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-dde52d6732.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-efd36376f2.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-f5c5271e57.png create mode 100644 docs/specs/network-protocol-command-class-specification/assets/img-fa2278fdcf.png create mode 100644 docs/specs/network-protocol-command-class-specification/index.md create mode 100644 docs/specs/sources/SDS13781 Z-Wave Application Command Class Specification.pdf delete mode 100644 docs/specs/sources/SDS13781-4 Z-Wave Application Command Class Specification.pdf create mode 100644 docs/specs/sources/SDS13782 Z-Wave Management Command Class Specification.pdf create mode 100644 docs/specs/sources/SDS13783 Z-Wave Transport-Encapsulation Command Class Specification.pdf create mode 100644 docs/specs/sources/SDS13784 Z-Wave Network-Protocol Command Class Specification.pdf create mode 100644 docs/specs/transport-encapsulation-command-class-specification/01-introduction/01.01-precedence-of-definitions.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/01-introduction/01.02-terms-used-in-this-document.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/01-introduction/index.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/02-command-class-overview.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.01-crc-16-encapsulation-command-class-version-1-deprecated.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.02-multi-channel-command-class-version-3.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.03-multi-channel-command-class-version-4.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.04-multi-command-command-class-version-1.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.05-security-0-s0-command-class-version-1/03.05.01.01-node-information-frame-nif.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.05-security-0-s0-command-class-version-1/03.05.02-message-encapsulation-and-command-class-handling.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.05-security-0-s0-command-class-version-1/03.05.03-network-key-management.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.05-security-0-s0-command-class-version-1/03.05.04-encapsulated-command-class-handling.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.05-security-0-s0-command-class-version-1/index.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.01-compatibility-considerations.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.02-security-considerations.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.03-interoperability-considerations.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.04-building-blocks.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.05-message-encapsulation/03.06.05.01-singlecast-messages-and-span-management.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.05-message-encapsulation/03.06.05.02-multicast-messages-and-mpan-management.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.05-message-encapsulation/03.06.05.03-message-encapsulation-commands.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.05-message-encapsulation/03.06.05.04-duplicate-message-detection.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.05-message-encapsulation/index.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.06-key-management.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.07-security-2-key-exchange-commands.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/03.06.08-discovery-of-security-capabilities-commands.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.06-security-2-s2-command-class-version-1/index.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.07-supervision-command-class-version-1.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.08-transport-service-command-class-version-1-obsoleted.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/03.09-transport-service-command-class-version-2.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/03-command-class-definitions/index.md create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-045fd7a7ed.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-123e637c00.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-285090a1bd.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-29b570937a.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-36b617071e.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-3fac2a3dd4.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-6b099bd97c.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-6bc5fe3a93.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-84047b67e4.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-92a5ed76bb.jpeg create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-a07fdefe45.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-b3dd9dc140.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-ca9f3d2bed.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-d7e3def9cd.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-ddbea20c31.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/assets/img-e3186d280e.png create mode 100644 docs/specs/transport-encapsulation-command-class-specification/index.md diff --git a/docs/specs/application-command-class-specification/01-abbreviations.md b/docs/specs/application-command-class-specification/01-abbreviations.md new file mode 100644 index 0000000..56a46f8 --- /dev/null +++ b/docs/specs/application-command-class-specification/01-abbreviations.md @@ -0,0 +1,34 @@ + +# 1 Abbreviations + +| Abbreviation | Explanation | +| --- | --- | +| AMR | Automatic Meter Reading | +| API | Application Programming Interface | +| ASCII | American Standard Code for Information Interchange. An ASCII code is the numerical representation of a character. | +| AV | Audio/Video | +| DHCP | Dynamic Host Configuration Protocol. | +| DNS | Domain Name System | +| DST | Daylight Savings Time | +| HRV | Heat Recovery Ventilation | +| ID | Identifier | +| IP | Internet Protocol | +| IPV4 | Internet Protocol version 4 | +| IPV6 | Internet Protocol version 6 | +| LF | Linefeed character. | +| LSB | Less Significant Bit | +| MSB | Most Significant Bit | +| NIF | Node Information Frame | +| PIR | Pyroelectric Infrared | +| SUC | Static Update Controller | +| TZO | Time Zone Offset | +| Unicode | Unicode is a standard for encoding of characters. (http://www.unicode.org/) | +| UTC | Coordinated Universal Time (called Greenwich Mean Time (GMT) before 1972) | +| WMC | Windows Vista Media Center and Media Center 2005 remote controls | +| Z/IP | Z-Wave for IP | diff --git a/docs/specs/command-class-specification/02-introduction/02.01-precedence-of-definitions.md b/docs/specs/application-command-class-specification/02-introduction/02.01-precedence-of-definitions.md similarity index 84% rename from docs/specs/command-class-specification/02-introduction/02.01-precedence-of-definitions.md rename to docs/specs/application-command-class-specification/02-introduction/02.01-precedence-of-definitions.md index da0a3d5..af2d135 100644 --- a/docs/specs/command-class-specification/02-introduction/02.01-precedence-of-definitions.md +++ b/docs/specs/application-command-class-specification/02-introduction/02.01-precedence-of-definitions.md @@ -1,7 +1,7 @@ diff --git a/docs/specs/command-class-specification/02-introduction/02.02-terms-used-in-this-document.md b/docs/specs/application-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md similarity index 84% rename from docs/specs/command-class-specification/02-introduction/02.02-terms-used-in-this-document.md rename to docs/specs/application-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md index 6c25e48..90a07a6 100644 --- a/docs/specs/command-class-specification/02-introduction/02.02-terms-used-in-this-document.md +++ b/docs/specs/application-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md @@ -1,15 +1,15 @@ # 2.2 Terms used in this document -The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", ["MAY", and "OPTIONAL" in this document MUST be interpreted as described in IETF RFC 2119 [6].](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", ["MAY", and "OPTIONAL" in this document MUST be interpreted as described in IETF RFC 2119 [6].](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -[Statements containing the IETF RFC 2119 [6] key words are at times marked with unique requirement](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) numbers in the margin. The requirements numbers have the following syntax: CC:xxxx.xx.xx.xx.xxx with each x being an hexadecimal digit. +[Statements containing the IETF RFC 2119 [6] key words are at times marked with unique requirement](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) numbers in the margin. The requirements numbers have the following syntax: CC:xxxx.xx.xx.xx.xxx with each x being an hexadecimal digit. This document defines functionality as deprecated or obsoleted. diff --git a/docs/specs/command-class-specification/02-introduction/index.md b/docs/specs/application-command-class-specification/02-introduction/index.md similarity index 54% rename from docs/specs/command-class-specification/02-introduction/index.md rename to docs/specs/application-command-class-specification/02-introduction/index.md index b1eabfe..4ef300b 100644 --- a/docs/specs/command-class-specification/02-introduction/index.md +++ b/docs/specs/application-command-class-specification/02-introduction/index.md @@ -1,17 +1,17 @@ # 2 Introduction Commands classes are divided in four categories: - Application Command Classes  [Management Command Classes [15]](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command)  [Transport-Encapsulation Command Classes [14]](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command)  [Network-Protocol Command Classes [16]](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) + Application Command Classes  [Management Command Classes [15]](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command)  [Transport-Encapsulation Command Classes [14]](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command)  [Network-Protocol Command Classes [16]](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -[The list of defined Command Classes with their associated category is available in [13].](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[The list of defined Command Classes with their associated category is available in [13].](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) This document describes the Command Classes designed for Application specific purposes. diff --git a/docs/specs/application-command-class-specification/03-command-class-overview/03.01-overview.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.01-overview.md new file mode 100644 index 0000000..9323257 --- /dev/null +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.01-overview.md @@ -0,0 +1,10 @@ + +# 3.1 Overview + +[The Device Class specification [1] and Z-Wave Plus Device Type [10], [22] specification indicate](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) combinations of command classes which MUST be supported for a particular product class or type. diff --git a/docs/specs/application-command-class-specification/03-command-class-overview/03.02-command-class-format.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.02-command-class-format.md new file mode 100644 index 0000000..841cb8a --- /dev/null +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.02-command-class-format.md @@ -0,0 +1,79 @@ + +# 3.2 Command class format + +## 3.2.1 Frame format + +All commands classes have a common header consisting of a Command Class identifier and a Command identifier. Each command can have from zero to N bytes of command data. The bit numbering starts at zero for the least significant bit. LSB is denoted as ‘Bit 0’ and MSB is denoted as ‘Bit 7 throughout the document. + +LSB and MSB notations are also used for multi bytes fields, indicating which byte is the most significant. + +[Figure 1, Generic command format and Figure 2, Generic extended command format below show the](03.02-command-class-format.md#321-frame-format) generic command frame for the two possible formats: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class (0x20..0xEE) | | | | | | | | +| Command | | | | | | | | +| Command Data 1 | | | | | | | | +| … | | | | | | | | +| Command Data N | | | | | | | | + +Figure 1, Generic command format + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class MSB (0xF1..0xFF) | | | | | | | | +| Command Class LSB (0x00..0xFF) | | | | | | | | +| Command | | | | | | | | +| Command Data 1 | | | | | | | | +| … | | | | | | | | +| Command Data N | | | | | | | | + +Figure 2, Generic extended command format + +### 3.2.1.1 Command class + +[The Command Class identifier range is shown in Table 1, Command Class identifier range.](03.02-command-class-format.md#3211-command-class) + +Table 1, Command Class identifier range + +| Command Class | Description | +| --- | --- | +| 0x00 | No Operation. Used by Z-Wave Protocol. MAY be used by the application. | +| 0x01..0x1F | Reserved for the Z-Wave protocol | +| 0x20..0xEE | Application Command Classes | +| 0xEF | Support/Control Mark | +| 0xF0 | Non interoperable | +| 0xF100 | Security Mark | +| 0xF101..0xFFFF | Extended Application Command Classes (2 byte-long Command Class identifier) | + +0x00 No Operation. Used by Z-Wave Protocol. MAY be used by the application. CC:0000.00.00.13.001 + +A Command Class can contain up to 255 different Commands. If the Command Class field is in the range 0xF1..0xFF, the Command Class identifier is therefore 2 bytes long. This allows for future extensions of the Command Classes and provides the possibility of having more than 4000 Command Classes. + +### 3.2.1.2 Command + +The command field contains the specific command indicating a node how to parse and interpret the command data. The command field length is always 1 byte. + +### 3.2.1.3 Command data (N bytes) + +The command data field contains data related to the command. The description for the command data is defined in each individual command. + +Simple commands, such as Get commands, usually contain no command data. Other commands, such as Set or Report commands can contain several bytes of command data. + +## 3.2.2 Command class versioning + +All command classes have a version number. The following rules apply to avoid interoperability issues when introducing the same Command Class with different versions: + + A node MUST NOT discard a frame based on the length field. A receiving node MUST use the Command Class identifier and the Command identifier to interpret the application frame. This enables a device, which supports version 1 of a Command Class to interpret the version 1 part of a received version 2 of the command. + + All implementations of a Command Class version higher than 1 MUST initialize all parameters associated with the version higher than 1. Thereby a node implementing the version 2 of a Command Class can interpret a version 1 received Command. + + CC:0000.00.00.11.004 A device supporting a Command Class having a version higher than 1 MUST support the Version [Command Class [15] to be able to identify the supported version. If a node does not support](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) the Version Command Class at its highest security level, it can be assumed that all Command Classes version are equal to 1. + + It is allowed to certify nodes supporting an older version of a Command Class despite a newer version exists as long as the generic/specific device specification does not require a specific version implemented. diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.03-controlled-and-supported-command-classes.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.03-controlled-and-supported-command-classes.md similarity index 81% rename from docs/specs/command-class-specification/03-command-class-overview/03.03-controlled-and-supported-command-classes.md rename to docs/specs/application-command-class-specification/03-command-class-overview/03.03-controlled-and-supported-command-classes.md index d1f1924..49a21d2 100644 --- a/docs/specs/command-class-specification/03-command-class-overview/03.03-controlled-and-supported-command-classes.md +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.03-controlled-and-supported-command-classes.md @@ -1,7 +1,7 @@ @@ -11,6 +11,6 @@ A node can support and/or control a given Command Class. If a Command Class is supported: The node implements all the Command Class functionalities and can be set and read back by other nodes. When a Command Class is supported, it is REQUIRED to implement the whole Command Class. -If a Command Class is controlled: The node implements the ability to interview, read and/or set other nodes supporting the Command Class. Nodes controlling Command Classes MAY use only a subset of the Commands within a Command Class (for example only Set commands). Even if using a Command Class partially for control, the use MUST comply with the Command Class requirements. +If a Command Class is controlled: The node implements the ability to interview, read and/or set other nodes supporting the Command Class. Nodes controlling Command Classes may use only a subset of the Commands within a Command Class (for example only Set commands). Even if using a Command Class partially for control, the use must comply with the Command Class requirements. For example, a Set Command sent to Association Group destinations is a form of Command Class control. diff --git a/docs/specs/application-command-class-specification/03-command-class-overview/03.04-node-information-frame.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.04-node-information-frame.md new file mode 100644 index 0000000..7b731b9 --- /dev/null +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.04-node-information-frame.md @@ -0,0 +1,144 @@ + +# 3.4 Node Information Frame + +The Node Information Frame (NIF) is used to inform other devices about the node capabilities. The NIF contains a structure with a protocol specific part that is handled by the Z-Wave protocol and an application specific part that is filled in by the application. The protocol specific part consists of a bit telling if the node is a continuously listening device, the Basic Device Class the node is based on etc. The application specific part consists of the Generic and Specific Device Class and the Command Classes that are supported and/or controlled by the node. + +[Generic and Specific Device Class are defined in [1] for legacy Z-Wave nodes or in [10], [22] for Z-Wave](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Plus nodes. A NIF will be sent to the controller when a node is to be included in the network, excluded from the network or upon request. + +[Table 2, Node Information Frame Format shows the NIF structure.](03.04-node-information-frame.md#34-node-information-frame) + +Table 2, Node Information Frame Format + +| Byte descriptor \ bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Capability | Liste- ning | Routing | Max Speed | | | Protocol version | | | +| Security | Opt. Func. | Sensor 1000ms | Sensor 250ms | Beam capabi- lity | Routing Slave | Specific Device | Con- troller | Secu-rity | +| Reserved | Z-Wave Protocol Specific Part | | | | | | | | +| Basic *) | Basic Device Class (Z-Wave Protocol Specific Part) | | | | | | | | +| Generic | Generic Device Class | | | | | | | | +| Specific | Specific Device Class | | | | | | | | +| NodeInfo[0] | Command Class 1 | | | | | | | | +| … | … | | | | | | | | +| NodeInfo[n- 1] | Command Class N | | | | | | | | + +*) The “Basic” field is only included when the NIF is sent by a controller + +The Z-Wave Protocol in a controller saves all the Node Information except the supported and controlled Command Classes when a node is included in the network. The reserved field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 3.4.1 Z-Wave Protocol Specific Part + +The protocol specific part of the NIF is handled by the Z-Wave protocol. This information is automatically inserted in the packet by the protocol layer when transferring data using the API. + +Basic Device Class + +The Basic Device Class field contains an identifier that identifies what Basic Device Class this node is based on and is set by the Z-Wave protocol. A detailed description of all available Basic Device Classes is [given in [1] for Z-Wave devices and [10], [22] for Z-Wave Plus devices. The Z-Wave Plus devices have an](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) additional parameter Role Type defining device role in the network. The Role Type parameter is [announced via the Z-Wave Plus Info Command Class [15].](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +This field is only included when the NIF frame is sent by a controller. A slave MUST omit this field. Refer [to [9] for controller and slave definition.](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +## 3.4.2 Application Specific Part + +The application specific part of the NIF is handled by the application. The information must be in accordance with the defined classes to obtain interoperability. + +Listening Flag + +The Listening flag is used to indicate that the node is always listening if set to 1. An always listening node must be powered continuously and reside on a fixed position in the installation. An always listening node is included in the routing table to assist as repeater in the network. The routing table is static during normal operation. In case the Listening flag is set to 0, the node is non-listening. This is typically used for battery operated nodes being asleep when the protocol is idle to prolong battery lifetime. A battery operated node is not included in the routing table and is not used as a router in the network. In some instances the node’s position in the network is still determined, and stored by the protocol. + +Optional Functionality Flag + +The Optional Functionality flag is used to indicate that this node supports other command classes than the mandatory for the selected generic/specific device class and that a controlling node needs to look at the supported command classes to fully control this device. + +Generic Device Class + +The Generic Device Class field contains an identifier that identifies what Generic Device Class this node is part of and must be set by the application. For a detailed description of all available Generic Device [Classes, refer to [1] for Z-Wave devices and [10], [22] for Z-Wave Plus devices.](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Specific Device Class + +The Specific Device Class field specifies what Specific Device Class this application is part of and must be [set by the application. For a detailed description of all available Specific Device Classes, refer to [1] for Z-Wave devices and [10], [22] for Z-Wave Plus devices.](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Command Class + +The Command Class field is used to advertise Command Classes implemented by the node. The field MUST NOT be longer than 35 bytes. + +The field MUST advertise the list of Command Classes that the node supports. + +The field MAY advertise the list of Command Classes that the node can control in other nodes. If present, the list of controlling Command Classes MUST be prepended by the COMMAND_CLASS_MARK Command Class identifier. It is NOT RECOMMENDED to advertise controlled Command Classes. + +It has been found that legacy controllers may read as little as 6 lines from this list. For backwards [compatibility, the list SHOULD advertise supported command classes in the order indicated in Table 3, NIF :: Command Class advertising priorities :](03.04-node-information-frame.md#342-application-specific-part) Table 3, NIF :: Command Class advertising priorities + +| Priority | Command Class | +| --- | --- | +| 1 (First line) | COMMAND CLASS ZWAVEPLUS INFO _ _ _ Applies only to Z-Wave Plus products | +| 2 (if supported) | COMMAND CLASS SWITCH MULTILEVEL or _ _ _ COMMAND CLASS SWITCH BINARY _ _ _ | +| 3 (if supported) | COMMAND CLASS SWITCH ALL _ _ _ | +| 4 (if supported) | COMMAND CLASS ASSOCIATION _ _ | +| 5 | All other command classes | + +[Table 4, NIF::Command Class list structure shows the Command Class list structure of the Node](03.04-node-information-frame.md#342-application-specific-part) Information frame: + +Table 4, NIF::Command Class list structure + +| Description | Command Class list field content | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| Non-secure Supported Command Classes | Command Class 1 *) | | | | | | | | +| | … | | | | | | | | +| | Command Class M *) | | | | | | | | +| Support/Control Mark | 0xEF | | | | | | | | +| Non-secure Controlled Command Classes | Command Class 1 *) | | | | | | | | +| | … | | | | | | | | +| | Command Class K *) | | | | | | | | + +*) Command classes may be extended  spanning two bytes for one command class + +The Command Class list MAY start or finish with the identifier COMMAND_CLASS_MARK. + +## 3.4.3 NIF and Multi Channel/Security Command Classes + +The NIF MUST represent command classes supported without Multi Channel or Security encapsulation CC:0000.00.00.11.00B [[14].](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +After inclusion in a Z-Wave network, the NIF represents the node’s Command Class capabilities when using no Security and no Multi Channel encapsulation. + +Multi Channel Root Devices advertise their capabilities via the NIF, but they advertise the Command Class capabilities of their End Points via the Multi Channel Command Class. + +Security bootstrapped nodes advertise their capabilities using security encapsulation via the Security 0 or Security 2 Command Class. The Command Class list advertised in the NIF may vary depending on the inclusion state and S0/S2 bootstrapping state of the node. + +A node supporting security (S0 and/or S2) MUST advertise command classes in the NIF according to [Table 5, NIF content depending on inclusion and security bootstrapping.](03.04-node-information-frame.md#343-nif-and-multi-channelsecurity-command-classes) + +Table 5, NIF content depending on inclusion and security bootstrapping + +| Network inclusion | Security bootstrapping | Command Classes advertised in the NIF | +| --- | --- | --- | +| Not included in a network | N/A | At least all Command Classes that MUST always be non-securely supported. All supported Command Classes MAY be advertised | +| Included in a network | No security supported by the included node | All supported Command Classes | +| Included in a network | Before the node times out waiting for Security bootstrapping | At least all Command Classes that MUST always be non-securely supported. All supported Command Classes MAY be advertised | +| Included in a network | Timed out waiting for Security Bootstrapping (i.e. the process never started) | The same Command Class list as when security bootstrapping is successful but no key was granted1 | +| Included in a network | Security bootstrapping failed. (i.e. the process started but did not complete without error) | All Command Classes that MUST always be non-securely supported Command Classes that are supported when no key is granted MAY be added or removed from the list.1 | +| Included in a network | Bootstrapped with S0/S2 | All Command Classes that MUST always be non-securely supported only. (i.e. Command Classes supported even if not using S0/S2 encapsulation). | + +Refer to each individual Device Type [[10], [22]](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) for the list of Command Classes supported when no security key 1 is granted + +Command Classes advertised as supported in the NIF after S0/S2 bootstrapping MUST also be supported at higher security levels unless encapsulated outside security. + +### 3.4.3.1 Examples + +In the case of a node requesting Access Control, they require a certain security level before supporting their command class. For example a Door Lock Device Type will support its command classes as shown [in Figure 3](03.04-node-information-frame.md#3431-examples) + +![Figure 3, Access Control node NIF contents (always non-secure Command Classes shown in bold)](assets/img-799e562cbe.png) + +Nodes requesting a lower security level than Access Control have more freedom about advertising their regular command classes in the different scenarios. An example of a Binary Switch Device Type is shown [in Figure 4](03.04-node-information-frame.md#3431-examples) + +![Figure 4, Non-Access Control node NIF contents (always non-secure Command Classes shown in bold)](assets/img-fd30697c72.png) + +## 3.4.4 Command Class specific NIF rules + +A given Command Class MAY have additional requirement with respects to the NIF, Multi Channel Capability Report or S0/S2 Commands Supported Report. + +For example, the Basic Command Class is never advertised in the NIF or the Z-Wave Plus Info is always in the NIF if supported. + +In this case, requirements are listed in each individual Command Class definition, in the compatibility considerations section. diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.05-multicast-and-broadcast-commands.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.05-multicast-and-broadcast-commands.md similarity index 90% rename from docs/specs/command-class-specification/03-command-class-overview/03.05-multicast-and-broadcast-commands.md rename to docs/specs/application-command-class-specification/03-command-class-overview/03.05-multicast-and-broadcast-commands.md index 764cd43..44f7666 100644 --- a/docs/specs/command-class-specification/03-command-class-overview/03.05-multicast-and-broadcast-commands.md +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.05-multicast-and-broadcast-commands.md @@ -1,9 +1,9 @@ # 3.5 Multicast and broadcast commands diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.06-actuator-control.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.06-actuator-control.md similarity index 73% rename from docs/specs/command-class-specification/03-command-class-overview/03.06-actuator-control.md rename to docs/specs/application-command-class-specification/03-command-class-overview/03.06-actuator-control.md index b26e396..b8ad288 100644 --- a/docs/specs/command-class-specification/03-command-class-overview/03.06-actuator-control.md +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.06-actuator-control.md @@ -1,9 +1,9 @@ # 3.6 Actuator Control @@ -11,7 +11,7 @@ An actuator device may support one or more actuator command classes. This sectio The actuator control group comprises the following command classes: - Barrier Operator Command Class  Basic Command Class  Binary Switch Command Class  Color Switch Command Class  Door Lock Command Class  Multilevel Switch Command Class  Sound Switch Command Class  Window Covering Command Class + Barrier Operator Command Class  Basic Command Class  Binary Switch Command Class  Color Switch Command Class  Door Lock Command Class  Multilevel Switch Command Class  Simple AV Command Class  Sound Switch Command Class  Thermostat Setpoint Command Class  Thermostat Mode Command Class  Window Covering Command Class ## 3.6.1 Terminology @@ -23,22 +23,24 @@ A motion actuator responds to start/stop commands. A motion control command spec ## 3.6.2 Reporting values -A position control command may be used to initiate a transition to a new target value. A position report advertises the current value of the device hardware, optionally the target value and the remaining transition duration. If the transition is initiated by a motion control command, the reported target value is the min or max value and the duration is the time needed to reach the target value at the actual transition rate. A controlling device should not assume that the position value advertised in a Report is identical to a value previously issued with a position control command when a transition has ended. +A position control command may be used to initiate a transition to a new target value. A position report advertises the current value of the device hardware, optionally the target value and the remaining transition duration. If the transition is initiated by a motion control command, the reported target value is the min or max value and the duration is the time needed to reach the target value at the actual transition rate. -A controlling node MAY want to receive application-level acknowledgements after issuing actuating commands. It is the responsibility and choice of the controlling node whether or not to ensure that a actuating command has been successfully executed. If doing so, it is RECOMMENDED to use the [Supervision Command Class [14] or MAY read back the node’s state at a later time with a Get](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) Command. A supporting node receiving an actuating Command SHOULD NOT return a Report Command advertising its status or level unless specified in the Command Class specification. +A controlling device should not assume that the position value advertised in a Report is identical to a value previously issued with a position control command when a transition has ended. + +A controlling node MAY want to receive application-level acknowledgements after issuing actuating commands. It is the responsibility and choice of the controlling node whether or not to ensure that a actuating command has been successfully executed. If doing so, it is RECOMMENDED to use the [Supervision Command Class [14] or MAY read back the node’s state at a later time with a Get](../04-command-class-definitions/04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Command. A supporting node receiving an actuating Command SHOULD NOT return a Report Command advertising its status or level unless specified in the Command Class specification. ## 3.6.3 Command values vs. hardware values -A device may implement fewer hardware levels than supported by a position control Command Class. The hardware levels should be distributed uniformly over the entire range. The mapping of command values to hardware levels must be monotonous, i.e. a higher value MUST be mapped to either the same [or a higher hardware level. An example is found in Table 6.](03.06-actuator-control.md#363-command-values-vs-hardware-values) +A device may implement fewer hardware levels than supported by a position control Command Class. The hardware levels should be distributed uniformly over the entire range. The mapping of command values to hardware levels must be monotonous, i.e. a higher value MUST be mapped to either the same [or a higher hardware level. An example is found in Table 6, Mapping command values to hardware levels (example).](03.06-actuator-control.md#363-command-values-vs-hardware-values) -[Table 6, Mapping command values to hardware levels (example)](03.06-actuator-control.md#363-command-values-vs-hardware-values) +Table 6, Mapping command values to hardware levels (example) -| | Multilevel Value | | | Hardware level | | | State | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | 0 | | | Off | | | -| 1..33 | | | 33% | | | On | | | -| 34..66 | | | 66% | | | On | | | -| 67..99 | | | 100% | | | On | | | +| Multilevel Value | Hardware level | State | +| --- | --- | --- | +| 0 | 0 | Off | +| 1..33 | 33% | On | +| 34..66 | 66% | On | +| 67..99 | 100% | On | ## 3.6.4 Supporting multiple actuator Command Classes diff --git a/docs/specs/application-command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md b/docs/specs/application-command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md new file mode 100644 index 0000000..77e13aa --- /dev/null +++ b/docs/specs/application-command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md @@ -0,0 +1,130 @@ + +# 3.7 Common fields and encoding + +## 3.7.1 Reserved and Res fields + +Fields named ‘Reserved’ or ‘Res’ MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 3.7.2 Reserved values and reserved bits + +Values of fields in commands that are marked as “reserved” or “res” MUST NOT be used by devices sending commands and MUST be ignored by devices receiving commands. + +Bits in commands that are marked as “reserved” or “res” MUST be set to 0 by devices sending CC:0000.00.00.11.013 commands and MUST be ignored by devices receiving commands. + +Undefined values for a given parameter MUST be treated as “reserved”. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. + +## 3.7.3 Duration encoding + +Some actuator command classes allow controlling nodes to specify a duration for reaching the target [value. The duration MUST be encoded according to Table 7, Actuator Command Class Duration Set encoding.](03.07-common-fields-and-encoding.md#373-duration-encoding) + +Table 7, Actuator Command Class Duration Set encoding + +| Value | Description | +| --- | --- | +| 0x00 | Instantly | +| 0x01..0x7F | 1 second (0x01) to 127 seconds (0x7F) in 1 second resolution. | +| 0x80..0xFE | 1 minute (0x80) to 127 minutes (0xFE) in 1 minute resolution. | +| 0xFF | Factory default duration. | + +A node supporting an actuator Command Class may advertise the duration left to reach the target value [advertised in a report. The duration MUST be encoded according to Table 8, Actuator Command Class](03.07-common-fields-and-encoding.md#373-duration-encoding) CC:0000.00.00.11.016 [Duration Report encoding.](03.07-common-fields-and-encoding.md#373-duration-encoding) + +Table 8, Actuator Command Class Duration Report encoding + +| Value | Description | +| --- | --- | +| 0x00 | 0 seconds. Already at the Target Value. | +| 0x01..0x7F | 1 second (0x01) to 127 seconds (0x7F) in 1 second resolution. | +| 0x80..0xFD | 1 minute (0x80) to 126 minutes (0xFD) in 1 minute resolution. | +| 0xFE | Unknown duration | +| 0xFF | Reserved | + +## 3.7.4 Unsigned encoding + +Unless specified otherwise in a field description, the field encoding is using unsigned representation. [Fields using unsigned encoding MUST comply with Table 9, Default unsigned encoding examples](03.07-common-fields-and-encoding.md#374-unsigned-encoding) + +Table 9, Default unsigned encoding examples + +| Value (hex) | Unsigned 8 bit representation (decimal) | +| --- | --- | +| 0x00 | 0 | +| 0x01 | 1 | +| 0x02 | 2 | +| 0x7F | 127 | +| 0x80 | 128 | +| 0xFE | 254 | +| 0xFF | 255 | + +| Value (hex) | Unsigned 16 bit representation (decimal) | +| --- | --- | +| 0x0000 | 0 | +| 0x0001 | 1 | +| 0x0002 | 2 | +| 0x7FFF | 32767 | +| 0x8000 | 32768 | +| 0xFFFE | 65534 | +| 0xFFFF | 65535 | + +| Value (hex) | Unsigned 32 bit representation (decimal) | +| --- | --- | +| 0x00000000 | 0 | +| 0x00000001 | 1 | +| 0x00000002 | 2 | +| 0x7FFFFFFF | 2147483647 | +| 0x80000000 | 2147483648 | +| 0xFFFFFFFE | 4294967294 | +| 0xFFFFFFFF | 4294967295 | + +## 3.7.5 Signed encoding + +Some fields use the signed encoding representation.Signed encoding is using the two’s complement [representation. Fields using signed encoding MUST comply with Table 10, Signed field encoding (two’s complement representation).](03.07-common-fields-and-encoding.md#375-signed-encoding) + +Table 10, Signed field encoding (two’s complement representation) + +| Value (hex) | Signed 8 bit representation (decimal) | +| --- | --- | +| 0x7F | 127 | +| 0x02 | 2 | +| 0x01 | 1 | +| 0x00 | 0 | +| 0xFF | -1 | +| 0xFE | -2 | +| 0x80 | -128 | + +| Value (hex) | Signed 16 bit representation (decimal) | +| --- | --- | +| 0x7FFF | 32767 | +| 0x0002 | 2 | +| 0x0001 | 1 | +| 0x0000 | 0 | +| 0xFFFF | -1 | +| 0xFFFE | -2 | +| 0x8000 | -32768 | + +| Value (hex) | Signed 32 bit representation (decimal) | +| --- | --- | +| 0x7FFFFFFF | 2147483647 | +| 0x00000002 | 2 | +| 0x00000001 | 1 | +| 0x00000000 | 0 | +| 0xFFFFFFFF | -1 | +| 0xFFFFFFFE | -2 | +| 0x80000000 | -2147483648 | + +## 3.7.6 Fields values and version + +New Command Class versions may define new possible values for a field introduced previously. In that case, a version column is added to the value table. A supporting node MUST support the values associated its version and previous versions and MUST NOT support values associated to future [versions. An example is given in Table 11, Field values and Command Class version (example).](03.07-common-fields-and-encoding.md#376-fields-values-and-version) + +Table 11, Field values and Command Class version (example) + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Value introduced in version 1, valid and mandatory in all versions | 1 | +| 0x01 | Value introduced in version 2, valid and mandatory in version 2 and newer Version 1 MUST consider this value as reserved | 2 | +| 0x02 | Value introduced in version 2, valid and mandatory in version 2 and newer Version 1 MUST consider this value as reserved | 2 | +| 0xFF | Value introduced in version 3, valid and mandatory in version 3 and newer Version 1 and 2 MUST consider this value as reserved | 3 | diff --git a/docs/specs/command-class-specification/03-command-class-overview/index.md b/docs/specs/application-command-class-specification/03-command-class-overview/index.md similarity index 89% rename from docs/specs/command-class-specification/03-command-class-overview/index.md rename to docs/specs/application-command-class-specification/03-command-class-overview/index.md index ce2d82a..364baf7 100644 --- a/docs/specs/command-class-specification/03-command-class-overview/index.md +++ b/docs/specs/application-command-class-specification/03-command-class-overview/index.md @@ -1,9 +1,9 @@ # 3 Command Class Overview diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md index 20f6b99..30a6e94 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.01-alarm-command-class-version-1-deprecated.md @@ -1,9 +1,9 @@ # 4.1 Alarm Command Class, version 1 [DEPRECATED] @@ -23,13 +23,15 @@ This command is used to get the value of an alarm. The Alarm Report Command MUST be returned in response to this command if the alarm type is supported. -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. +This command MUST NOT be issued via multicast addressing. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM GET _ | | | | | | | | +| Alarm Type | | | | | | | | Alarm Type (8 bits) @@ -39,12 +41,12 @@ The Alarm Type field specifies which alarm is being requested. The alarm types a This command is used to report the type and level of an alarm. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | -| Alarm Level | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM REPORT _ | | | | | | | | +| Alarm Type | | | | | | | | +| Alarm Level | | | | | | | | Alarm Type (8 bits) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md similarity index 54% rename from docs/specs/command-class-specification/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md index 81f3cee..e6badeb 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.02-alarm-command-class-version-2-deprecated.md @@ -1,9 +1,9 @@ # 4.2 Alarm Command Class, version 2 [DEPRECATED] @@ -15,7 +15,9 @@ The Alarm Command Class is intended for Z-Wave enabled devices capable of report Version 2 of the Alarm Command Class is improved with the following functionalities: - Alarm Types defined by the Z-Wave Alliance  Interview process of supported Alarm Types + Alarm Types defined by the Z-Wave Alliance + + Interview process of supported Alarm Types The commands not described in this version remain unchanged from Alarm Command Class, version 1. @@ -27,20 +29,22 @@ The commands not described in this version remain unchanged from Alarm Command C This command is used to set the activity of the Z-Wave Alarm Type and Status. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Z-Wave Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | -| Z-Wave Alarm Status | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM SET _ | | | | | | | | +| Z-Wave Alarm Type | | | | | | | | +| Z-Wave Alarm Status | | | | | | | | Z-Wave Alarm Type (8 bits) -[Refer to 4.1.3 Alarm Report Command](04.01-alarm-command-class-version-1-deprecated.md#413-alarm-report-command) Z-Wave Alarm Status (8 bits) +[Refer to 4.1.3 Alarm Report Command](04.01-alarm-command-class-version-1-deprecated.md#413-alarm-report-command) + +Z-Wave Alarm Status (8 bits) This field is used to set the state of the Alarm Type. The value 0x00 will deactivate the alarm and 0xFF will activate the alarm i.e. unsolicited Alarm Report Command will be transmitted to the node(s) defined in the Node field(s) when triggered by an event. Any other value is reserved for future use. -Note: The factory default state MUST be described in the product manual. All Z-Wave enabled devices MUST be able to operate based on factory default settings i.e. an end-user MUST NOT be forced to set- up the states of the device in order to operate. The factory default state of the Z-Wave Alarm Status CC:0071.02.06.12.001 SHOULD be enabled. +Note: The factory default state MUST be described in the product manual. All Z-Wave enabled devices CC:0071.02.06.11.002 MUST be able to operate based on factory default settings i.e. an end-user MUST NOT be forced to set- up the states of the device in order to operate. The factory default state of the Z-Wave Alarm Status SHOULD be enabled. Products that do not allow deactivation of a specific Alarm Type, MUST respond to a Alarm Configuration Set deactivating the Alarm Type in question by returning an Application Rejected Request Command of the Application Status Command Class. @@ -50,43 +54,43 @@ The Alarm Get Command is used to request the alarm state for a specific alarm ty The Alarm Report Command MUST be returned in response to this command if the alarm type is supported. -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. +This command MUST NOT be issued via multicast addressing. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | -| Z-Wave Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -Alarm Type (8 bits) +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM GET _ | | | | | | | | +| Alarm Type | | | | | | | | +| Z-Wave Alarm Type | | | | | | | | -This field refers to the Alarm Type of Alarm Command Class (Version 1) i.e. the application specific Alarm Type which is not defined by the Z-Wave Alliance. If the ‘V1 Alarm’ field is set to ‘0’ as reported via the Alarm Type Supported Report Command, this field MUST be set to ‘0’ when requesting the report. +Alarm Type (8 bits) -Z-Wave Alarm Type (8 bits) +This field refers to the Alarm Type of Alarm Command Class (Version 1) i.e. the application specific Alarm Type which is not defined by the Z-Wave Alliance. If the ‘V1 Alarm’ field is set to ‘0’ as reported via the Alarm Type Supported Report Command, this field MUST be set to ‘0’ when requesting the report. Z-Wave Alarm Type (8 bits) The Z-Wave Alarm Type field MUST contain the Alarm Type identifier described in Alarm Report Command. This parameter refers to the Alarm Types defined by the Z-Wave Alliance. -A node receiving a non-supported Z-Wave Alarm Type MUST ignore the command. A controlling node SHOULD interview the device for supported Alarm Types by means of Alarm Type Supported Get Command prior to Alarm Get. +A node receiving a non-supported Z-Wave Alarm Type MUST ignore the command. A controlling node CC:0071.02.04.12.001 SHOULD interview the device for supported Alarm Types by means of Alarm Type Supported Get Command prior to Alarm Get. ## 4.2.4 Alarm Report Command This command is used by the application to report the alarm state. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | -| Alarm Level | | | | | | | | | | | | | | | | | | | | | | | | -| Zensor Net Source Node ID | | | | | | | | | | | | | | | | | | | | | | | | -| Z-Wave Alarm Status | | | | | | | | | | | | | | | | | | | | | | | | -| Z-Wave Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | -| Z-Wave Alarm Event | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Event Parameters | | | | | | | | | | | | | | | | | | | | | | | | -| Event Parameter 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Event Parameter N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM REPORT _ | | | | | | | | +| Alarm Type | | | | | | | | +| Alarm Level | | | | | | | | +| Zensor Net Source Node ID | | | | | | | | +| Z-Wave Alarm Status | | | | | | | | +| Z-Wave Alarm Type | | | | | | | | +| Z-Wave Alarm Event | | | | | | | | +| Number of Event Parameters | | | | | | | | +| Event Parameter 1 | | | | | | | | +| ... | | | | | | | | +| Event Parameter N | | | | | | | | Alarm Type (8 bits) @@ -102,13 +106,13 @@ Specify the Zensor Net Source Node ID, which detected the alarm condition. In Ze Z-Wave Alarm Status (8 bits) -[Refer to 4.2.2 Alarm Set Command](04.02-alarm-command-class-version-2-deprecated.md#422-alarm-set-command) +[Refer to 4.2.2 Alarm Set Command](04.02-alarm-command-class-version-2-deprecated.md#422-alarm-set-command) Number of Event Parameters (8 bits) -Number of Event Parameters (8 bits) +Indicates the Number of Event Parameters fields used in bytes. -Indicates the Number of Event Parameters fields used in bytes. Z-Wave Alarm Type (8 bits), Z-Wave Alarm Event (8 bits) and Event Parameters (N Byte) +Z-Wave Alarm Type (8 bits), Z-Wave Alarm Event (8 bits) and Event Parameters (N Byte) -[[18] specifies the Alarm Types and its subordinate parameters defined by the Z-Wave Alliance. The fields](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) that do not contain any definition of the Z-Wave Alarm Type MUST be set to ‘0’ in the Alarm Report Command. +[[18] specifies the Alarm Types and its subordinate parameters defined by the Z-Wave Alliance. The](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) CC:0071.02.05.11.002 fields that do not contain any definition of the Z-Wave Alarm Type MUST be set to ‘0’ in the Alarm Report Command. The device MUST advertise support of the Command Class which is included for the specific Alarm Type. Example: for Smoke Alarm, Smoke Detected the Node Naming and Location Command Class MUST be advertised as supported in the Node Information Frame. @@ -122,25 +126,27 @@ This command is used to request the supported alarm types. The Alarm Type Supported Report Command MUST be returned in response to an Alarm Type Supported Get command. -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM TYPE SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM TYPE SUPPORTED GET _ _ _ | | | | | | | | ## 4.2.6 Alarm Type Supported Report Command This command is used to advertise the supported alarm types in the application. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ALARM TYPE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| V1 Alarm | | | Reserved | | | | | | Number of Bit Masks | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ALARM _ _ | | | | | | | | +| Command = ALARM TYPE SUPPORTED REPORT _ _ _ | | | | | | | | +| V1 Alarm | Reserved | | Number of Bit Masks | | | | | +| Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Bit Mask N | | | | | | | | V1 Alarm (1 bit) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md similarity index 61% rename from docs/specs/command-class-specification/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md index 14936bf..1805d91 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.03-alarm-sensor-command-class-version-1-deprecated.md @@ -1,9 +1,9 @@ # 4.3 Alarm Sensor Command Class, version 1 [DEPRECATED] @@ -21,39 +21,39 @@ The Alarm Sensor Report Command MUST be returned in response to this command if This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR ALARM GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | +| Command = SENSOR ALARM GET _ _ | | | | | | | | +| Sensor Type | | | | | | | | Sensor Type (8 bits) [Sensor Type specifies what type of sensor this command originates from. Refer to Table 12. The sensor](04.03-alarm-sensor-command-class-version-1-deprecated.md#431-alarm-sensor-get-command) type value 0xFF returns the first found supported sensor type in the bit mask (starting from bit 0 in Bit Mask 1) by the Alarm Sensor Supported Report. Table 12, Alarm Sensor Get::Sensor Type encoding -| | Value | | | Sensor Type | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | General Purpose Alarm | | | -| 0x01 | | | Smoke Alarm | | | -| 0x02 | | | CO Alarm | | | -| 0x03 | | | CO Alarm 2 | | | -| 0x04 | | | Heat Alarm | | | -| 0x05 | | | Water Leak Alarm | | | -| 0xFF | | | Return first Alarm on supported list | | | +| Value | Sensor Type | +| --- | --- | +| 0x00 | General Purpose Alarm | +| 0x01 | Smoke Alarm | +| 0x02 | CO Alarm | +| 0x03 | CO Alarm 2 | +| 0x04 | Heat Alarm | +| 0x05 | Water Leak Alarm | +| 0xFF | Return first Alarm on supported list | ## 4.3.2 Alarm Sensor Report Command This command is used to advertise the alarm state. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR ALARM REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Source Node ID | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor State | | | | | | | | | | | | | | | | | | | | | | | | -| Seconds 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Seconds 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | +| Command = SENSOR ALARM REPORT _ _ | | | | | | | | +| Source Node ID | | | | | | | | +| Sensor Type | | | | | | | | +| Sensor State | | | | | | | | +| Seconds 1 (MSB) | | | | | | | | +| Seconds 2 (LSB) | | | | | | | | Source Node ID (8 bits) @@ -79,23 +79,23 @@ The Alarm Sensor Supported Report Command MUST be returned in response to this c This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR ALARM SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | +| Command = SENSOR ALARM SUPPORTED GET _ _ _ | | | | | | | | ## 4.3.4 Alarm Sensor Supported Report Command This command is used to report the supported sensor types from the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR ALARM SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Bit Masks | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR ALARM _ _ _ | | | | | | | | +| Command = SENSOR ALARM SUPPORTED REPORT _ _ _ | | | | | | | | +| Number of Bit Masks | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | Number of Bit Masks (8 bits) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md new file mode 100644 index 0000000..9372aae --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md @@ -0,0 +1,51 @@ + +# 4.4 Alarm Silence Command Class, version 1 + +The Alarm Silence Command Class may be used to temporarily disable the sounding of the alarm but still keep the alarm operating. + +## 4.4.1 Alarm Silence Set Command + +This command is used to remotely silence the sensor alarm. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SILENCE ALARM _ _ _ | | | | | | | | +| Command = SENSOR ALARM SET _ _ | | | | | | | | +| Mode | | | | | | | | +| Seconds 1 (MSB) | | | | | | | | +| Seconds 2 (LSB) | | | | | | | | +| Number of Bit Masks | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Mode (8 bits) + +Mode specifies the different options to silence sensor alarms. Modes are defined by the Z-Wave Alliance. + +| Value | Mode | +| --- | --- | +| 0x00 | Disable sounding of all sensor alarms independent of bit mask | +| 0x01 | Disable sounding of all sensor alarms independent of bit mask which have received the alarm via the Sensor Alarm Report command | +| 0x02 | Disable sounding of all sensor alarms according to bit mask | +| 0x03 | Disable sounding of all sensor alarms according to bit mask which have received the alarm via the Alarm Sensor Report Command | + +Seconds (16 bits) + +The field Seconds indicates the duration sounding of the alarm must be disable but still keep the alarm operating. If silence is engaged, the alarm will come back on when the duration expires unless the originating sensor clears the alarm. The value 0x0000 indicates that the time field MUST be ignored. Number of Bit Masks (8 bits) + +Indicates the Number of Bit Masks fields used in bytes. + +Bit Mask (N Bytes) + +The Bit Mask fields describe the sensor types to disable sounding from. + + Bit 0 in Bit Mask 1 indicates if Sensor Type = 0 (General Alarm) is disabled.  Bit 1 in Bit Mask 1 indicates if Sensor Type = 1 (Smoke Alarm) is disabled.  … + +If the sensor type is disabled the bit MUST be set to 1. If the sensor type is not disabled the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last sensor type to be disabled. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.05-all-switch-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.05-all-switch-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..5037740 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.05-all-switch-command-class-version-1-obsoleted.md @@ -0,0 +1,81 @@ + +# 4.5 All Switch Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST NOT support this Command Class. Controlling nodes MUST use S2 Multicast mechanism in order to achieve the All On and All Off functionality + +The All Switch Command Class is used to switch all devices on or off. Devices may be excluded/included from the all on/all off functionality. The application determines which devices there are included in the all on/all off functionality as default. + +## 4.5.1 All Switch Set Command + +This command is used to instruct a device if it is included or excluded from the all on/all off functionality. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | +| Command = SWITCH ALL SET _ _ | | | | | | | | +| Mode | | | | | | | | + +Mode (8 bits) + +The mode field used to set the all on/all off functionality of the device. + +| Mode | Description | +| --- | --- | +| 0x00 | Indicate that the switch is excluded from the all on/all off functionality. | +| 0x01 | Indicate that the switch is excluded from the all on functionality but not all off. | +| 0x02 | Indicate that the switch is excluded from the all off functionality but not all on. | +| 0x03..0xFE | Reserved | +| 0xFF | Indicates that the switch is included in the all on/all off functionality. | + +## 4.5.2 All Switch Get Command + +This command is used to ask a device if it is included or excluded from the all on/all off functionality. + +The All Switch Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | +| Command = SWITCH ALL GET _ _ | | | | | | | | + +## 4.5.3 All Switch Report Command + +This command is used to report if the device is included or excluded from the all on/all off functionality. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | +| Command = SWITCH ALL REPORT _ _ | | | | | | | | +| Mode | | | | | | | | + +Mode (8 bits) + +Refer to the All Switch Set Command. + +## 4.5.4 All Switch On Command + +This command is used to inform a switch that it SHOULD be turned on. A receiving device MUST NOT react to this command if the actual operation has been prohibited via the Switch All Set command. Like the Basic Set On command, this command MUST cause the device to restore the most recent (non-zero) level. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | +| Command = SWITCH ALL ON _ _ | | | | | | | | + +## 4.5.5 All Switch Off Command + +This command is used to inform a switch that it SHOULD be turned off. A receiving device MUST NOT react to this command if the actual operation has been prohibited via the Switch All Set command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | +| Command = SWITCH ALL OFF _ _ | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.02-anti-theft-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.06-anti-theft-command-class-version-1-obsoleted.md similarity index 82% rename from docs/specs/command-class-specification/04-command-class-definitions/04.02-anti-theft-command-class-version-1-obsoleted.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.06-anti-theft-command-class-version-1-obsoleted.md index e3ee0ca..68d74e4 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.02-anti-theft-command-class-version-1-obsoleted.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.06-anti-theft-command-class-version-1-obsoleted.md @@ -1,15 +1,15 @@ -# 4.2 Anti-theft Command Class, version 1 [OBSOLETED] +# 4.6 Anti-theft Command Class, version 1 [OBSOLETED] THIS COMMAND CLASS VERSION HAS BEEN OBSOLETED -New implementations MUST use the Anti-theft Command Class Version 2. +New implementations MUST use the Anti-theft Command Class Version 2 or newer. The Anti-theft Command Class is used to disable a subset of supported/controlled command classes in a device if the device is being excluded and re-included into a Z-Wave network again. This command class is typically used when installing a Z-Wave device in a public location such as a hotel room or conference center. The command class allows the user to lock the device to the actual Z-Wave network and to render it useless if it is removed from the local network without being unlocked. Another application would be to protect service provider owned products from leaving the service providers network before they are paid for. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.03-anti-theft-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.07-anti-theft-command-class-version-2-deprecated.md similarity index 55% rename from docs/specs/command-class-specification/04-command-class-definitions/04.03-anti-theft-command-class-version-2.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.07-anti-theft-command-class-version-2-deprecated.md index 2ce5a80..eb0b85b 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.03-anti-theft-command-class-version-2.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.07-anti-theft-command-class-version-2-deprecated.md @@ -1,11 +1,15 @@ -# 4.3 Anti-theft Command Class, version 2 +# 4.7 Anti-theft Command Class, version 2 [DEPRECATED] + +THIS COMMAND CLASS VERSION HAS BEEN DEPRECATED + +New implementations SHOULD use the Anti-theft Command Class, version 3. The Anti-theft Command Class MUST NOT be supported unless the Device Class or Device Type implemented by the device explicitly allows for support of the Anti-theft Command Class. @@ -23,28 +27,28 @@ The protection state may be updated by sending the set command with the correct The Anti-theft protection state must be preserved in the following situations: - Exclusion of a network  Reset to factory default  OTA update of firmware + Exclusion of a network  Reset to factory default  OTA update of firmware If secure device, supports Anti-theft Command Class, Security Command Class needs to be supported regardless of anti-theft protection state. A security enabled device MUST be able to join any secure Z- Wave network regardless of its anti-theft protection state. -If secure device, supports Anti-theft Command Class, Security Command Class needs to be supported regardless of anti-theft protection state. A security enabled device MUST be able to join any secure Z- Wave network regardless of its anti-theft protection state. It is RECOMMENDED for a device that supports anti-theft protection to have physical mark that indicates that this device is capable of being locked. It is further RECOMMENDED that the device is capable of signaling via a LED or other means if the device refuses inclusion in a network because the device is locked to another network. Finally, the user guide and installation manual MUST advertise support of anti-theft protection. +It is RECOMMENDED for a device that supports anti-theft protection to have physical mark that indicates that this device is capable of being locked. It is further RECOMMENDED that the device is capable of signaling via a LED or other means if the device refuses inclusion in a network because the device is locked to another network. Finally, the user guide and installation manual MUST advertise support of anti-theft protection. -## 4.3.1 Anti-theft Set Command +## 4.7.1 Anti-theft Set Command -This command is used to enable/disable anti-theft protection in a device already included into a Z-Wave Network by sending a magic code to device in question. The same magic code MUST be used to disable anti-theft protection again. A new magic code may be used the next time to enable anti-theft protection in the device, but only if protection is disabled at the time. A new device MUST have anti-theft protection disabled. Enabling anti-theft protection in an already-enabled device restores it to normal operation if it is in reduced functionality mode, but otherwise has no effect. +This command is used to enable/disable anti-theft protection in a device already included into a Z-Wave Network by sending a magic code to device in question. The same magic code MUST be used to disable anti-theft protection again. A new magic code may be used the next time to enable anti-theft protection in the device, but only if protection is disabled at the time. A new device MUST have anti- theft protection disabled. Enabling anti-theft protection in an already-enabled device restores it to normal operation if it is in reduced functionality mode, but otherwise has no effect. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ANTITHEFT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ANTITHEFT SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Enable | | | Number of Magic Code bytes | | | | | | | | | | | | | | | | | | | | | -| Magic Code 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Magic Code N | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer ID MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer ID LSB | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Hint Number Bytes | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Hint Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Hint Byte N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT _ _ | | | | | | | | +| Command = ANTITHEFT SET _ | | | | | | | | +| Enable | Number of Magic Code bytes | | | | | | | +| Magic Code 1 | | | | | | | | +| … | | | | | | | | +| Magic Code N | | | | | | | | +| Manufacturer ID MSB | | | | | | | | +| Manufacturer ID LSB | | | | | | | | +| Anti-theft Hint Number Bytes | | | | | | | | +| Anti-theft Hint Byte 1 | | | | | | | | +| … | | | | | | | | +| Anti-theft Hint Byte N | | | | | | | | Enable (1 bit) @@ -56,11 +60,13 @@ Indicates the Number of Magic Code fields N used in bytes. Maximum number of Mag Magic Code (N bytes) -The Magic Code fields hold the code to enable/disable the Z-Wave device in question. Manufacturer ID (2 bytes) +The Magic Code fields hold the code to enable/disable the Z-Wave device in question. + +Manufacturer ID (2 bytes) -The Manufacturer ID of the company’s product having a central role in the application requiring anti-theft protection enabled. Device should report 0xFFFF if anti-theft protection is disabled. +The Manufacturer ID of the company’s product having a central role in the application requiring anti- theft protection enabled. Device should report 0xFFFF if anti-theft protection is disabled. -[Manufacturer identifiers can be found in [12].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[Manufacturer identifiers can be found in [12].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Number of Anti-theft Hint bytes (8 bits) @@ -70,7 +76,7 @@ Anti-theft Hint Byte (N bytes) Anti-theft Hint Bytes that may be used as an identifier or key value for retrieving the Magic Code. The exact format and meaning of these Bytes is specific to the product or service that enabled anti-theft protection on the device, as identified by the Manufacturer ID above. If it is necessary to render the Hint Bytes for display, each byte should be interpreted as an unsigned integer value and represented in hexadecimal. -## 4.3.2 Anti-theft Get Command +## 4.7.2 Anti-theft Get Command This command is used to get an Anti-theft Report Command showing status of the Z-Wave device in question. @@ -78,42 +84,42 @@ The Anti-theft Report Command MUST be returned in response to this command. This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ANTITHEFT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ANTITHEFT GET _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT _ _ | | | | | | | | +| Command = ANTITHEFT GET _ | | | | | | | | -## 4.3.3 Anti-theft Report Command +## 4.7.3 Anti-theft Report Command This command is used to report status of the Z-Wave device in question. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ANTITHEFT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ANTITHEFT REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Protection Status | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer ID MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer ID LSB | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Hint Number Bytes | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Hint Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Anti-theft Hint Byte N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT _ _ | | | | | | | | +| Command = ANTITHEFT REPORT _ | | | | | | | | +| Anti-theft Protection Status | | | | | | | | +| Manufacturer ID MSB | | | | | | | | +| Manufacturer ID LSB | | | | | | | | +| Anti-theft Hint Number Bytes | | | | | | | | +| Anti-theft Hint Byte 1 | | | | | | | | +| … | | | | | | | | +| Anti-theft Hint Byte N | | | | | | | | Anti-theft Protection Status (8 bits) Anti-theft Protection Status specifies the actual status of Z-Wave device in question. Refer to the table below with respect to defined status values. -| | Value | | | Anti-theft Protection Status | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved. | | | -| 0x01 | | | Anti-Theft Protection is currently DISABLED, and the Z-Wave Device is fully functional. | | | -| 0x02 | | | Anti-Theft Protection is currently ENABLED, and the Z-Wave Device is fully functional. | | | -| 0x03 | | | Anti-Theft Protection is currently ENABLED, and the Z-Wave Device is NOT fully functional (i.e., the Device was excluded from a network without disabling protection, and an ANTITHEFT SET command with the correct Magic Code has not yet been received in _ the current network). | | | -| 0x04..0xFF | | | Reserved | | | +| Value | Anti-theft Protection Status | +| --- | --- | +| 0x00 | Reserved. | +| 0x01 | Anti-Theft Protection is currently DISABLED, and the Z-Wave Device is fully functional. | +| 0x02 | Anti-Theft Protection is currently ENABLED, and the Z-Wave Device is fully functional. | +| 0x03 | Anti-Theft Protection is currently ENABLED, and the Z-Wave Device is NOT fully functional (i.e., the Device was excluded from a network without disabling protection, and an ANTITHEFT SET command with the correct Magic Code has not yet been _ received in the current network). | +| 0x04..0xFF | Reserved | Manufacturer ID (2 bytes) -The Manufacturer ID of the company’s product having a central role in the application requiring anti-theft protection enabled. Device should report 0xFFFF if anti-theft protection is disabled. +The Manufacturer ID of the company’s product having a central role in the application requiring anti- theft protection enabled. Device should report 0xFFFF if anti-theft protection is disabled. Number of Anti-theft Hint bytes (8 bits) @@ -123,51 +129,65 @@ Anti-theft Hint Byte (N bytes) Anti-theft Hint Bytes. See the Anti-Theft Set Command for more details. -## 4.3.4 Examples +## 4.7.4 Examples Following examples are for reference only. -### 4.3.4.1 Example of a non-secure Thermostat +### 4.7.4.1 Example of a non-secure Thermostat Below is shown an example of the Node Information Frame (NIF) content for a non-secure thermostat. The first NIF shows a device having anti-theft protection disabled. The device may never been included into a network or reside in a network or excluded from a network: -| | Disabled anti-theft protection | | -| --- | --- | --- | -| Manufacturer Specific Command Class | | | -| Version Command Class | | | -| Anti-theft Command Class | | | -| Thermostat Operating State Command Class | | | -| Thermostat Mode Command Class | | | -| Association Command Class | | | -| Battery Command Class | | | +Disabled anti-theft protection + +Manufacturer Specific Command Class + +Version Command Class + +Anti-theft Command Class + +Thermostat Operating State Command Class + +Thermostat Mode Command Class + +Association Command Class + +Battery Command Class The second NIF shows a device having anti-theft protection enabled. The device may be excluded from network in which it was originally anti-theft protection enabled or re-included into a network. This also applies in case device is re-included into the network, which device originally was anti-theft protection enabled: -| | Enabled anti-theft protection | | -| --- | --- | --- | -| Manufacturer Specific Command Class | | | -| Version Command Class | | | -| Anti-theft Command Class | | | +Enabled anti-theft protection -### 4.3.4.2 Example of a security enabled Thermostat +Manufacturer Specific Command Class + +Version Command Class + +Anti-theft Command Class + +### 4.7.4.2 Example of a security enabled Thermostat Below is shown an example of the Node Information Frame (NIF) content for a security enabled thermostat. The first NIF shows a device having anti-theft protection disabled. The device may never been included into a network or reside in a network or excluded from a network: -| | Disabled anti-theft protection | | -| --- | --- | --- | -| Manufacturer Specific Command Class | | | -| Version Command Class | | | -| Security Command Class | | | +Disabled anti-theft protection + +Manufacturer Specific Command Class + +Version Command Class Disabled anti-theft protection -Finally, the Security Commands Supported Report Command reports support of the following command classes:  Anti-theft Command Class  Thermostat Operating State Command Class  Thermostat Mode Command Class  Association Command Class  Battery Command Class +Security Command Class + +Finally, the Security Commands Supported Report Command reports support of the following command classes: + + Anti-theft Command Class  Thermostat Operating State Command Class  Thermostat Mode Command Class  Association Command Class  Battery Command Class The second NIF shows a device having anti-theft protection enabled. The device may be excluded from network in which it was originally anti-theft protection enabled or re-included into a network. This also applies in case device is re-included into the network, which device originally was anti-theft protection enabled. The NIF is unchanged because all application oriented command classes are security encapsulated except the default command classes: -| | Enabled anti-theft protection | | -| --- | --- | --- | -| Manufacturer Specific Command Class | | | -| Version Command Class | | | -| Security Command Class | | | +Enabled anti-theft protection + +Manufacturer Specific Command Class + +Version Command Class + +Security Command Class Finally, the Security Commands Supported Report Command reports support of at least the Anti-theft Command Class to be able to disable anti-theft protection: diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.08-anti-theft-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.08-anti-theft-command-class-version-3.md new file mode 100644 index 0000000..c56750f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.08-anti-theft-command-class-version-3.md @@ -0,0 +1,196 @@ + +# 4.8 Anti-theft Command Class, version 3 + +This Command Class is used to lock (and possibly unlock) a node. + +## 4.8.1 Compatibility Considerations + +### 4.8.1.1 Command Class dependencies + +A node supporting this Command Class MUST also support the Anti-Theft Unlock Command Class, version 1. + +### 4.8.1.2 Lock/Unlock requirements + +The Anti-Theft Command Class is intended for devices operating in public locations such as hotel rooms or a conference center. The purpose of the Anti-theft Command Class is to render a device useless if it is removed from its actual network without being unlocked by the owner or a service provider. + +A node can be locked (or protected) or unlocked. + +The unlocked state means that the node will operate normally in any Z-Wave network. + +The locked state means that the node will restrict usage of most of its command classes after being excluded from a network, so that it cannot be used by any controlling unit. The locked state MUST persist after the following operations: + + Network inclusion/exclusion  Factory reset to default.  Firmware upgrade + +When a node is locked and either excluded from a network or factory reset to default, it will enter its restricted mode. In the restricted mode, the node will not grant access to its application functionalities. The restricted mode MUST stop when the node is unlocked again. + +When a node runs in the restricted mode, the NIF MUST adapt its content to reflect the currently supported Command Classes. The following Command Classes MUST still be supported when a node is running in restricted mode: + + Anti-Theft Command Class  Anti-Theft Unlock Command Class  Manufacturer Specific Command Class  Version Command Class  Wake-Up Command Class  All Command Classes that MUST always be supported at the non-secure level, refer to SDS13548 (see “This Command Class MUST always be in the NIF if supported”) + +All other supported command classes SHOULD be removed in the restricted mode. + +The locked state may be changed back to unlocked with this Command Class or the Anti-Theft Unlock Command Class. + +When in restricted mode, a node MUST still be able to enter learn mode and join or leave a Z-Wave Network and support Z-Wave protocol operations. + +### 4.8.1.3 Multi Channel Considerations + +Multi Channel End Points SHOULD NOT support Anti-theft Command Class. + +## 4.8.2 Anti-Theft Set Command + +This command is used to lock or unlock a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT (0x5D) _ _ | | | | | | | | +| Command = ANTITHEFT SET (0x01) _ | | | | | | | | +| State | Number of Magic Code bytes | | | | | | | +| Magic Code 1 | | | | | | | | +| … | | | | | | | | +| Magic Code N | | | | | | | | +| Manufacturer ID (MSB) | | | | | | | | +| Manufacturer ID (LSB) | | | | | | | | +| Anti-theft Hint Length | | | | | | | | +| Anti-theft Hint | | | | | | | | +| … | | | | | | | | +| Anti-theft Hint M | | | | | | | | +| Z-Wave Alliance locking entity ID (MSB) | | | | | | | | +| Z-Wave Alliance locking entity ID (LSB) | | | | | | | | + +State (1 bit) + +This field MUST indicate the desired locked/unlocked state for the receiving node. + +The value 0 MUST indicate that the supporting node MUST change its state to unlocked. The value 1 MUST indicate that the supporting node MUST change its state to locked. + +If the receiving node is currently locked and this field is set to 0 (unlock), the receiving node MUST change its state to unlocked if the Magic Code field value matches the Magic Code value that was used to lock the node. + +If the receiving node is currently locked and this field is set to 1 (lock), the receiving node MUST ignore this command. If the receiving node is currently unlocked and this field is set to 0 (unlock), the receiving node MUST ignore this command. + +If the receiving node is currently unlocked and this field is set to 1 (lock), the receiving node MUST change its state to lock and save the associated Magic code, Manufacturer ID, Anti-Theft Hint and Z- Wave Alliance locking entity ID. Magic Code Length (7 bit) + +This field MUST indicate the length (in byte) of the Magic Code field. This field MUST be in the range 1..10. + +Magic Code (N bytes) + +This field contains the Magic Code used to lock or unlock the node. + +The length of this field in byte MUST be according to the Magic Code Length field. + +The receiving node MUST change its state from locked to unlocked if and only if this field’s value matches the Magic Code that was used to lock the node. + +Manufacturer ID (2 bytes) + +This field describes the Z-Wave Manufacturer ID of the company’s product that has locked the node. + +This field MUST be set to 0x00 by a sending node and ignored by a receiving node if the S tate field is set to 0. + +If a controlling node has a Z-Wave Manufacturer ID assigned, this field MUST be set to its assigned Manufacturer ID in SDS13425. + +If a controlling node has no Z-Wave Manufacturer ID assigned, this field MUST be set to 0x00. + +Anti-theft Hint Length (8 bits) + +This field MUST indicate the length (in byte) of the Anti-Theft Hint field. This field MUST be in the range 0..10. + +Anti-theft Hint (N bytes) + +This field is used as an identifier or key value to help retriving the Magic Code. + +The length of this field in byte MUST be according to the Anti-Theft Hint Length field. This field MUST be omitted if the Anti-Theft Hint Length field is set to 0. + +The format of this field is manufacturer/controlling node specific. + +Z-Wave Alliance locking entity ID (2 bytes) + +This field MUST specify a unique identifier for the entity that has locked the node. + +A supporting node MUST NOT change its state to locked if this field is omitted or set to 0x00. A controlling node MUST NOT lock a device without having a valid Z-Wave Alliance locking entity ID value. + +Contact the Z-Wave Alliance to get an ID assigned. With this ID, the Z-Wave alliance will be able to provide the following information: + + Name of the organization  Contact Phone for unlock information  Optional website/url  Optional unlock support email address + +This field MUST be set to 0x00 if the state field is set to 0. This field MUST NOT be set to 0x00 if the state field is set to 1. + +## 4.8.3 Anti-theft Get Command + +This command is used to request the locked/unlocked state of a supporting node. + +[The Anti-Theft Report Command MUST be returned in response to this command.](04.08-anti-theft-command-class-version-3.md#484-anti-theft-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT (0x5D) _ _ | | | | | | | | +| Command = ANTITHEFT GET (0x02) _ | | | | | | | | + +## 4.8.4 Anti-Theft Report Command + +This command is used to advertise the lock/unlock state of a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT (0x5D) _ _ | | | | | | | | +| Command = ANTITHEFT REPORT (0x03) _ | | | | | | | | +| Anti-theft Protection Status | | | | | | | | +| Manufacturer ID MSB | | | | | | | | +| Manufacturer ID LSB | | | | | | | | +| Anti-theft Hint Length | | | | | | | | +| Anti-theft Hint 1 | | | | | | | | +| … | | | | | | | | +| Anti-theft Hint N | | | | | | | | +| Z-Wave Alliance locking entity ID (MSB) | | | | | | | | +| Z-Wave Alliance locking entity ID (MSB) | | | | | | | | + +Anti-theft Protection Status (8 bits) + +Anti-theft Protection Status specifies the actual status of Z-Wave device in question. Refer to the table below with respect to defined status values. + +| Value | Description | +| --- | --- | +| 0x00 | Reserved. | +| 0x01 | Anti-Theft Protection is currently disabled, the node is unlocked | +| 0x02 | Anti-Theft Protection is currently enabled, the node is locked. However, it did not change network so it is fully functional. | +| 0x03 | Anti-Theft Protection is currently enabled, the node is locked. The node was reset and/or changed network and runs in restricted mode. | +| 0x04..0xFF | Reserved | + +Manufacturer ID (2 bytes) + +This field describes the Z-Wave Manufacturer ID of the company’s product that has locked the node. + +This field MUST be set to 0x00 if the Anti-theft Protection Status field is set to 0x01. + +If the Anti-theft Protection Status [field is set to 0x02 or 0x03 and a Z-Wave Manufacturer listed in [12]](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) has locked the node, this field will advertise the Manufacturer ID that was provided in the Anti-theft Set Command. + +If the Anti-theft Protection Status field is set to 0x02 or 0x03 and an entity who’s not a Z-Wave [Manfacturer listed in [12] has locked the node, this field will be set to 0x00.](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Anti-theft Hint Length (8 bits) + +This field MUST indicate the length (in byte) of the Anti-Theft Hint field. This field MUST be in the range 0..10. + +If the Anti-theft Protection Status field is set to 0x01, a sending node MUST set this field to 0. If the Anti-theft Protection Status field is set to 0x02 or 0x03, a sending node MUST advertise the length of the Anti-Theft Hint field that was used to lock the node. + +Anti-theft Hint (N bytes) + +This field is used as an identifier or key value to help retrieving the Magic Code. + +The length of this field in byte MUST be according to the Anti-Theft Hint Length field. This field MUST be omitted if the Anti-Theft Hint Length field is set to 0. + +[A supporting node MUST advertise the value that was specified in the Anti-Theft Set Command when it](04.08-anti-theft-command-class-version-3.md#482-anti-theft-set-command) got locked. Z-Wave Alliance locking entity ID (2 bytes) + +This field advertises a unique identifier for the entity that has locked the node. SDS14622 contains the valid assigned IDs with additional information about the entity. + +Contact the Z-Wave Alliance to get an ID assigned. With this ID, the Z-Wave alliance will be able to provide the following information: + + Name of the organization  Contact phone for unlock information  Optional website/url  Optional unlock support email address + +This field MUST be set to 0x00 if the Anti-theft Protection Status field is set to 0x01. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.09-anti-theft-unlock-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.09-anti-theft-unlock-command-class-version-1.md new file mode 100644 index 0000000..eb79885 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.09-anti-theft-unlock-command-class-version-1.md @@ -0,0 +1,131 @@ + +# 4.9 Anti-theft Unlock Command Class, version 1 + +This Command Class is used to unlock a device that has been locked by the Anti-theft Command Class. Controllers that do not lock devices still can control this command class in order to unlock devices that have been locked by previous owners. + +## 4.9.1 Compatibility Considerations + +A node supporting this Command Class MUST also support the Anti-Theft Command Class, version 3. + +### 4.9.1.1 Multi Channel Considerations + +Multi Channel End Points SHOULD NOT support the Anti-Theft Unlock Command Class. + +## 4.9.2 Anti-Theft Unlock State Get Command + +This command is used to request the locked/unlocked state of the node. + +[The Anti-Theft Unlock State Report Command MUST be returned in response to this command.](04.09-anti-theft-unlock-command-class-version-1.md#493-anti-theft-unlock-state-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT UNLOCK (0x7E) _ _ _ | | | | | | | | +| Command = COMMAND ANTITHEFT UNLOCK STATE GET (0x01) _ _ _ _ | | | | | | | | + +## 4.9.3 Anti-Theft Unlock State Report Command + +This command is used to advertise the current locked/unlocked state of the node with some additional information. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT UNLOCK (0x7E) _ _ _ | | | | | | | | +| Command = COMMAND ANTITHEFT UNLOCK STATE REPORT (0x02) _ _ _ _ | | | | | | | | +| Reserved | | Anti-theft Hint Length | | | | Restricted | State | +| Anti-theft Hint | | | | | | | | +| … | | | | | | | | +| Anti-theft Hint N | | | | | | | | +| Manufacturer ID (MSB) | | | | | | | | +| Manufacturer ID (LSB) | | | | | | | | +| Z-Wave Alliance locking entity ID (MSB) | | | | | | | | +| Z-Wave Alliance locking entity ID (MSB) | | | | | | | | + +State (1 bit) + +This field MUST indicate the current locked/unlocked state of the device. + +The value 0 MUST indicate that the supporting node is unlocked. The value 1 MUST indicate that the supporting node is locked. + +The value 0x01 from the Anti-theft Protection Status [field from the Anti-theft Report Command MUST](04.07-anti-theft-command-class-version-2-deprecated.md#473-anti-theft-report-command) be mapped to the value 0 for this field + +The values 0x02 and 0x03 from the Anti-theft Protection Status [field from the Anti-theft Report Command MUST be mapped to the value 1 for this field](04.07-anti-theft-command-class-version-2-deprecated.md#473-anti-theft-report-command) + +Restricted (1 bit) + +This field MUST indicate if the node currently runs in restricted mode. + +The value 0 MUST indicate that the supporting node is not restricted. The value 1 MUST indicate that the supporting node is restricted. + +This field MUST be set to 0 if the State field is set to 0. + +The values 0x01 and 0x02 from the Anti-theft Protection Status [field from the Anti-theft Report Command MUST be mapped to the value 0 for this field](04.07-anti-theft-command-class-version-2-deprecated.md#473-anti-theft-report-command) + +The value 0x03 from the Anti-theft Protection Status [field from the Anti-theft Report Command MUST](04.07-anti-theft-command-class-version-2-deprecated.md#473-anti-theft-report-command) be mapped to the value 1 for this field Anti-theft Hint Length (4 bits) + +This field MUST indicate the length (in byte) of the Anti-Theft Hint field. This field MUST be in the range 0..10. + +If the state field is set to 0, a sending node MUST set this field to 0. If the state field is set to 1, a sending node MUST advertise the length of the Anti-Theft Hint field that was used to lock the node. + +Anti-theft Hint (N bytes) + +This field is used as an identifier or key value to help retrieving the Magic Code. + +The length of this field in byte MUST be according to the Anti-Theft Hint Length field. This field MUST be omitted if the Anti-Theft Hint Length field is set to 0. + +[A supporting node MUST advertise the value that was specified in the Anti-Theft Set Command when it](04.08-anti-theft-command-class-version-3.md#482-anti-theft-set-command) got locked. + +Manufacturer ID (2 bytes) + +This field describes the Z-Wave Manufacturer ID of the company’s product that has locked the node. + +This field MUST be set to 0x00 if the state field is set to 0. + +[If the state field is set to 1 and a Z-Wave Manufacturer listed in [12] has locked the node, this field will](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) advertise the Manufacturer ID that was provided in the Anti-theft Set Command. + +[If the state field is set to 1 and an entity who’s not a Z-Wave Manfacturer listed in [12] has locked the](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) node, this field will be set to 0x00. + +Z-Wave Alliance locking entity ID (2 bytes) + +This field advertises a unique identifier for the entity that has locked the node. SDS14622 contains the valid assigned IDs with additional information about the entity. + +Contact the Z-Wave Alliance to get an ID assigned. With this ID, the Z-Wave alliance will be able to provide the following information: + + Name of the organization  Contact phone for unlock information  Optional website/url  Optional unlock support email address + +This field MUST be set to 0x00 if the state field is set to 0. + +[If the state field is set to 1, this field MUST advertise the ID that was provided in the Anti-Theft Set Command.](04.08-anti-theft-command-class-version-3.md#482-anti-theft-set-command) + +## 4.9.4 Anti-Theft Unlock Set Command + +This command is used to unlock a node that is currently locked. + +A receiving node MUST ignore this command if its current state is unlocked. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ANTITHEFT UNLOCK (0x7E) _ _ _ | | | | | | | | +| Command = COMMAND ANTITHEFT UNLOCK SET (0x03) _ _ _ | | | | | | | | +| Reserved | | | | Magic code length | | | | +| Magic Code 1 | | | | | | | | +| … | | | | | | | | +| Magic Code N | | | | | | | | + +Magic Code Length (4 bits) + +This field MUST indicate the length in byte of the Magic Code field. This field MUST be in the range 1..10 + +Magic Code (N bytes) + +This field contains the Magic Code used to unlock the node. + +The length of this field in byte MUST be according to the Magic Code Length field. + +The receiving node MUST change its state to unlocked (and exit restricted mode) if this field’s value matches the Magic Code that was used to lock the node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.01-terminology.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.01-terminology.md new file mode 100644 index 0000000..2c04966 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.01-terminology.md @@ -0,0 +1,16 @@ + +# 4.10.1 Terminology + +Authentication Data contents are initialized on a supporting node using a unique Authentication Data ID. Each Authentication Data ID also has an Authentication Technology Type, representing the input or technology with which the Authentication Data can be used. A user having access with several types of input technologies will have a Data Identifier for each of the technologies. + +A node may support one or more authentication technologies including User Code. Combination of valid sets of Authentication Data can be configured on a supporting node using a unique Authentication ID. The Authentication ID will for example allow a user only if he/she inputs both an RFID tag and the corresponding User Code. An actual user may be associated with several Authentication IDs. + +[An example of Authentication Data ID and Authentication ID configurations are described in Figure 6](04.10.13-examples-and-use-cases.md#41013-examples-and-use-cases) + +A node may support a Checksum functionality. A controlling node can request a checksum representing all authentication data content (either Authentication IDs or Authentication Data IDs) defined at the supporting node to ensure that the authentication data content databases are synchronized. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.02-interoperability-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.02-interoperability-considerations.md new file mode 100644 index 0000000..48f65d9 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.02-interoperability-considerations.md @@ -0,0 +1,18 @@ + +# 4.10.2 Interoperability Considerations + +This Command Class can be used in conjunction with the Entry Control Command Class, to report the Authentication Data input to a controlling application. + +This Command Class can be used in conjunction with the Door Lock Command Class or Barrier Operator Command Class. In this case, a supporting node MUST reflect Authentication Data inputs in the door lock status when relevant. (e.g. when the door becomes unsecured by Authentication Data input, the Door Lock Operation mode is updated to unsecure with an optional timeout). + +A node supporting this Command Class MAY have an Association group issuing the corresponding Door Lock Operation Set Commands or Basic Set Commands when there are a valid Authentication Data input in order to control other door locks. + +A supporting node may support several authentication technologies such as User Code, RFID, Cards and etc. A combination these technologies may also be needed to get access. In this case, a supporting node can be configured to accept certain combinations of authentication technologies. + +An assigned User Code in the User Code Command Class may be part of an Authentication ID. In this case, all the Authentication credentials (including the User Code) defined in the Authentication ID MUST be input at the node in order to trigger the outcome defined by the User Code Status. In other words, the User Code input alone is no longer enough, it will require all the credentials defined [in the Authentication ID to get access. An example is given in Figure 5](04.10.13-examples-and-use-cases.md#41013-examples-and-use-cases) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.03-authentication-capability-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.03-authentication-capability-get-command.md new file mode 100644 index 0000000..7ad0a75 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.03-authentication-capability-get-command.md @@ -0,0 +1,19 @@ + +# 4.10.3 Authentication Capability Get Command + +This command is used to request the Authentication technology capabilities, number of Authentication ID and Data ID supported by the receiving node. + +The Authentication Capability Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION CAPABILITIES GET (0x01) _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.04-authentication-capability-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.04-authentication-capability-report-command.md new file mode 100644 index 0000000..a8e60f5 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.04-authentication-capability-report-command.md @@ -0,0 +1,110 @@ + +# 4.10.4 Authentication Capability Report Command + +This command is used to advertise the Authentication Command Class capabilities of sending node. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | | +| Command = AUTHENTICATION CAPABILITIES REPORT (0x02) _ _ | | | | | | | | | +| Supported Data ID Entries (MSB) | | | | | | | | | +| Supported Data ID Entries (LSB) | | | | | | | | | +| Supported Authentication ID Entries (MSB) | | | | | | | | | +| Supported Authentication ID Entries (LSB) | | | | | | | | | +| MAR | MADR | OR | | Reserved | Supported Authentication Technology Type Bit Mask length | | | | +| Supported Authentication Technology Type Bit Mask 1 | | | | | | | | | +| … | | | | | | | | | +| Supported Authentication Technology Type Bit Mask N | | | | | | | | | +| Supported Checksum Type Bit Mask | | | | | | | | | +| Reserved | | | | Supported Fallback Status Bit Mask length | | | | | +| Supported Fallback Status Bit Mask 1 | | | | | | | | | +| … | | | | | | | | | +| Supported Fallback Status Bit Mask N | | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Supported Data ID Entries (16 bits) + +This field is used to advertise the number of supported Authentication Data ID Entries. + +The first byte MUST carry the most significant byte of the 16 bits value. + +This field MUST be set to the total amount of supported Authentication Data IDs. This field MUST be in the range 1…65535. + +Supported Authentication ID Entries (16 bits) + +This field is used to advertise the number of supported Authentication ID Entries. + +The first byte MUST carry the most significant byte of the 16 bits value. + +This field MUST be set to the total amount of supported combinations entries. This field MUST be in the range 1…65535. + +MAR (Multiple Authentication ID Report) Support (1 bit) + +This field indicates if the sending node supports reporting the Multiple Authentication ID Blocks at once in a single Authentication Technologies Combination Report Command. This functionality should be supported by node supporting large amount of Authentication ID Entries. + +The value 1 MUST indicate that the Multiple Authentication ID Report functionality is supported. The value 0 MUST indicate that the Multiple Authentication ID Report functionality is not supported. + +MADR (Multiple Authentication Data ID Report) Support (1 bit) + +This field indicates if the sending node supports reporting the Multiple Authentication Data ID Blocks at [once in a single Authentication Data Report Command. This functionality should be supported by node](04.10.07-authentication-data-report-command.md#4107-authentication-data-report-command) supporting large amount of Authentication Data ID Entries. + +The value 1 MUST indicate that the Multiple Authentication Data ID Report functionality is supported. The value 0 MUST indicate that the Multiple Authentication Data ID Report functionality is not supported. + +OR Support (1 bit) + +This field is used to advertise if the node supports being set Authentication ID combinations using a OR logic (User Code OR Authentication data ID 1 OR … OR Authentication data ID N) + +The value 1 MUST indicate that the OR flag in the Authentication Technologies combination is supported. The value 1 MUST indicate that the OR flag in the Authentication Technologies combination is not supported. Supported Authentication Technology Type Bit Mask length (4 bits) + +This field MUST advertise the length in bytes of the Supported Authentication Technology Type Bit Mask field carried in the command. + +This field MUST be set to the minimum value which allows advertising all supported Authentication Technology types. + +Supported Authentication Technology Type Bit Mask (N bytes) + +This field advertises the supported Authentication Technology Type values. The length of this field in bytes MUST match the value advertised in the Supported Authentication Technology Bit Mask Length field. + +[Authentication Technology Type values are described in Table 13. In this field the supported](04.10.05-authentication-data-set-command.md#4105-authentication-data-set-command) Authentication Technology Type values MUST be encoded as follow: + + Bit 0 in Bit Mask 1 represents Authentication Technology Type 0x00 (reserved) and MUST be set to 0.  Bit 1 in Bit Mask 1 represents Authentication Technology Type 0x01.  Bit 2 in Bit Mask 1 represents Authentication Technology Type 0x02.  … + +If an Authentication Technology Type is supported, the corresponding bit MUST be set to ‘1’. If an Authentication Technology Type is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. Supported Checksum Type Bit Mask (8 bits) + +This field advertises the supported Checksum Type values. + +[Checksum Type values are described in Table 15. The supported Checksum Type values MUST be](04.10.11-authentication-checksum-get-command.md#41011-authentication-checksum-get-command) encoded as follow: + + Bit 0 in Bit Mask 1 represents Checksum Type 0x00.  Bit 1 in Bit Mask 1 represents Checksum Type 0x01.  … + +If a Checksum Type is supported, the corresponding bit MUST be set to ‘1’. If a Checksum Type is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Supported Fallback Status Bit Mask length (4 bits) + +This field MUST advertise the length in bytes of the Supported Fallback Status Bit Mask field carried in the command. + +This field MUST be set to the minimum value which allows advertising all supported Fallback Statuses. + +Supported Fallback Status Bit Mask (N bytes) + +This field advertises the supported Fallback Status values. The length of this field in bytes MUST match the value advertised in the Supported Fallback Status Bit Mask Length field. + +[Fallback Status values are described in Table 14. This field MUST be encoded as follow:](04.10.08-authentication-technologies-combination-set-command.md#4108-authentication-technologies-combination-set-command) + + Bit 0 in Bit Mask 1 represents Fallback Status 0x00.  Bit 1 in Bit Mask 1 represents Fallback Status 0x01.  … + +Fallback Statuses 0x00 and 0x01 MUST be supported by all supporting nodes. + +If a Fallback Status is supported, the corresponding bit MUST be set to ‘1’. If a Fallback Status is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.05-authentication-data-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.05-authentication-data-set-command.md new file mode 100644 index 0000000..3e4116a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.05-authentication-data-set-command.md @@ -0,0 +1,63 @@ + +# 4.10.5 Authentication Data Set Command + +This command is used to define Authentication Data for a given Data Identifier at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION DATA SET (0x03) _ _ | | | | | | | | +| Authentication Data ID 1 (MSB) | | | | | | | | +| Authentication Data ID 2 (LSB) | | | | | | | | +| Reserved | | | | Authentication Technology Type | | | | +| Authentication Data length | | | | | | | | +| Authentication Data 1 | | | | | | | | +| … | | | | | | | | +| Authentication Data N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Authentication Data ID (16 bits) + +This field is used to identify an Authentication Data entry. + +This field MUST be in the range 0..Max Number of Supported Data ID Entries advertised by the node in the Authentication Capability Report Command. + +The first byte MUST carry the most significant byte of the 16 bits. + +Values in the range 1..Max Number of Supported Data ID Entries MUST indicate the actual Authentication Data ID record to update. + +The value 0 MUST indicate that the receiving node MUST erase the Authentication Data for all supported Authentication Data ID that are associated to specified Authentication Technology Type. If this field is set to 0x00, the Authentication Data length MUST be set to 0x00. + +Authentication Technology Type (4 bits) + +This field is used to specify the authentication medium associated to the Authentication Data ID. [The field MUST be encoded according to Table 13.](04.10.05-authentication-data-set-command.md#4105-authentication-data-set-command) + +Table 13, Authentication Data Set:: Authentication Technology Type encoding + +| Value | Authentication Technology | Version | +| --- | --- | --- | +| 0x00 | Reserved | 1 | +| 0x01 | RFID tag | 1 | +| 0x02 | Magnetic card | 1 | +| 0x03..0x0F | Reserved | 1 | + +Authentication Data length (8 bits) + +This field is used to describe the length in bytes of the Authentication Data field. + +The value 0 MUST indicate to erase the data entry represented by the Data Identifier. + +Authentication Data (N bytes) + +This field is used to advertise the Authentication Data contents to be set the specified Authentication Data ID. + +The length of this field in bytes MUST be according to the corresponding Authentication Data Length field value. If the Authentication Data Length field is set to 0x00, this field MUST be omitted. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.06-authentication-data-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.06-authentication-data-get-command.md new file mode 100644 index 0000000..9168b22 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.06-authentication-data-get-command.md @@ -0,0 +1,40 @@ + +# 4.10.6 Authentication Data Get Command + +This command is used to request the Authentication Data defined for a given Authentication Data ID. + +[The Authentication Data Report MUST be returned in response to this command.](04.10.07-authentication-data-report-command.md#4107-authentication-data-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION DATA GET (0x04) _ _ | | | | | | | | +| Authentication Data ID 1 (MSB) | | | | | | | | +| Authentication Data ID 2 (LSB) | | | | | | | | +| Reserved | | | | | | | Report More | + +Authentication Data ID (16 bits) + +This field is used to describe the requested authentication Data Identifier. + +The first byte MUST carry the most significant byte of the 16 bit value. + +A supporting node MUST return this value in the Authentication Data ID field of the first Authentication [Data ID Block in the returned Authentication Data Report Command.](04.10.07-authentication-data-report-command.md#4107-authentication-data-report-command) + +Report More (1 bit) + +This field is used to instruct the receiving node to report as many Authentication Data ID as possible within a single Z-Wave command (that fits in a single Z-Wave frame) because the sending node intends to read the whole (or a large part of the) Authentication Data database. + +This field MUST be ignored by a receiving node if it advertises no support for Multiple Authentication Data Report (MADR) in the Authentication Capability Report Command. + +The value 0 MUST indicate to return a report for the requested Authentication Data ID only. The value 1 MUST indicate to return a report for the requested Authentication Data ID and additionally report as many Authentication Data ID blocks as possible in the response. When this field is set to 1, a node advertising support for Multiple Authentication Data Report (MADR) in the Authentication Capability Report Command: + +[SHOULD return at least 2 Authentication Data ID blocks in the Authentication Data Report](04.10.07-authentication-data-report-command.md#4107-authentication-data-report-command)  [Command unless the last used Authentication Data ID or a non-supported Authentication Data](04.10.07-authentication-data-report-command.md#4107-authentication-data-report-command) ID is requested. SHOULD return as many consecutive non-empty Authentication Data ID record as possible.  The subsequent Authentication Data ID blocks MUST contain consecutive Authentication Data  ID having Authentication Data length different than 0. For example, a node supports 5 authentication Data IDs and both RFID (0x01) and Magnetic card (0x02) authentication technologies, and the setting is defined as follow. In this case, the supporting node MUST report Authentication Data ID 1 and 4 when requested about Authentication Data ID 1. Authentication Data ID 1, Technology Type = 0x01, Data length = 3, Data = C10001 o Authentication Data ID 2, Technology Type = 0x01, Data length = 0 o Authentication Data ID 3, Technology Type = 0x01, Data length = 0 o Authentication Data ID 4, Technology Type = 0x02, Data length = 2, Data = CDF1 o Authentication Data ID 5, Technology Type = 0x02, Data length = 0 o diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.07-authentication-data-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.07-authentication-data-report-command.md new file mode 100644 index 0000000..98604ed --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.07-authentication-data-report-command.md @@ -0,0 +1,73 @@ + +# 4.10.7 Authentication Data Report Command + +This command is used to advertise the Authentication Data assigned at the supporting node for a given Authentication Data ID entry. + +| 7 | 6 | 5 | 4 | 3 | | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | | +| Command = AUTHENTICATION DATA REPORT (0x05) _ _ | | | | | | | | | +| Number of Authentication Data ID Blocks | | | | | | | | | +| Authentication Data ID 1 (MSB) 1 | | | | | | | | | +| Authentication Data ID 2 (LSB) 1 | | | | | | | | | +| Reserved | | | | | Authentication Technology Type 1 | | | | +| Authentication Data Length 1 | | | | | | | | | +| Authentication Data 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Authentication Data N - 1 | | | | | | | | | +| … | | | | | | | | | +| Authentication Data ID 1 (MSB) M | | | | | | | | | +| Authentication Data ID 2 (LSB) M | | | | | | | | | +| Reserved | | | | | Authentication Technology Type M | | | | +| Authentication Data Length M | | | | | | | | | +| Authentication Data 1 - M | | | | | | | | | +| … | | | | | | | | | +| Authentication Data N - M | | | | | | | | | +| Next Authentication Data ID 1 (MSB) | | | | | | | | | +| Next Authentication Data ID 2 (LSB) | | | | | | | | | + +Number of Authentication Data ID Blocks (8 bits) + +This field is used to specify how many Authentication Data ID blocks are contained in the actual command. + +This field MUST be in the range 1..255. A node MUST respect the Z-Wave MAC frame size or Transport service limits when sending this command. + +The number of Authentication Data ID contained in the command MUST be according to this field. An Authentication Data ID block MUST comprise the following fields: + + Authentication Data (16 bits)  Authentication Technology Type (4 bits)  Authentication Data Length (8 bits)  Authentication Data (N bytes) + +This field MUST be set to 1 by a node advertising no support for Multiple Authentication Data ID Block Report (MADR) in the User Code Capabilities Report Command. + +Authentication Data ID (16 bits) + +This field is used to describe the advertised authentication Data Identifier. + +If this field is set to 0x00 or a non-supported Authentication Data ID, the Authentication Technology Type and the Authentication Data Length fields MUST be set to 0x00. + +Authentication Technology Type (4 bits) + +This field is used to advertise the authentication medium associated to the Authentication Data ID. [The field MUST be encoded according to Table 13.](04.10.05-authentication-data-set-command.md#4105-authentication-data-set-command) + +Authentication Data length (8 bits) + +This field is used to describe the length in bytes of the Authentication Data field. + +The value 0 MUST indicate that the specified Authentication Data ID is not supported. + +Authentication Data (N bytes) + +This field is used to advertise the Authentication Data contents set for the specified Authentication Data ID. + +The length of this field in bytes MUST be according to the corresponding Authentication Data Length field value. If the Authentication Data Length field is set to 0x00, this field MUST be omitted. + +Next Authentication Data ID (16 bits) + +This field is used to advertise the next Authentication Data ID set at the sending node with non-empty Authentication Data. + +This field MUST be set to 0x00 if there are no more Data Identifiers are defined after the Authentication Data ID value of the Authentication Data ID field of the last Authentication Data ID block. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.08-authentication-technologies-combination-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.08-authentication-technologies-combination-set-command.md new file mode 100644 index 0000000..8e04fb1 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.08-authentication-technologies-combination-set-command.md @@ -0,0 +1,110 @@ + +# 4.10.8 Authentication Technologies Combination Set Command + +This command is used to define the Combination Entries at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION TECHNOLOGIES COMBINATION SET (0x06) _ _ _ | | | | | | | | +| Authentication ID 1 (MSB) | | | | | | | | +| Authentication ID 2 (LSB) | | | | | | | | +| Fallback Status | | | | | | | | +| User Identifier 1 (MSB) | | | | | | | | +| User Identifier 2 (LSB) | | | | | | | | +| Schedule ID 1 (MSB) | | | | | | | | +| Schedule ID 2 (LSB) | | | | | | | | +| OR logic | Number of Authentication Data ID | | | | | | | +| Authentication Data ID 1 (MSB) 1 | | | | | | | | +| Authentication Data ID 2 (LSB) 1 | | | | | | | | +| … | | | | | | | | +| Authentication Data ID 1 (MSB) M | | | | | | | | +| Authentication Data ID 2 (LSB) M | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Authentication ID (16 bits) + +This field is used to specify the Authencation ID that is to be updated. + +This field MUST be in the range 0..max number of Supported Authentication ID Entries + +The first byte MUST carry the most significant byte of the 16 bits. + +The value 0 is used to erase all the Authentication Data for all supported Authentication ID Entries. If this field is set to 0x00 and all the other fields MUST set to 0x00, and a receiving node MUST erase all configured Authentication ID Entries. + +Values in the range 1..Max Number of Supported Authentication ID Entries MUST indicate the actual Authentication ID record to update. Fallback Status (8 bits) + +This field is used to configure the status of Authentication ID at the receiving node if a User Code entry is not defined (i.e. User Identifier field set to 0x00). + +The status represents the outcome to perform at the node when all the Authentication Data defined in the Authentication ID has been input at the supporting node, during the defined Schedule ID. + +This field MUST set but ignored if the User Identifier is set to a value greater than 0x00. Instead, the User ID Status defined for the corresponding User Identifier in the User Code Command Class MUST take precedence over this field. + +If the User Identifier [field is set to 0x00, this field MUST be encoded and interpreted according to Table 14.](04.10.08-authentication-technologies-combination-set-command.md#4108-authentication-technologies-combination-set-command) + +Table 14, Authentication Technologies Combination Set:: Fallback Status encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Available: The database entry represented by this Authentication ID is not in use. This status MUST be used to delete Authentication ID entries. | 1 | +| 0x01 | Enabled / Grant Access The database entry represented by this Authentication ID is in use and enabled. When a user has input all required Authentication credentials associated to this Authentication ID, the node:  MUST indicate that the input was accepted  MUST grant access to the user.  MUST secure the Door Lock again after a timeout (either configured if set in Timed Operation or pre-defined if the Door Lock is set in Constant Operation) | 1 | +| 0x02 | Disabled: The database entry represented by this Authentication ID is in use but disabled. E.g. It allows a controller to push Authentication ID combinations to a supporting node and let these credentials be subsequently activated by a local interface. When a user has input all required Authentication credentials associated to this Authentication ID, the node:  MUST indicate that the input was not accepted  MUST NOT grant access to the user. | 1 | + +| Value | Description | Version | +| --- | --- | --- | +| 0x03 | Messaging: The database entry represented by this Authentication ID is in use. The value is used to relay notifications to a controlling application. E.g. A user may enter a messaging code for notifying that maintenance started or an application should activate the alarm system. When a user has input all required Authentication credentials associated to this Authentication ID, the node:  SHOULD indicate that the input was accepted  MUST NOT grant access to this user  MUST NOT take preventive actions for further attempts to enter input.  MUST send an Entry Control Notification or a Notification Report via the Lifeline Group to identify the messaging User Identifier or Authentication ID. | 1 | +| 0x04 | Passage Mode: The database entry represented by this Authentication ID is in use. The value is used to let the Door Lock permanently grant access. Passage Mode can be activated and deactivated using the Door Lock Operation Set (Unsecured without timeout / Secured) or via a Passage Mode credential input. E.g. A receptionist comes in the morning and enters a Passage Mode credentials to allow anybody to subsequently enter the premises without entering special access codes until Passage Mode is deactivated again. When a user has input all required Authentication credentials associated to this Authentication ID, the node:  MUST indicate that the code is accepted  MUST toggle the Door Lock operation state between secured and unsecured without timeout (and also disable any auto-relock functionality).  MUST send a Door Lock Operation Report and Door Lock Configuration Report via the Lifeline Association Group to advertise the new Door Lock state. | 1 | +| 0x05..0xFF | Reserved | 1 | + +User Identifier (16 bits) + +This field is used to specify the identity of the User Code (User Code Command Class) which MUST be used in combination with authentication data to get access. + +If User Identifier has a User ID Status set to 0x00 in the User Code Command Class, the combination will not allow access as it cannot be input at the supporting node. + +This field is set to a value larger than 0x00 and the supporting node does not support the User Code Command Class, the Authentication ID will be ignored as such a User Code cannot be input at the supporting node. + +If a User Code is defined in an Authentication ID with an AND logic, the input of the User Code alone is no longer sufficient to trigger the outcome defined by the User ID Status. All Authentication Data indicated by the Authentication Data IDs in this command MUST be input to trigger the outcome specified by the User ID Status. + +Schedule ID (16 bits) + +This field is used specify the Schedule during which the Authentication ID is active. + +The value 0x00 MUST indicate that the Authentication ID is active at all times. + +Values greater than 0 MUST indicate that the Authentication ID is valid or active only during the corresponding Schedule ID, defined in the Generic Schedule Command Class. + +OR logic (1 bit) + +This field is used to specify if OR logic is to be applied for the actual Authentication ID. + +Nodes advertising no support for the OR in the Authentication Capability Report Command MUST ignore this field and apply an AND logic. + +If this field is set to 0, an AND logic MUST be applied for the actual Authentication ID. In this case, the User Code (if defined) and all the defined Authentication Data must be input (during the Schedule ID) in order to get access or provide the outcome defined in the corresponding User Code Status / Fallback Status. + +If this field is set to 1, an OR logic MUST be applied for the actual Authentication ID. In this case, the User Code (if defined) or any of the defined Authentication Data must be input (during the Schedule ID) in order to get access or provide the outcome defined in the corresponding User Code Status / Fallback Status. + +Number of Authentication Data ID (7 bits) + +This field is used to specify how many Authentication Data ID are contained in the the actual Authentication ID. Each Authentication Data ID MUST be 16 bits long. + +This field MUST be set to 0, if no Authentication Data ID MUST be used for the combination and the User Identifer (User Code) alone is enough to get access. + +If this field is set to 0, the Authentication Data ID field MUST be omitted. + +For example, if this field is set to 3, the corresponding Authentication Data ID field must be 6 bytes long. Authentication Data ID (M x 16 bits) + +This field is used to identify the list of Authentication Data ID that are required for the specified Authentication ID. + +The first byte MUST carry the most significant byte of the 16 bits. + +In an Authentication ID, if any of the Authentication Data ID does not have any Authentication Data defined (Authentication Data Length = 0), the Authentication ID MUST NOT permit any access. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.09-authentication-technologies-combination-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.09-authentication-technologies-combination-get-command.md new file mode 100644 index 0000000..66d7112 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.09-authentication-technologies-combination-get-command.md @@ -0,0 +1,40 @@ + +# 4.10.9 Authentication Technologies Combination Get Command + +This command is used for requesting defined combination entries of a specific Authentication ID. + +The Authentication Technologies Combination Report MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION TECHNOLOGIES COMBINATION GET (0x07) _ _ _ | | | | | | | | +| Authentication ID (MSB) | | | | | | | | +| Authentication ID (LSB) | | | | | | | | +| Reserved | | | | | | | Report More | + +Authentication ID (16 bits) + +This field is used to describe the requested Authentication ID. + +The first byte MUST carry the most significant byte of the 16 bits. + +A supporting node MUST return this value in the Authentication Data ID field of the first Authentication Data ID Block in the returned Authentication Technologies Combination Report Command. Report More (1 bit) + +This field is used to instruct the receiving node to report as many Authentication ID as possible within a single Z-Wave command (that fits in a single Z-Wave frame) because the sending node intends to read the whole (or a large part of the) Authentication ID database. + +This field MUST be ignored by a receiving node if it advertises no support for Multiple Authentication Report (MAR) in the Authentication Capability Report Command. + +The value 0 MUST indicate to return a report for the requested Authentication ID only. The value 1 MUST indicate to return a report for the requested Authentication ID and additionally report as many Authentication ID blocks as possible in the response. + +When this field is set to 1, a node advertising support for Multiple Authentication Report (MAR) in the Authentication Capability Report Command: + + SHOULD return at least 2 Authentication ID blocks in the Authentication Technolofies Combination Report Command unless the last used Authentication ID or a non-supported Authentication ID is requested.  SHOULD return as many consecutive non-emtpy Authentication ID record as possible.  The subsequent Authentication ID blocks MUST contain consecutive Authentication ID having User Identifier or Fallback Status different than 0. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.10-authentication-technologies-combination-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.10-authentication-technologies-combination-report-command.md new file mode 100644 index 0000000..b97c47a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.10-authentication-technologies-combination-report-command.md @@ -0,0 +1,125 @@ + +# 4.10.10 Authentication Technologies Combination Report Command + +This command is used to advertise defined Combination Entries of a specific Authentication ID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION TECHNOLOGIES COMBINATION REPORT (0x08) _ _ _ | | | | | | | | +| Number of Authentication ID blocks | | | | | | | | +| Authentication ID block length 1 | | | | | | | | +| Authentication ID 1 (MSB) 1 | | | | | | | | +| Authentication ID 2 (LSB) 1 | | | | | | | | +| Fallback Status 1 | | | | | | | | +| User Identifier 1 (MSB) 1 | | | | | | | | +| User Identifier 2 (LSB) 1 | | | | | | | | +| Schedule ID 1 (MSB) 1 | | | | | | | | +| Schedule ID 2 (LSB) 1 | | | | | | | | +| OR logic 1 | Number of Authentication Data IDs 1 | | | | | | | +| Authentication Data ID 1 (MSB) 1 -1 | | | | | | | | +| Authentication Data ID 2 (LSB) 1 - 1 | | | | | | | | +| … | | | | | | | | +| Authentication Data ID 1 (MSB) M - 1 | | | | | | | | +| Authentication Data ID 2 (LSB) M- 1 | | | | | | | | +| … | | | | | | | | +| Authentication ID block length N | | | | | | | | +| Authentication ID 1 (MSB) N | | | | | | | | +| Authentication ID 2 (LSB) N | | | | | | | | +| Fallback Status N | | | | | | | | +| User Identifier 1 (MSB) N | | | | | | | | +| User Identifier 2 (LSB) N | | | | | | | | +| Schedule ID 1 (MSB) N | | | | | | | | +| Schedule ID 2 (LSB) N | | | | | | | | +| OR logic N | Number of Authentication Data IDs N | | | | | | | +| Authentication Data ID 1 (MSB) 1 - N | | | | | | | | +| Authentication Data ID 2 (LSB) 1-– N | | | | | | | | +| … | | | | | | | | +| Authentication Data ID 1 (MSB) M - N | | | | | | | | +| Authentication Data ID 2 (LSB) M- N | | | | | | | | +| Next Authentication ID 1 (MSB) | | | | | | | | +| Next Authentication ID 2 (LSB) | | | | | | | | + +Number of Authentication ID Blocks (8 bits) + +This field is used to specify how many Authentication ID blocks are contained in the actual command. + +This field MUST be in the range 1..255. A node MUST respect the Z-Wave MAC frame size or Transport service limits when sending this command. + +The number of Authentication ID contained in the command MUST be according to this field. An Authentication Data ID block MUST comprise the following fields: + + Authentication ID Block Length (8 bits)  Authentication ID (16 bits)  Fallback Status (8 bits)  User Identifier (16 bits)  Schedule ID (16 bits)  OR logic / Number of Authentication Data IDs (8 bits)  Authentication Data ID (M x 16 bits) + +This field MUST be set to 1 by a node advertising no support for Multiple Authentication ID Block Report (MAR) in the Authentication Capability Report Command. + +Authentication ID block length (8 bits) + +This field is used to indicate the total length of the actual Authentication ID Block. This field MUST advertise the length in bytes of the Authentication ID Block, including itself. + +Authentication ID (16 bits) + +This field is used to specify the Authentication ID for the actual Authentication ID Block. The first byte MUST carry the most significant byte of the 16-bits value. + +If this field is set to 0x00 or a non-supported Authentication ID, the Fallback Status, User Identifier, Schedule ID and Number of Authentication Data ID fields MUST be set to 0x00. + +Fallback Status (8 bits) + +This field is used to advertise the status of Authentication ID defined at the receiving node. + +The status represents the outcome to perform at the node when all the Authentication Data defined in the Authentication ID block has been input at the supporting node, during the defined Schedule ID. + +This field MUST be ignored if the User Identifier field in the corresponding Authentication ID Block is set to a value greater than 0x00. Instead, the User ID Status defined for the corresponding User Identifier in the User Code Command Class MUST take precedence over this field. + +If the User Identifier field is set to 0x00, this field MUST be encoded and interpreted according to. User Identifier (16 bits) + +This field is used to advertise the identity of the User Code (User Code Command Class) which is used in combination with authentication data to get access for this Authentication ID block. + +If User Identifier has a User ID Status set to 0x00 in the User Code Command Class, the the combination will not allow access as it cannot be input at the supporting node. + +This field is set to a value larger than 0x00 and the supporting node does not support the User Code Command Class, the Authentication ID will be ignored as such a User Code cannot be input at the supporting node. + +If a User Code is defined in an Authentication ID, the input of the User Code alone is no longer sufficient to trigger the outcome defined by the User ID Status. All Authentication Data indicated by the Authentication Data IDs in this command MUST be input to trigger the outcome specified by the User ID Status. + +Schedule ID (16 bits) + +This field is used specify the Schedule during which the Authentication ID is active. + +The value 0 MUST indicate that the Authentication ID is active at all times. + +Values greater than 0 MUST indicate that the Authentication ID is valid or active only during the corresponding Schedule ID, defined in the Generic Schedule Command Class. + +OR logic (1 bit) + +This field is used to advertise if OR logic is to be applied for the actual Authentication ID. + +Nodes advertising no support for the OR in the Authentication Capability Report Command MUST ignore this field and set this field to 0. + +If this field is set to 0, an AND logic MUST be applied for the actual Authentication ID block. If this field is set to 1, an OR logic MUST be applied for the actual Authentication ID block. + +Number Of Authentication Data IDs (7 bits) + +This field is used to specify how many Authentication Data ID are contained in the the corresponding Authentication ID Block. Each Authentication Data ID MUST be 16 bits long. + +For example, if this field is set to 3, the corresponding Authentication Data ID field must be 6 bytes long. + +Authentication Data ID (M x 16 bits) + +This field is used to identify the list of Authentication Data ID entries that compose the specified Authentication ID. + +The length of this field MUST be according to the Number Of Authentication Data IDs field in the corresponding Authentication ID Block. + +The first byte MUST carry the most significant byte of the 16 bits. + +If any of the Authentication Data ID does not have any Authentication Data defined, the Authentication ID MUST NOT permit any access. Next Authentication ID (16 bits) + +This field is used to advertise the next Authentication ID set at the sending node with non-empty Authentication ID data. + +This field MUST be set to the next Authentication ID which has a Fallback or User Identifier status is different from 0. + +This field MUST be set to 0x00 if there are no more Authentication IDs are defined after the value of the Authentication ID field of the last Authentication ID Block. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.11-authentication-checksum-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.11-authentication-checksum-get-command.md new file mode 100644 index 0000000..fce8585 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.11-authentication-checksum-get-command.md @@ -0,0 +1,44 @@ + +# 4.10.11 Authentication Checksum Get Command + +This command is used to request checksum(s) representing the current authentication data or combinations set at the supporting node. + +A supporting node MUST return a response with the Checksum field set to 0x00 if the checksum type or the authentication type is not supported. + +The Authentication Checksum Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION CHECKSUM GET (0x09) _ _ | | | | | | | | +| Res | Checksum type | | | Authentication Technology Type | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Checksum Type (3 bits) + +[This field is used to indicate which checksum to return. This field MUST be encoded according to Table 15.](04.10.11-authentication-checksum-get-command.md#41011-authentication-checksum-get-command) + +Table 15, Authentication Checksum Get:: Checksum type encoding + +| Value | Checksum Type | Version | +| --- | --- | --- | +| 0x00 | Authentication Data checksum | 1 | +| 0x01 | Combination Entries checksum | 1 | +| 0x02..0x07 | Reserved | 1 | + +Authentication Technology Type (4 bits) + +This field is used to specify which type of the authentication technology to use for the checksum [calculation. The field MUST be encoded according to Table 13.](04.10.05-authentication-data-set-command.md#4105-authentication-data-set-command) + +This field MUST be set to 0 by a sending node and ignored by a supporting node if the Checksum Type field is set to 1. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.12-authentication-checksum-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.12-authentication-checksum-report-command.md new file mode 100644 index 0000000..a4ea81f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.12-authentication-checksum-report-command.md @@ -0,0 +1,74 @@ + +# 4.10.12 Authentication Checksum Report Command + +This command is used to advertise the checksum representing current authentication data that correspond to a specific technology type or combination entries defined at the supporting node + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION (0xA1) _ _ | | | | | | | | +| Command = AUTHENTICATION DATA CHECKSUM REPORT(0x0F) _ _ _ | | | | | | | | +| Res | Checksum type | | | Authentication Technology Type | | | | +| Checksum 1 (MSB) | | | | | | | | +| Checksum 2 (LSB) | | | | | | | | + +Authentication Technology Type (4 bits) + +This field is used to advertise which type of the authentication technology has been used for the [checksum calculation. The field MUST be encoded according to Table 13.](04.10.05-authentication-data-set-command.md#4105-authentication-data-set-command) + +This field MUST be set to 0x00 by the sending node if the Checksum type is set to 0x01. + +The other values are reserved and MUST NOT be used by sending node. Reserved values MUST be ignored by a receiving node. + +Checksum Type (3 bits) + +[This field is used to indicate which checksum to return. This field MUST be encoded according to Table 15.](04.10.11-authentication-checksum-get-command.md#41011-authentication-checksum-get-command) Authentication Data Checksum (16 bits) + +This field is used to advertise the checksum value. The checksum MUST be calculated using the CRC- CCITT polynomial using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +This field MUST be set to 0x0000 if no authentication data or combination entries are defined at sending node. + +The calculation of the checksum depends on the Checksum Type and Authentication Technology Type field values. + +If the checksum type field is set to 0x00 Authentication Data checksum: + +Similar to the User Code checksum data format (refer to User Code Command Class, version 2), the Authentication Data checksum data MUST be built by concatenating initialized Authentication Data content for a given technology type (with Authentication Data length different than 0x00) in the ascending Data ID order. + +If the Authentication Technology Type is set to 0x00, the checksum field MUST be set to 0x00. + +Else, for example for RFID based authentication technology, each initialized RFID data MUST be formatted as follows: + +Data ID (16 bits) | RFID Data (1..32 bytes) + +For example, a node supporting 4 RFID IDs that are set as follow: + + Data ID 1, entry Data Content length 4, RFID code ABC10001  Data ID 2, entry Data Content length 0  Data ID 3, entry Data Content length 5, RFID code AB58198301  Data ID 4, entry Data Content length 0 + +In this case, the defined RFID data content for Data ID 1 and 3 MUST be concatenated to obtain the checksum data: + +0x0001 | 0xAB C1 00 01| 0x0003 |0xAB 58 19 83 01 + +The checksum data MUST be: 0x0001ABC100010003AB58198301 and the checksum field MUST be set to 0x17FE. If the checksum type field is set to 0x01 Combination Entries checksum: + +The checksum data MUST be built by concatenating defined Combination Entries whose status or User Identifier is different than 0x00 in the ascending Authentication ID order. Each entry MUST be comprised of all the fields included in an Authentication ID Block for the version of the supporting node, including reserved fields. + +For example, a node supports both User Code and RFID based authentication technology, the Combination Entries checksum calculation MUST be formatted as follows: + + Authentication ID Block Length (8 bits)  Authentication ID (16 bits)  Fallback Status (8 bits)  User Identifier (16 bits)  Schedule ID (16 bits)  Number of Authentication Data IDs (8 bits)  Authentication Data ID (M x 16 bits) + +Authentication ID Block Length (8 bits) |Authentication ID (16 bits) | Fallback Status (8 bits) |User Identifier (16 bits) |Schedule ID (16 bits) | Number of Authentication Data IDs (8 bits) | Authentication Data ID (M x 16 bits) + +For example, a node supporting 3 Authentication IDs that are set as follow: + + Length 11, Authentication ID 1, Fallback status 0, User Identifier 1, Schedule ID 0, Number of Authentication Data IDs 1, Data Identifier 1.  Length 9, Authentication ID 2, Fallback status 0, User Identifier 0, Schedule ID 0, Number of Authentication Data IDs 0.  Length 13, Authentication ID 3, Fallback status 0, User Identifier 200, Schedule ID 1, Number of Authentication Data IDs 2, Data Identifier 4 and 5 + +In this case, the defined Combination Entries checksum data for Authentication ID 1 and 3 MUST be concatenated to obtain the checkum data: + +0x0B | 0x0001 | 0x00 | 0x0001 | 0x0000 | 0x01 | 0x0001 | 0x0D | 0x0003 | 0x00 | 0x00C8 | 0x0001 | 0x02 | 0x0004 | 0x0005 + +The checksum data MUST be: 0x0B000100000100000100010D00030000C800010200040005 and the checksum must be 0x0A53. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.13-examples-and-use-cases.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.13-examples-and-use-cases.md new file mode 100644 index 0000000..7b8a46e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/04.10.13-examples-and-use-cases.md @@ -0,0 +1,16 @@ + +# 4.10.13 Examples and use-cases + +[An example of configurations with User Code CC and RFID tags is shown in Figure 5](04.10.13-examples-and-use-cases.md#41013-examples-and-use-cases) + +![Figure 5, Authentication Command Class example: User Code and RFID configuration](assets/img-04d8f2ead1.png) + +An example of Authentication Data configurations with RFID and Magnetic card technology types is [shown in Figure 6.](04.10.13-examples-and-use-cases.md#41013-examples-and-use-cases) + +![Figure 6: Authentication Command Class example: Authentication Data configuration](assets/img-83fe32ab3f.png) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/index.md new file mode 100644 index 0000000..41e74c8 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.10-authentication-command-class-version-1/index.md @@ -0,0 +1,26 @@ + +# 4.10 Authentication Command Class, version 1 + +Authentication Command Class is a generic command class which can be used for transporting different technology authentication data contents (e.g., RFID, Magnetic Cards, etc.) in a Z-Wave network for access control systems. + +## Contents + +- [4.10.1 Terminology](04.10.01-terminology.md) +- [4.10.2 Interoperability Considerations](04.10.02-interoperability-considerations.md) +- [4.10.3 Authentication Capability Get Command](04.10.03-authentication-capability-get-command.md) +- [4.10.4 Authentication Capability Report Command](04.10.04-authentication-capability-report-command.md) +- [4.10.5 Authentication Data Set Command](04.10.05-authentication-data-set-command.md) +- [4.10.6 Authentication Data Get Command](04.10.06-authentication-data-get-command.md) +- [4.10.7 Authentication Data Report Command](04.10.07-authentication-data-report-command.md) +- [4.10.8 Authentication Technologies Combination Set Command](04.10.08-authentication-technologies-combination-set-command.md) +- [4.10.9 Authentication Technologies Combination Get Command](04.10.09-authentication-technologies-combination-get-command.md) +- [4.10.10 Authentication Technologies Combination Report Command](04.10.10-authentication-technologies-combination-report-command.md) +- [4.10.11 Authentication Checksum Get Command](04.10.11-authentication-checksum-get-command.md) +- [4.10.12 Authentication Checksum Report Command](04.10.12-authentication-checksum-report-command.md) +- [4.10.13 Examples and use-cases](04.10.13-examples-and-use-cases.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.100-sound-switch-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.100-sound-switch-command-class-version-2.md new file mode 100644 index 0000000..4391209 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.100-sound-switch-command-class-version-2.md @@ -0,0 +1,72 @@ + +# 4.100 Sound Switch Command Class, version 2 + +The Sound Switch Command Class is used to manage nodes with a speaker or sound notification capability. It can be used for a doorbell, alarm clock, siren or any device issuing sound notifications. + +## 4.100.1 Compatibility Considerations + +The Sound Switch Command Class is backwards compatible with the Sound Switch Command Class, version 1. All Commands and fields not mentioned in this version MUST remain unchanged from the Sound Switch Command Class, version 1. + +This version extends the following commands to allow a controlling node to modify the volume setting only for a single Tone Play Set Command: + + Sound Switch Tone Play Set Command  Sound Switch Tone Play Report Command + +## 4.100.2 Sound Switch Tone Play Set Command + +This command is used to instruct a supporting node to play (or stop playing) a tone. + +The supporting node MUST play the specified tone immediately when receiving this command. + +A node already playing a tone MUST interrupt the current tone and start playing the tone specified in this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE PLAY SET (0x08) _ _ _ _ | | | | | | | | +| Tone identifier | | | | | | | | +| Play Command Tone Volume | | | | | | | | + +All fields not described below MUST remain unchanged from version 1. + +Play Command Tone Volume (8 bits) + +This field is used to configure the volume for the actual Play Command. + +The volume setting configured with the Sound Switch Configuration Set Command MUST remain unchanged by this command and this field MUST be used for the volume of the actual tone that will start playing. + +This field MUST be set to 0x00 and ignored by a receiving node if the Tone identifier field is set to 0x00. + +[The encoding of this field MUST be according to Table 133.](04.100-sound-switch-command-class-version-2.md#41002-sound-switch-tone-play-set-command) Table 133, Sound Switch Tone Play Set::Play Command Volume encoding + +| Value | Description | +| --- | --- | +| 0 (0x00) | This value MUST indicate to use the configured current volume at the node (Sound Switch Configuration Set Command) | +| 1..100 (0x01..0x64) | These values MUST indicate the actual volume setting from respectively 1% to 100% to use for the Play Set Command. This value SHOULD be used only for critical applications (e.g. security alarm) where it is important to have the sound played even when the device is muted. | +| 255 (0xFF) | This value MUST indicate to use most recent non-zero volume setting if the current volume is muted (0x00). If the current configured volume is not muted (>0x00), this value MUST indicate to use the configured current volume at the node (Sound Switch Configuration Set Command) This value SHOULD be used only for critical application (e.g. security alarm) where it is important to have the sound played even when the device is muted. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.100.3 Sound Switch Tone Play Report Command + +This command is used to advertise the current tone being played by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE PLAY REPORT (0x0A) _ _ _ _ | | | | | | | | +| Tone Identifier | | | | | | | | +| Play Command Tone Volume | | | | | | | | + +All fields not described below MUST remain unchanged from version 1. + +Play Command Tone Volume (8 bits) + +This field MUSTadvertise the actual playing volume represented with the value from 0x00 …0x64 (0 … 100%). The values 0x00 and 0x64 MUST represent mute and maximum volume, respectively. + +This field MUST be set to 0x00 if the Tone Identifier field is set to 0x00. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.101-tariff-table-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.101-tariff-table-configuration-command-class-version-1.md new file mode 100644 index 0000000..63ec377 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.101-tariff-table-configuration-command-class-version-1.md @@ -0,0 +1,165 @@ + +# 4.101 Tariff Table Configuration Command Class, version 1 + +The Tariff Table Configuration Command Class defines the cost for a range of rates. + +The Tariff Table configuration commands are separated for the Tariff Table monitor commands in the Tariff Table Monitor Command Class, allowing the classes to be optionally supported at different Z- Wave security levels. + +## 4.101.1 Tariff Table Supplier Set Command + +This command is used to set the name of the utility supplier in the metering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF CONFIG _ _ _ | | | | | | | | +| Command = TARIFF TBL SUPPLIER SET _ _ _ | | | | | | | | +| Utility Timestamp Year 1 | | | | | | | | +| Utility Timestamp Year 2 | | | | | | | | +| Utility Timestamp Month | | | | | | | | +| Utility Timestamp Day | | | | | | | | +| Utility Timestamp Hour Local Time | | | | | | | | +| Utility Timestamp Minute Local Time | | | | | | | | +| Utility Timestamp Second Local Time | | | | | | | | +| Currency 1 | | | | | | | | +| Currency 2 | | | | | | | | +| Currency 3 | | | | | | | | +| Standing Charge Precision | | | Standing Charge Period | | | | | +| Standing Charge Value 1 | | | | | | | | +| Standing Charge Value 2 | | | | | | | | +| Standing Charge Value 3 | | | | | | | | +| Standing Charge Value 4 | | | | | | | | +| Reserved | | | Number of Supplier Characters | | | | | +| Supplier Character 1 | | | | | | | | +| … | | | | | | | | +| Supplier Character N | | | | | | | | + +Utility Timestamp Year (16 bits) + +Tariff applies from the specified year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Utility Timestamp Month (8 bits) + +Tariff applies from the specified month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. + +Utility Timestamp Day (8 bits) + +Tariff applies from the specified day of the month between 01 and 31. + +Utility Timestamp Hour Local Time (8 bits) + +Tariff applies from the specified number of complete hours that have passed since midnight (00-23) in local time. + +Utility Timestamp Minute Local Time (8 bits) + +Tariff applies from the specified number of complete minutes that have passed since the start of the hour (00-59) in local time. + +Utility Timestamp Second Local Time (8 bits) + +Tariff applies from the specified number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. + +Currency (3 bytes) + +ISO 4217 defines the currency code. In the table below are some examples of the codes listed: + +Table 134, Tariff Table Supplier Set::Currency encoding examples + +| Currency Code | Currency 1 | Currency 2 | Currency 3 | +| --- | --- | --- | --- | +| Pound sterling | G | B | P | +| US Dollar | U | S | D | + +Standing Charge Period (5 bits) + +This field indicates the stated period that standing charge applies e.g. 50p/week. + +Table 135, Tariff Table Supplier Set::Standing Charge Period encoding + +| Period | Value | +| --- | --- | +| Weekly | 0x01 | +| Monthly | 0x02 | +| Quarterly | 0x03 | +| Yearly | 0x04 | +| Reserved | 0x05-0x1F | + +Standing Charge Precision (3 bits) + +The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Standing Charge Value (32 bits) + +The Standing Charge value MUST be encoded as a 32-bit signed integer. The first byte MUST be the [most significant byte. Table 10, Signed field encoding (two’s complement representation) shows signed](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) decimal values together with their hexadecimal equivalents. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Number of Supplier Characters (5 bits) + +Number of characters defining the name of the utility supplier ID (1 … 32). + +Supplier Character (N bytes) + +The supplier character fields hold the string identifying the utility supplier. The character presentation uses standard ASCII codes (values 128-255 are ignored). + +## 4.101.2 Tariff Table Set Command + +This command adds a tariff to a given rate parameter set identifier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL _ _ _ | | | | | | | | +| Command = TARIFF TBL REPORT _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Tariff Precision | | | Reserved | | | | | +| Tariff Value 1 | | | | | | | | +| Tariff Value 2 | | | | | | | | +| Tariff Value 3 | | | | | | | | +| Tariff Value 4 | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID indicates the requested parameter set. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Tariff Precision (3 bits) + +The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Tariff Value (32 bits) + +The Tariff value is a 32 bit signed field. The first byte is the most significant byte. shows signed decimal values together with their hexadecimal equivalents. + +## 4.101.3 Tariff Table Remove Command + +This command is used to remove rate parameter set(s). + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL CONFIG _ _ _ _ | | | | | | | | +| Command = TARIFF TBL REMOVE _ _ | | | | | | | | +| Reserved | | Rate Parameter Set IDs | | | | | | +| Rate Parameter Set ID 1 | | | | | | | | +| ... | | | | | | | | +| Rate Parameter Set ID N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Rate Parameter Set IDs (6 bits) + +The rate parameter set id’s indicates the number of rate parameter set id’s in the command. + +Rate Parameter Set ID (N bytes) + +These fields contain a list of Tariffs to be removed from the Tariff Table. All Tariffs are cleared in case no Rate Parameter Set ID’s are supplied. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.102-tariff-table-monitor-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.102-tariff-table-monitor-command-class-version-1.md new file mode 100644 index 0000000..edc4c26 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.102-tariff-table-monitor-command-class-version-1.md @@ -0,0 +1,235 @@ + +# 4.102 Tariff Table Monitor Command Class, version 1 + +The Tariff Table Monitor Command Class defines the cost for a range of rates. + +## 4.102.1 Tariff Table Supplier Get Command + +This command is used to request the name of the utility supplier. + +The Tariff Table Supplier Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | +| Command = TARIFF TBL SUPPLIER GET _ _ _ | | | | | | | | + +## 4.102.2 Tariff Table Supplier Report Command + +This command is used to advertise the name of the utility supplier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | +| Command = TARIFF TBL SUPPLIER REPORT _ _ _ | | | | | | | | +| Utility Timestamp Year 1 | | | | | | | | +| Utility Timestamp Year 2 | | | | | | | | +| Utility Timestamp Month | | | | | | | | +| Utility Timestamp Day | | | | | | | | +| Utility Timestamp Hour Local Time | | | | | | | | +| Utility Timestamp Minute Local Time | | | | | | | | +| Utility Timestamp Second Local Time | | | | | | | | +| Currency 1 | | | | | | | | +| Currency 2 | | | | | | | | +| Currency 3 | | | | | | | | +| Standing Charge Precision | | | Standing Charge Period | | | | | +| Standing Charge Value 1 | | | | | | | | +| Standing Charge Value 2 | | | | | | | | +| Standing Charge Value 3 | | | | | | | | +| Standing Charge Value 4 | | | | | | | | +| Reserved | | | Number of Supplier Characters | | | | | +| Supplier Character 1 | | | | | | | | +| … | | | | | | | | +| Supplier Character N | | | | | | | | + +[Refer to description of fields under the Tariff Table Supplier Set Command (section 4.101.1)](04.101-tariff-table-configuration-command-class-version-1.md#41011-tariff-table-supplier-set-command) + +## 4.102.3 Tariff Table Get Command + +This command is used to request the tariff for the corresponding rate parameter set. + +The Tariff Table Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | +| Command = TARIFF TBL GET _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID addresses the price for the accompanying rate parameter set. The Rate Table Supported Report Command determines the number of supported rate parameter sets. + +## 4.102.4 Tariff Table Report Command + +This commandis used to advertise information relating to a given Rate Parameter Set Identifier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | +| Command = TARIFF TBL REPORT _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Tariff Precision | | | Reserved | | | | | +| Tariff Value 1 | | | | | | | | +| Tariff Value 2 | | | | | | | | +| Tariff Value 3 | | | | | | | | +| Tariff Value 4 | | | | | | | | + +[Refer to description of fields under the Tariff Table Set Command (section 4.101.2)](04.101-tariff-table-configuration-command-class-version-1.md#41012-tariff-table-set-command) + +## 4.102.5 Tariff Table Cost Get Command + +This command is used to request the cost according to rate parameter set ID, rate type, dataset mask and time interval. + +The Tariff Table Cost Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | +| Command = TARIFF TBL COST GET _ _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Start Year 1 | | | | | | | | +| Start Year 2 | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour Local Time | | | | | | | | +| Start Minute Local Time | | | | | | | | +| Stop Year 1 | | | | | | | | +| Stop Year 2 | | | | | | | | +| Stop Month | | | | | | | | +| Stop Day | | | | | | | | +| Stop Hour Local Time | | | | | | | | +| Stop Minute Local Time | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID indicates the requested parameter set. Rate Parameter Set ID equal to 0xFF returns overall accumulated cost. + +Start Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Start Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). + +Start Day (8 bits) Specify the day of the month between 01 and 31. + +Start Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00-23) in local time. + +Start Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. + +Stop Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. Setting the parameter to 0xFFFF indicates now. + +Stop Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that an accumulated value is not determined yet. Setting the parameter to 0xFF indicates now. + +Stop Day (8 bits) + +Specify the day of the month between 01 and 31. Setting the parameter to 0xFF indicates now. + +Stop Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00-23) in local time. Setting the parameter to 0xFF indicates now. + +Stop Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. Setting the parameter to 0xFF indicates now. + +Stop Second Local Time (8 bits) + +Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. Setting the parameter to 0xFF indicates now. + +## 4.102.6 Tariff Table Cost Report Command + +This command is used to report a number of time stamped values (historical) in physical units in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | +| Command = TARIFF TBL COST REPORT _ _ _ | | | | | | | | | +| Rate Parameter Set ID | | | | | | | | | +| Reserved | | | | | | | Rate Type | | +| Start Year 1 | | | | | | | | | +| Start Year 2 | | | | | | | | | +| Start Month | | | | | | | | | +| Start Day | | | | | | | | | +| Start Hour Local Time | | | | | | | | | +| Start Minute Local Time | | | | | | | | | +| Stop Year 1 | | | | | | | | | +| Stop Year 2 | | | | | | | | | +| Stop Month | | | | | | | | | +| Stop Day | | | | | | | | | +| Stop Hour Local Time | | | | | | | | | +| Stop Minute Local Time | | | | | | | | | +| Currency 1 | | | | | | | | | +| Currency 2 | | | | | | | | | +| Currency 3 | | | | | | | | | +| Cost Precision | | | Reserved | | | | | | +| Cost Value 1 | | | | | | | | | +| Cost Value 2 | | | | | | | | | +| Cost Value 3 | | | | | | | | | +| Cost Value 4 | | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID indicates the requested parameter set. Rate Parameter Set ID equal to 0xFF returns accumulated cost. Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Rate Type (2 bits) + +[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 69.](04.56-meter-command-class-version-2.md#4566-meter-report-command) + +Start/Stop Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Start/Stop Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. + +Start/Stop Day (8 bits) + +Specify the day of the month between 01 and 31. + +Start/Stop Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00-23) in local time. + +Start/Stop Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. + +Currency (3 bytes) + +[ISO 4217 defines the currency code. Examples are given in Table 134.](04.101-tariff-table-configuration-command-class-version-1.md#41011-tariff-table-supplier-set-command) + +Cost Precision (3 bits) + +The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Cost Value (32 bits) + +The Cost value is a 32 bit un-signed field. The first byte is the most significant byte. + +The value 0xFFFFFFFF is reserved, and SHOULD be used to report that the cost calculation has not yet been performed. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.91-thermostat-fan-mode-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.103-thermostat-fan-mode-command-class-version-1.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.91-thermostat-fan-mode-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.103-thermostat-fan-mode-command-class-version-1.md index 93da8ff..7c2a1b4 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.91-thermostat-fan-mode-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.103-thermostat-fan-mode-command-class-version-1.md @@ -1,33 +1,33 @@ -# 4.91 Thermostat Fan Mode Command Class, version 1 +# 4.103 Thermostat Fan Mode Command Class, version 1 The Thermostat Fan Mode Command Class, version 1 used for the HVAC’s systems manual fan. -## 4.91.1 Thermostat Fan Mode Set Command +## 4.103.1 Thermostat Fan Mode Set Command This command is used to set the fan mode in the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Fan Mode | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | +| Reserved | | | | Fan Mode | | | | Fan Mode (8 bits) -[This field MUST comply with the values indicated for version 1 in Table 129.](04.94-thermostat-fan-mode-command-class-version-4.md#4941-thermostat-fan-mode-set-command) +[This field MUST comply with the values indicated for version 1 in Table 136.](04.106-thermostat-fan-mode-command-class-version-4-5.md#41061-thermostat-fan-mode-set-command) Reserved This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. -## 4.91.2 Thermostat Fan Mode Get Command +## 4.103.2 Thermostat Fan Mode Get Command This command is used to request the fan mode in the device. @@ -35,30 +35,30 @@ The Thermostat Fan Mode Report Command MUST be returned in response to this comm This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE GET _ _ _ | | | | | | | | -## 4.91.3 Thermostat Fan Mode Report Command +## 4.103.3 Thermostat Fan Mode Report Command This command is used to report the fan mode in a device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Fan Mode | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | +| Reserved | | | | Fan Mode | | | | Fan Mode (8 bits) -[Refer to description under 4.91.1 Thermostat Fan Mode Set Command.](04.91-thermostat-fan-mode-command-class-version-1.md#4911-thermostat-fan-mode-set-command) +[Refer to description under 4.103.1 Thermostat Fan Mode Set Command.](04.103-thermostat-fan-mode-command-class-version-1.md#41031-thermostat-fan-mode-set-command) Reserved This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. -## 4.91.4 Thermostat Fan Mode Supported Get Command +## 4.103.4 Thermostat Fan Mode Supported Get Command This command is used to request the supported fan modes from the device. @@ -66,22 +66,22 @@ The Thermostat Fan Mode Supported Report Command MUST be returned in response to This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SUPPORTED GET _ _ _ _ | | | | | | | | -## 4.91.5 Thermostat Fan Mode Supported Report Command +## 4.103.5 Thermostat Fan Mode Supported Report Command This command is used to report the supported fan modes from the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | Bit Mask (N bytes) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.104-thermostat-fan-mode-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.104-thermostat-fan-mode-command-class-version-2.md new file mode 100644 index 0000000..308c91c --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.104-thermostat-fan-mode-command-class-version-2.md @@ -0,0 +1,52 @@ + +# 4.104 Thermostat Fan Mode Command Class, Version 2 + +The Thermostat Fan Mode Command Class, version 2 is used for the HVAC’s systems manual fan. + +The commands not mentioned here will remain the same as specified for Thermostat Fan Mode Command Class (Version 1). + +## 4.104.1 Thermostat Fan Mode Set Command + +This command is used to set the fan mode in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | +| Off | Reserved | | | Fan Mode | | | | + +Off (1 bit) + +The “Off bit” set to “1” will switch the fan fully OFF regardless of what fan mode has been set. In order to activate a fan mode the “Off bit” MUST be set to “0”. + +Fan Mode (4 bits) + +[This field MUST comply with the values indicated for version 2 and older in Table 136.](04.106-thermostat-fan-mode-command-class-version-4-5.md#41061-thermostat-fan-mode-set-command) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.104.2 Thermostat Fan Mode Report Command + +This command is used to report the fan mode in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | +| Reserved | | | | Fan Mode | | | | + +Fan Mode (4 bits) + +Refer to description under the Thermostat Fan Mode Set Command. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.93-thermostat-fan-mode-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.105-thermostat-fan-mode-command-class-version-3.md similarity index 53% rename from docs/specs/command-class-specification/04-command-class-definitions/04.93-thermostat-fan-mode-command-class-version-3.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.105-thermostat-fan-mode-command-class-version-3.md index c800ae6..7101a3c 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.93-thermostat-fan-mode-command-class-version-3.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.105-thermostat-fan-mode-command-class-version-3.md @@ -1,23 +1,23 @@ -# 4.93 Thermostat Fan Mode Command Class, Version 3 +# 4.105 Thermostat Fan Mode Command Class, Version 3 The Thermostat Fan Mode Command Class, version 3 is used for the HVAC’s systems manual fan. -## 4.93.1 Thermostat Fan Mode Set Command +## 4.105.1 Thermostat Fan Mode Set Command This command is used to set the fan mode in the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Off | | | Reserved | | | | | | | | | Fan Mode | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | +| Off | Reserved | | | Fan Mode | | | | Reserved @@ -25,13 +25,11 @@ This field MUST be set to 0 by a sending node and MUST be ignored by a receiving Off (1 bit) -The “Off bit” set to “1” will switch the fan fully OFF. In order to activate a fan mode the “Off bit” MUST be set to “0”. However, for some applications it is critical that the fan is ON in certain modes. In this case, the application can decide to ignore the Off bit. +The “Off bit” set to “1” will switch the fan fully OFF. In order to activate a fan mode the “Off bit” MUST be set to “0”. However, for some applications it is critical that the fan is ON in certain modes. In this case, the application can decide to ignore the Off bit. Fan Mode (4 bits) -Fan Mode (4 bits) - -[This field MUST comply with the values indicated for version 3 and older in Table 129.](04.94-thermostat-fan-mode-command-class-version-4.md#4941-thermostat-fan-mode-set-command) +[This field MUST comply with the values indicated for version 3 and older in Table 136.](04.106-thermostat-fan-mode-command-class-version-4-5.md#41061-thermostat-fan-mode-set-command) -## 4.93.2 Thermostat Fan Mode Get Command +## 4.105.2 Thermostat Fan Mode Get Command This command is used to request the fan mode in the device. @@ -39,24 +37,24 @@ The Thermostat Fan Mode Report Command MUST be returned in response to this comm This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE GET _ _ _ | | | | | | | | -## 4.93.3 Thermostat Fan Mode Report Command +## 4.105.3 Thermostat Fan Mode Report Command This command is used to report the fan mode in a device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Off | | | Reserved | | | | | | | | | Fan Mode | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | +| Off | Reserved | | | Fan Mode | | | | Fan Mode (4 bits) -[Refer to description under 4.93.1 Thermostat Fan Mode Set Command.](04.93-thermostat-fan-mode-command-class-version-3.md#4931-thermostat-fan-mode-set-command) +[Refer to description under 4.105.1 Thermostat Fan Mode Set Command.](04.105-thermostat-fan-mode-command-class-version-3.md#41051-thermostat-fan-mode-set-command) Reserved diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.94-thermostat-fan-mode-command-class-version-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.106-thermostat-fan-mode-command-class-version-4-5.md similarity index 54% rename from docs/specs/command-class-specification/04-command-class-definitions/04.94-thermostat-fan-mode-command-class-version-4.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.106-thermostat-fan-mode-command-class-version-4-5.md index 94c0258..c9cdcda 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.94-thermostat-fan-mode-command-class-version-4.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.106-thermostat-fan-mode-command-class-version-4-5.md @@ -1,25 +1,23 @@ -# 4.94 Thermostat Fan Mode Command Class, Version 4 +# 4.106 Thermostat Fan Mode Command Class, Version 4-5 -The Thermostat Fan Mode Command Class is an extension to support control and status monitoring functions of air-conditioning devices in order to achieve a global framework that covers the majority of generic functions implemented by world-wide air-conditioning manufacturer. The new features comprises of: +The Thermostat Fan Mode Command Class is an extension to support control and status monitoring functions of air-conditioning devices in order to achieve a global framework that covers the majority of generic functions implemented by world-wide air-conditioning manufacturer. The new features comprises of new Thermostat Fan Modes. - New Thermostat Fan Modes: LEFT & RIGHT, UP & DOWN, QUIET - -## 4.94.1 Thermostat Fan Mode Set Command +## 4.106.1 Thermostat Fan Mode Set Command This command is used to set the fan mode in the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Off | | | Reserved | | | | | | | | | Fan Mode | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | +| Off | Reserved | | | Fan Mode | | | | Reserved @@ -31,25 +29,25 @@ Off (1 bit) If the device transmitting the Thermostat Fan Mode Set command attempts to set a non-supported mode, the receiving thermostat device MUST ignore the command. -Table 129, Thermostat Fan Mode Set version 4::Fan Mode encoding - -| Fan Mode (4 bits) | | Description | | CC | | -| --- | --- | --- | --- | --- | --- | -| | | | | Version | | -| 0x00 | AUTO LOW | Will turn the manual fan operation off unless turned on by the manufacturer specific “auto low” algorithms | 1 | | | -| 0x01 | LOW | Will turn the manual fan operation on. Low speed is selected. | 1 | | | -| 0x02 | AUTO HIGH | Will turn the manual fan operation off unless turned on by the manufacturer specific “auto high” algorithms | 1 | | | -| 0x03 | HIGH | Will turn the manual fan operation on. High speed is selected. | 1 | | | -| 0x04 | AUTO MEDIUM | Will turn the manual fan operation off unless turned on by the manufacturer specific “auto medium” algorithms | 2 | | | -| 0x05 | MEDIUM | Will turn the manual fan operation on. Medium speed is selected. | 2 | | | -| 0x06 | CIRCULATION | Will turn the manual fan operation off unless turned on by the manufacturer specific circulation algorithms | 3 | | | -| 0x07 | HUMIDITY CIRCULATION | Will turn the manual fan operation off unless turned on by the manufacturer specific “humidity circulation” algorithms | 3 | | | -| 0x08 | LEFT & RIGHT | Will turn the manual fan operation off unless turned on by the manufacturer specific “left & right” circulation algorithms | 4 | | | -| 0x09 | UP & DOWN | Will turn the manual fan operation off unless turned on by the manufacturer specific “up & down” circulation algorithms | 4 | | | -| 0x0A | QUIET | Will turn the manual fan operation off unless turned on by the manufacturer specific “quiet” algorithms | 4 | | | -| 0x0B- 0x0F | Reserved | These values/modes are reserved for future use. The values cannot be supported by any device and will be ignored. | - | | | - -## 4.94.2 Thermostat Fan Mode Get Command +Table 136, Thermostat Fan Mode Set version 4::Fan Mode encoding + +| Fan Mode (4 bits) | | Description | CC Version | +| --- | --- | --- | --- | +| 0x00 | AUTO LOW | Will turn the manual fan operation off unless turned on by the manufacturer specific “auto low” algorithms | 1 | +| 0x01 | LOW | Will turn the manual fan operation on. Low speed is selected. | 1 | +| 0x02 | AUTO HIGH | Will turn the manual fan operation off unless turned on by the manufacturer specific “auto high” algorithms | 1 | +| 0x03 | HIGH | Will turn the manual fan operation on. High speed is selected. | 1 | +| 0x04 | AUTO MEDIUM | Will turn the manual fan operation off unless turned on by the manufacturer specific “auto medium” algorithms | 2 | +| 0x05 | MEDIUM | Will turn the manual fan operation on. Medium speed is selected. | 2 | +| 0x06 | CIRCULATION | Will turn the manual fan operation off unless turned on by the manufacturer specific circulation algorithms | 3 | +| 0x07 | HUMIDITY CIRCULATION | Will turn the manual fan operation off unless turned on by the manufacturer specific “humidity circulation” algorithms | 3 | +| 0x08 | LEFT & RIGHT | Will turn the manual fan operation off unless turned on by the manufacturer specific “left & right” circulation algorithms | 4 | +| 0x09 | UP & DOWN | Will turn the manual fan operation off unless turned on by the manufacturer specific “up & down” circulation algorithms | 4 | +| 0x0A | QUIET | Will turn the manual fan operation off unless turned on by the manufacturer specific “quiet” algorithms | 4 | +| 0x0B | EXTERNAL CIRCULATION | Will turn the manual fan operation off unless turned on by the manufacturer specific circulation algorithms. This mode will circulate fresh air from the outside. | 5 | +| 0x0C.. 0x0F | Reserved | These values/modes are reserved for future use. The values cannot be supported by any device and will be ignored. | - | + +## 4.106.2 Thermostat Fan Mode Get Command This command is used to request the fan mode in the device. @@ -57,24 +55,24 @@ The Thermostat Fan Mode Report Command MUST be returned in response to this comm This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE GET _ _ _ | | | | | | | | -## 4.94.3 Thermostat Fan Mode Report Command +## 4.106.3 Thermostat Fan Mode Report Command This command is used to report the fan mode in a device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Off | | | Reserved | | | | | | | | | Fan Mode | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | +| Off | Reserved | | | Fan Mode | | | | Refer to Thermostat Fan Mode Set command for parameter/field descriptions. -## 4.94.4 Thermostat Fan Mode Supported Get Command +## 4.106.4 Thermostat Fan Mode Supported Get Command This command is used to request the supported modes from the device. @@ -82,28 +80,28 @@ The Thermostat Fan Mode Supported Report Command MUST be returned in response to This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SUPPORTED GET _ _ _ _ | | | | | | | | -## 4.94.5 Thermostat Fan Mode Supported Report Command +## 4.106.5 Thermostat Fan Mode Supported Report Command This command is used to report the supported thermostat modes from the device. -| | 7 | | | 6 | | 5 | | | 4 | | | 3 | | | 2 | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | Bit Mask (N bytes) -[The Bit Mask fields describe the supported modes by the device (Refer to 4.94.1 Thermostat Fan Mode Set Command).](04.94-thermostat-fan-mode-command-class-version-4.md#4941-thermostat-fan-mode-set-command) +[The Bit Mask fields describe the supported modes by the device (Refer to 4.106.1 Thermostat Fan Mode](04.106-thermostat-fan-mode-command-class-version-4-5.md#41061-thermostat-fan-mode-set-command) Set Command). -[](04.94-thermostat-fan-mode-command-class-version-4.md#4941-thermostat-fan-mode-set-command) Bit 0 in Bit Mask 1 field indicates support for mode = 0 (AUTO LOW)  Bit 1 in Bit Mask 1 field indicates support for mode = 1 (LOW)  Bit 2 in Bit Mask 1 field indicates support for mode = 2 (AUTO HIGH)  … + Bit 0 in Bit Mask 1 field indicates support for mode = 0 (AUTO LOW)  Bit 1 in Bit Mask 1 field indicates support for mode = 1 (LOW)  Bit 2 in Bit Mask 1 field indicates support for mode = 2 (AUTO HIGH)  … The mode is supported if the bit is 1 and the opposite if 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported mode. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. @@ -111,17 +109,11 @@ Example: To indicate the thermostat device supports AUTO LOW, AUTO HIGH and AUTO MEDIUM, the Thermostat Fan Mode Supported Report command MUST be structured as illustrated below. -| | 7 | | | 6 | | 5 | | | 4 | | | 3 | | | 2 | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | -| Bit Mask 1 0 0 0 1 0 1 0 1 | | | | | | | | | | | | | | | | | | - -![figure p532](assets/img-2f5fb50cdf.png) - -![figure p532](assets/img-2f5fb50cdf.png) - -![figure p532](assets/img-2f5fb50cdf.png) +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 0 0 0 1 0 1 0 1 | | | | | | | | | 0 | 0 | 0 | 1 | 0 | 1 | 0 | | --- | --- | --- | --- | --- | --- | --- | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.107-thermostat-fan-state-command-class-version-1-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.107-thermostat-fan-state-command-class-version-1-2.md new file mode 100644 index 0000000..f8dfe51 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.107-thermostat-fan-state-command-class-version-1-2.md @@ -0,0 +1,63 @@ + +# 4.107 Thermostat Fan State Command Class, version 1-2 + +The Thermostat Fan State Command Class is used to obtain the fan operating state of the thermostat. + +## 4.107.1 Compatibility considerations + +A device supporting Thermostat Fan State CC, Version 2 MUST support Thermostat Fan State CC, Version 1. + +Version 2 adds Fan Operating State identifiers for use in the Thermostat Fan State Report Command. Commands not described in Version 2 stays unchanged from version 1. + +## 4.107.2 Thermostat Fan State Get Command + +This command is used to request the fan operating state from the device. + +The Thermostat Fan State Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN STATE GET _ _ _ | | | | | | | | + +## 4.107.3 Thermostat Fan State Report Command + +This command is used to report the fan operating state of the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT FAN STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT FAN STATE REPORT _ _ _ | | | | | | | | +| Reserved | | | | Fan Operating State | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Fan Operating State (4 bits) + +[The fan operating state identifier MUST comply with Table 137.](04.107-thermostat-fan-state-command-class-version-1-2.md#41073-thermostat-fan-state-report-command) + +Table 137, Thermostat Fan State Report::Fan Operating State encoding + +| Fan Operating State | Description | CC Version | +| --- | --- | --- | +| 0 | Idle / Off | 1 | +| 1 | Running / Running Low – If device only supports one fan speed, this state is used to report the fan is running. If the device is a multi-speed device, this state is used to report that the fan is running at the low speed. | 1 | +| 2 | Running High | 1 | +| 3 | Running Medium | 2 | +| 4 | Circulation Mode | 2 | +| 5 | Humidity Circulation Mode | 2 | +| 6 | Right – Left Circulation Mode | 2 | +| 7 | Up – Down Circulation Mode | 2 | +| 8 | Quiet Circulation Mode | 2 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.108-thermostat-mode-command-class-version-1-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.108-thermostat-mode-command-class-version-1-2.md new file mode 100644 index 0000000..eb5b936 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.108-thermostat-mode-command-class-version-1-2.md @@ -0,0 +1,112 @@ + +# 4.108 Thermostat Mode Command Class, version 1-2 + +The Thermostat Mode Command Class is used to control which mode a thermostat operates. + +## 4.108.1 Interoperability considerations + +Most thermostat modes require a supporting node to have an associated setpoint, which can managed with the Thermostat Setpoint Command Class. A node supporting this Command Class SHOULD support the Thermostat Setpoint Command Class. + +## 4.108.2 Thermostat Mode Set Command + +This command is used to set the thermostat mode at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | +| Command = THERMOSTAT MODE SET (0x01) _ _ | | | | | | | | +| Reserved | | | Mode | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (5 bits) + +This field is used to set the thermostat mode at the receiving node. + +[This field MUST be encoded according to Table 138.](04.109-thermostat-mode-command-class-version-3.md#41093-thermostat-mode-set-command) + +## 4.108.3 Thermostat Mode Get Command + +This command is used to request the current mode set at the receiving node. + +The Thermostat Mode Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | +| Command = THERMOSTAT MODE GET (0x02) _ _ | | | | | | | | + +## 4.108.4 Thermostat Mode Report Command + +This command is used to report the mode from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | +| Command = THERMOSTAT MODE REPORT (0x03) _ _ | | | | | | | | +| Reserved | | | Mode | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (5 bits) + +This field is used to advertise the current thermostat mode at the receiving node. + +[This field MUST be encoded according to Table 138.](04.109-thermostat-mode-command-class-version-3.md#41093-thermostat-mode-set-command) + +This field MUST NOT be set to 0x05 (RESUME(ON)) in this command. + +## 4.108.5 Thermostat Mode Supported Get Command + +This command is used to request the supported modes of a node. + +The Thermostat Mode Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | +| Command = THERMOSTAT MODE SUPPORTED GET (0x04) _ _ _ | | | | | | | | + +## 4.108.6 Thermostat Mode Supported Report Command + +This command is used to advertise which modes are supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | +| Command = THERMOSTAT MODE SUPPORTED REPORT (0x05) _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +This field advertises the Modes supported by the supporting node. + +A supporting node MUST support at least one mode. Modes and their minimum required version are [described in Table 138. A node MUST NOT support a mode associated to a newer version than the](04.109-thermostat-mode-command-class-version-3.md#41093-thermostat-mode-set-command) version it supports. + + Bit 0 in Bit Mask 1 represents Mode = 0x00 (Off). + + Bit 1 in Bit Mask 1 represents Mode = 0x01 (Heat). + + … If a Mode is supported, the corresponding bit MUST be set to ‘1’. + +If a Mode is not supported, the corresponding bit MUST be set to ‘0’. + +This length of this field MUST be set to the minimum amount of bytes which allows advertising all supported Modes. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.109-thermostat-mode-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.109-thermostat-mode-command-class-version-3.md new file mode 100644 index 0000000..c1b9a9a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.109-thermostat-mode-command-class-version-3.md @@ -0,0 +1,118 @@ + +# 4.109 Thermostat Mode Command Class, version 3 + +The Thermostat Mode Command Class is used to control which mode a thermostat operates. + +## 4.109.1 Compatibility considerations + +The Thermostat Mode Command Class, version 3 is backwards compatible with the Thermostat Mode Command Class, version 1-2. + +All commands and fields not mentioned in this version MUST remain unchanged from the Thermostat Mode Command Class, version 1-2. + +This version introduces: + + A new FULL POWER thermostat mode  MANUFACTURER SPECIFIC mode + +## 4.109.2 Interoperability considerations + +The MANUFACTURER SPECIFIC (proprietary) mode MUST NOT be supported by a node if the functionality can be provided using a thermostat mode defined in this command class. + +A node supporting the MANUFACTURER SPECIFIC mode MUST fulfill the following conditions: + + The node MUST support as a minimum two other thermostat modes (e.g. HEAT and COOL).  If the MANUFACTURER SPECIFIC mode functionality can in part be supported by one or more defined thermostat mode in this command class, the node MUST also support these thermostat modes.  The MANUFACTURER SPECIFIC mode and all of its associated Manufacturer Data fields MUST be described in the product manual. + +## 4.109.3 Thermostat Mode Set Command + +This command is used to set the thermostat mode at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | +| Command = THERMOSTAT MODE SET (0x01) _ _ | | | | | | | | +| No of Manufacturer Data fields | | | Mode | | | | | +| Manufacturer Data 1 | | | | | | | | +| … | | | | | | | | +| Manufacturer Data N | | | | | | | | + +No of Manufacturer Data fields (3 bits) + +This field is used to advertise the length in bytes of the Manufacturer Data field in the command. This field MUST be in the range 0..7. + +This field MUST be set to 0 if the Mode field is not set to 0x1F (MANUFACTURER SPECIFIC). + +This field MUST indicate the length in bytes of the Manufacturer Data field if the Mode field is set to 0x1F (MANUFACTURER SPECIFIC). + +Mode (5 bits) + +This field is used to set the thermostat mode at the receiving node. + +[This field MUST be encoded according to Table 138.](04.109-thermostat-mode-command-class-version-3.md#41093-thermostat-mode-set-command) + +Manufacturer Data (N bytes) + +[This field is used to provide a configuration for the MANUFACTURER SPECIFIC mode. Refer to 4.109.2](04.109-thermostat-mode-command-class-version-3.md#41092-interoperability-considerations) Interoperability considerations. Table 138, Thermostat Mode Set version 3::Mode encoding + +| Mode (5 bits) | | Description | Requires own Setpoint | CC Version | +| --- | --- | --- | --- | --- | +| 0x00 | OFF | This mode is used to switch off the thermostat. | No | 1 | +| 0x01 | HEAT | This mode is used to use activate heating when the temperature is below the Heating (0x01) setpoint. | Yes | 1 | +| 0x02 | COOL | This mode is used to use activate cooling when the temperature is above the Cooling (0x02) setpoint. | Yes | 1 | +| 0x03 | AUTO | This mode is used to regulate the temperature using heating and cooling when the temperature is outside the range defined by the Heating (0x01) and Cooling (0x02) setpoints. | No | 1 | +| 0x04 | AUXILIARY | This mode is used to use activate heating when the temperature is below the Heating (0x01) setpoint, but using and auxiliary or emergency heat source. For example , a heat pump is not efficient when the outside temperature is too low. The auxiliary heat mode may be activated to use a more efficient secondary heat source. | No | 1 | +| 0x05 | RESUME (ON) | This mode is used resume to last active mode (different than OFF 0x00). | No | 1 | +| 0x06 | FAN | This mode is used to activate fans only and circulate air. | No | 1 | +| 0x07 | FURNACE | This mode is used to activate fans to circulate air and heating or cooling will be activated to regulate the temperature at the Furnace (0x07) setpoint. | Yes | 1 | +| 0x08 | DRY | This mode is used to dehumidify and remove moisture. Heating or cooling will be activated to regulate the temperature at the Dry Air (0x08) setpoint. | Yes | 1 | + +| Mode (5 bits) | | Description | Requires own Setpoint | CC Version | +| --- | --- | --- | --- | --- | +| 0x09 | MOIST | This mode is used to humidify and add moisture. Heating or cooling will be activated to regulate the temperature at the Moist Air (0x09) setpoint. | Yes | 1 | +| 0x0A | AUTO CHANGEOVER | This mode is used to regulate the temperature at the Auto Changeover (0x0A) setpoint using heating and cooling. | Yes | 1 | +| 0x0B | ENERGY HEAT | This mode is used to use activate heating when the temperature is below the Energy Save Heating (0x0B) setpoint. The Energy Save Heating (0x0B) setpoint is usually lower than the Heating (0x01) setpoint in order to save energy | Yes | 2 | +| 0x0C | ENERGY COOL | This mode is used to use activate cooling when the temperature is below the Energy Save Cooling (0x0C) setpoint. The Energy Save Cooling (0x0C) setpoint is usually higher than the Cooling (0x02) setpoint in order to save energy | Yes | 2 | +| 0x0D | AWAY | This mode is used to regulate the temperature using heating and cooling when the temperature is outside the range defined by the Away Heating (0x0D) and Away Cooling (0x0E) setpoints. | Yes | 2 | +| 0x0E | Reserved | Reserved | - | 3 | +| 0x0F | FULL POWER | This mode is used to regulate the temperature at the Full Power (0x0F) setpoint using heating and cooling. This mode is intended to use more energy and speed up the temperature regulation to the desired setpoint. | Yes | 3 | +| | | | | | +| 0x1F | MANUFACTURER SPECIFIC | Reserved for vendor specific thermostat mode | No | 3 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.109.4 Thermostat Mode Report Command + +This command is used to report the current mode of the device. + +| 7 | 6 | 5 | 4 | | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT MODE (0x40) _ _ _ | | | | | | | | | +| Command = THERMOSTAT MODE REPORT (0x03) _ _ | | | | | | | | | +| No of Manufacturer Data fields | | | | Mode | | | | | +| Manufacturer Data 1 | | | | | | | | | +| … | | | | | | | | | +| Manufacturer Data N | | | | | | | | | + +No of Manufacturer Data fields (3 bits) + +This field is used to advertise the length in bytes of the Manufacturer Data field in the command. This field MUST be in the range 0..7. + +This field MUST be set to 0 if the Mode field is not set to 0x1F (MANUFACTURER SPECIFIC). + +This field MUST indicate the length in bytes of the Manufacturer Data field if the Mode field is set to 0x1F (MANUFACTURER SPECIFIC). + +Mode (5 bits) + +This field is used to advertise the current thermostat mode at the receiving node. + +[This field MUST be encoded according to Table 138.](04.109-thermostat-mode-command-class-version-3.md#41093-thermostat-mode-set-command) + +This field MUST NOT be set to 0x05 (RESUME(ON)) in this command. + +Manufacturer Data (N bytes) + +This field is used to advertise the current configuration for the MANUFACTURER SPECIFIC mode. Refer [to 4.109.2 Interoperability considerations.](04.109-thermostat-mode-command-class-version-3.md#41092-interoperability-considerations) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.11-authentication-media-write-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.11-authentication-media-write-command-class-version-1.md new file mode 100644 index 0000000..598806d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.11-authentication-media-write-command-class-version-1.md @@ -0,0 +1,162 @@ + +# 4.11 Authentication Media Write Command Class, version 1 + +This command class is used to write raw Authentication Media data, such as RFID data contents on tags. + +The supported authentication medium itself is specific to individual nodes. Supporting nodes can use the Entry Control Command Class to report the corresponding readings of their supported Authentication Media. + +## 4.11.1 Authentication Media Capability Get Command + +This command is used to request the Authentication Media capabilities supported by the receiving node. + +[The Authentication Media Capability Report Command MUST be returned in response to this](04.11-authentication-media-write-command-class-version-1.md#4112-authentication-media-capability-report-command) command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION MEDIA WRITE (0xA2) _ _ _ _ | | | | | | | | +| Command = AUTHENTICATION MEDIA CAPABILITIES GET(0x01) _ _ _ | | | | | | | | + +## 4.11.2 Authentication Media Capability Report Command + +This command is used to advertise the Authentication Media Command Class capabilities supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION MEDIA WRITE (0xA2) _ _ _ _ | | | | | | | | +| Command = AUTHENTICATION MEDIA CAPABILITIES REPORT (0x02) _ _ _ | | | | | | | | +| Reserved | | | | | | | DGS | + +DGS (Data Generation support) (1 bit) + +This field is used to advertise if the supporting node has the capability to generate authentication data that can be written on its authentication media. + +This feature is used if the authentication media has a particular format and would not accept any arbitral hexadecimal data. + +If this field is set to 1, the supporting node MUST support creating authentication data for their write operations. If this field is set to 0, the supporting node MUST NOT support creating authentication data for their write operations. + +## 4.11.3 Authentication Media Write Start Command + +This command is used to write Authentication Media contents (i.e., RFID data to a tag). + +[The Authentication Media Write Status Command MUST be returned in response to this command.](04.11-authentication-media-write-command-class-version-1.md#4115-authentication-media-write-status-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION MEDIA WRITE (0xA2) _ _ _ _ | | | | | | | | +| Command = AUTHENTICATION MEDIA WRITE START (0x03) _ _ _ | | | | | | | | +| Sequence number | | | | | | | | +| Timeout | | | | | | | | +| Generate- data | Reserved | | | | | | | +| Data Length | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | + +Sequence number (8 bits) + +This field is used to keep track of the Authentication Media Write Operation session. + +[A supporting node MUST return a Authentication Media Write Status Command with the status field set](04.11-authentication-media-write-command-class-version-1.md#4115-authentication-media-write-status-command) to 0x03 if receiving this command with a different sequence number than the ongoing write operation. + +Timeout (8 bits) + +This field is used to specify how many seconds the receiving node MUST wait between the reception of this command and aborting the write operation. + +For nodes with a sensing/feeback capability for their authentication media write operation, this value MUST also be used to wait that a media is accessible to the receiving node before the write operation is aborted. + +For Nodes without any feedback capability for their authentication media write operation MUST ignore this timeout value after and try to write the data on the authentication media target immediately. Generate data (1 bit) + +This field is used to indicate the supporting node to generate the Authentication data that will be written on the Authentication Media. + +If this field is set to 1, the Data Length field MUST be set to 0. + +If this field is set to 1, the supporting node MUST generate valid authentication data and return the written data in the Data field of the returned response. + +Data Length (8 bits) + +This field is used to describe the length in bytes of the corresponding Data field. + +This field MUST be in the range 0..255. + +This field MUST be set to a value higher than 0 if the Generate Data field is set to 0. + +Data (N bytes) + +This field is used to advertise the Data contents that MUST be written to the media. + +The length of this field in bytes MUST be according to the corresponding Data Length field value. + +## 4.11.4 Authentication Media Write Stop Command + +This command is used to interrupt an ongoing Authentication Media Write operation. + +[The Authentication Media Write Status Command MUST be returned in response to this command.](04.11-authentication-media-write-command-class-version-1.md#4115-authentication-media-write-status-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION MEDIA WRITE (0xA2) _ _ _ _ | | | | | | | | +| Command = AUTHENTICATION MEDIA WRITE STOP (0x04) _ _ _ | | | | | | | | + +## 4.11.5 Authentication Media Write Status Command + +This command is used to advertise the status of an Authentication Media Write operation. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS AUTHENTICATION MEDIA WRITE (0xA2) _ _ _ _ | | | | | | | | +| Command = AUTHENTICATION MEDIA WRITE STATUS (0x05) _ _ _ | | | | | | | | +| Sequence number | | | | | | | | +| Status | | | | | | | | +| Data Length | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | + +Sequence number (8 bits) + +This field is used to advertise the sequence number of the last Write operation. + +[If an Authentication Media Write Stop Command was received while no operation was ongoing, this](04.11-authentication-media-write-command-class-version-1.md#4114-authentication-media-write-stop-command) field SHOULD be set to 0x00. + +Data Length (8 bits) + +This field is used to advertise the length in bytes of the Data field. + +This field MUST be in the range 0..255. + +This field MUST be set to a value highest than 0 if the Status field is set to 0xFE or 0xFF. + +Data (N bytes) + +This field is used to advertise the data that was written on the Authentication media as part of the write operation. + +This field MUST contain the data that was written on the media if the Status field is set to 0xFE or 0xFF. Status (8 bit) + +This field is used to indicate the status of the Authentication Media Write operation. This field MUST [encoded according to Table 63.](04.50-ir-repeater-command-class-version-1/01.01.05-ir-repeater-ir-code-learning-status-command.md#115-ir-repeater-ir-code-learning-status-command) + +Table 16,Authentication Media Write Status::Status encoding + +| Value | Description | +| --- | --- | +| 0x00 | Failed: Write operation not supported The node does not support write operations. | +| 0x01 | Failed: Forced stop The node has received a Authentication Media Write Stop Command before the data contents could be written on the target. | +| 0x02 | Failed: timeout The node has timed out and could not write the data content on a target | +| 0x03 | Failed: Another operation is ongoing The node has did not initiate the write operation as another operation was already ongoing. | +| 0x04 | Failed: Aborted The node has aborted the operation due to local input or other higher priority task. | +| 0x05 | Failed: Buffer overflow The node could not start or aborted the write operation as it ran into a buffer overflow while caching the data to write. | +| 0x06 | Failed: Proprietary hex data restriction The node has received hexadecimal data that does not comply with the required format for its Authentication Media data. The controlling node should use the “Generate-data” flag instead. This status MUST NOT be returned by a node if it does not advertise support for Data Generation in the Authentication Media Capability Report Command | +| 0x07 | Failed: Non re-writable target The node could not write the data on the target as it already contains some data that could not be overwritten. | +| 0xFE | Completed with no status: The Write Operation was carried out, but the node has no feedback from the media writing operation and cannot confirm that the data was properly written on the target. | +| 0xFF | Success The specified data was properly written on the target. | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.110-thermostat-operating-state-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.110-thermostat-operating-state-command-class-version-1.md new file mode 100644 index 0000000..989b601 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.110-thermostat-operating-state-command-class-version-1.md @@ -0,0 +1,41 @@ + +# 4.110 Thermostat Operating State Command Class, version 1 + +The Thermostat Operating State Command Class is used to obtain the operating state of the thermostat. + +## 4.110.1 Thermostat Operating State Get Command + +This command is used to request the operating state. + +The Thermostat Operating State Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE GET _ _ _ | | | | | | | | + +## 4.110.2 Thermostat Operating State Report Command + +The Thermostat Operating State Report Command is used to report the operating state. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE REPORT _ _ _ | | | | | | | | +| Reserved | | | | Operating State | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Operating State (4 bits) + +[The thermostat operating state identifier MUST comply with Table 139.](04.111-thermostat-operating-state-command-class-version-2.md#41112-thermostat-operating-state-report) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.111-thermostat-operating-state-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.111-thermostat-operating-state-command-class-version-2.md new file mode 100644 index 0000000..59737ed --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.111-thermostat-operating-state-command-class-version-2.md @@ -0,0 +1,160 @@ + +# 4.111 Thermostat Operating State Command Class, version 2 + +The Thermostat Operating State Command Class is used to obtain the operating state of the thermostat as well as logged operating runtime times of thermostat. + +## 4.111.1 Thermostat Operating State Get + +This command gets the operating state of the thermostat. + +The Thermostat Operating State Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE GET _ _ _ | | | | | | | | + +## 4.111.2 Thermostat Operating State Report + +This command is used to report the operating state. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE REPORT _ _ _ | | | | | | | | +| Operating State | | | | | | | | + +Operating State (8 bits) + +[The thermostat operating state identifier MUST be set according to Table 139.](04.111-thermostat-operating-state-command-class-version-2.md#41112-thermostat-operating-state-report) + +Table 139, Thermostat Operating State Report version 2::Operating State encoding + +| Operating State | Description | Version | +| --- | --- | --- | +| 0x00 | Idle | 1 | +| 0x01 | Heating | 1 | +| 0x02 | Cooling | 1 | +| 0x03 | Fan Only | 1 | +| 0x04 | Pending Heat. Short cycle prevention feature used in heat pump applications to protect the compressor. | 1 | +| 0x05 | Pending Cool. Short cycle prevention feature used in heat pump applications to protect the compressor. | 1 | +| 0x06 | Vent/Economizer. | 1 | +| 0x07 | Aux Heating | 2 | +| 0x08 | 2nd Stage Heating | 2 | +| 0x09 | 2nd Stage Cooling | 2 | +| 0x0A | 2nd Stage Aux Heat | 2 | +| 0x0B | 3rd Stage Aux Heat | 2 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.111.3 Thermostat Operating State Logging Supported Get + +This command is used to request the operating state logging supported by the device. + +The Thermostat Operating State Logging Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE LOGGING SUPPORTED GET _ _ _ _ _ | | | | | | | | + +## 4.111.4 Thermostat Operating State Logging Supported Report + +This command is used to report the operating state logging supported by the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING LOGGING SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +The Bit Mask fields describe the operating state logging supported by the device. + + Bit 0 in Bit Mask 1 is not allocated to any Operating State and MUST beset to zero.  Bit 1 in Bit Mask 1 indicates if Operating State = 1 (Heating) log is supported.  Bit 2 in Bit Mask 1 indicates if Operating State = 2 (Cooling) is supported.  … + +If the Operating State log is supported the bit MUST be set to 1. If the Operating State log is not supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported operating state log. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. + +## 4.111.5 Thermostat Operating State Logging Get + +This command is used to request the operating state logging supported by the device. + +The Thermostat Operating State Logging Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE LOGGING GET _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +The Bit Mask fields describe the operating state log types to be requested. + + Bit 0 in Bit Mask 1 is not allocated to any Operating State and MUST be set to zero.  Bit 1 in Bit Mask 1 indicates if Operating State = 1 (Heating) log is supported.  Bit 2 in Bit Mask 1 indicates if Operating State = 2 (Cooling) is supported. + + … + +If the Operating State log is supported the bit MUST be set to 1. If the Operating State log is not supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last requested operating state log type. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. + +## 4.111.6 Thermostat Operating State Logging Report + +This command is used to report the operating state logged for requested operating states. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | +| Command = THERMOSTAT OPERATING STATE LOGGING REPORT _ _ _ _ | | | | | | | | +| Reports to Follow | | | | | | | | +| Reserved | | | | Operating State Log Type 1 | | | | +| Usage Today (Hours) | | | | | | | | +| Usage Today (Minutes) | | | | | | | | +| Usage Yesterday (Hours) | | | | | | | | +| Usage Yesterday (Minutes) | | | | | | | | +| … | | | | | | | | +| Reserved | | | | Operating State Log Type N | | | | +| Usage Today (Hours) | | | | | | | | +| Usage Today (Minutes) | | | | | | | | +| Usage Yesterday (Hours) | | | | | | | | +| Usage Yesterday (Minutes) | | | | | | | | + +Reports to Follow (8 bits) + +This value indicates how many report frames left before transferring all of the requested thermostat operating state logs. + +Operating State Log Type (N * 4 bits) + +The Operating State Log Type indicates the operating state type to be requested. + +Usage Today Hours (8 bits) + +The number of hours (00:24) the thermostat has been in the indicated operating state since 12:00 am of the current day. + +Usage Today Minutes (8 bits) + +The number of minutes (00-59) the thermostat has been in the indicated operating state since 12:00 am of the current day. + +Usage Yesterday Hours (8 bits) + +The number of hours (00:24) the thermostat had been in the indicated operating state between 12:00 am and 11:59pm of the previous day. + +Usage Yesterday Hours (8 bits) + +The number of minutes (00-59) the thermostat had been in the indicated operating state between 12:00 am and 11:59pm of the previous day. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.112-thermostat-setback-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.112-thermostat-setback-command-class-version-1.md new file mode 100644 index 0000000..28e5390 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.112-thermostat-setback-command-class-version-1.md @@ -0,0 +1,86 @@ + +# 4.112 Thermostat Setback Command Class, version 1 + +The Thermostat Setback Command Class is used to change the current state of a non-schedule setback thermostat. + +## 4.112.1 Thermostat Setback Set Command + +This command is used to set the state of the thermostat. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETBACK _ _ _ | | | | | | | | +| Command = THERMOSTAT SETBACK SET _ _ | | | | | | | | +| Reserved | | | | | | Setback Type | | +| Setback State | | | | | | | | + +Setback Type (2 bits) + +[The setback type field MUST comply with Table 140](04.112-thermostat-setback-command-class-version-1.md#41121-thermostat-setback-set-command) + +Table 140, Thermostat Setback Set::Setback Type encoding + +| Value | Description | +| --- | --- | +| 0x00 0x01 0x02 0x03 | No override Temporary override Permanent override Reserved | + +Note: The temporary override provides an opportunity to implement a timer or equivalent in the device. A temporary override will, if a timer is implemented, be terminated by the timer. If no timer is implemented the temporary override MUST act as permanent override. If the temporary override is implemented it MUST be documented in the user’s manual. + +Setback State (8 bits) + +[The Setback State MUST comply with Table 141](04.112-thermostat-setback-command-class-version-1.md#41121-thermostat-setback-set-command) Table 141, Thermostat Setback Set::Setback State encoding + +| Setback State | | Description | +| --- | --- | --- | +| Hexadecimal | Decimal | | +| 0x80 … 0xFF 0x00 0x01 … 0x78 | -128 … -1 0 1 … 120 | The setback in 1/10 degrees (Kelvin) Example: 0 = 0 degrees setback 1 = 0.1 degrees is added to the setpoint 2 = 0.2 degrees is added to the setpoint -1 = 0.1 degrees is subtracted from the setpoint -2 = 0.2 degrees is subtracted from the setpoint | +| 0x79 | 121 | Frost Protection | +| 0x7A | 122 | Energy Saving Mode | +| 0x7B – 0x7E | 123 – 126 | Reserved | +| 0x7F | 127 | Unused State | + +Reserved values MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +When converting between Celsius and Fahrenheit proper rounding MUST be applied with at least two decimals in the internal calculations of a device to avoid rounding errors. + +Note: The implementation of Energy Saving Mode is manufacturer specific, and MUST be documented in the User’s Manual. + +If the device is set to an unreachable state, the device SHOULD assume the closest possible state. + +## 4.112.2 Thermostat Setback Get Command + +This command is used to request the current state of the thermostat. + +The Thermostat Setback Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETBACK _ _ _ | | | | | | | | +| Command = THERMOSTAT SETBACK GET _ _ | | | | | | | | + +## 4.112.3 Thermostat Setback Report Command + +This command is used to report the current state of the thermostat. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETBACK _ _ _ | | | | | | | | +| Command = THERMOSTAT SETBACK REPORT _ _ | | | | | | | | +| Reserved | | | | | | Setback Type | | +| Setback State | | | | | | | | + +Setback Type (2 bits) + +Refer to description under the Thermostat Setback Set Command + +Setback State (8 bits) + +Refer to description under the Thermostat Setback Set Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.113-thermostat-setpoint-command-class-version-1-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.113-thermostat-setpoint-command-class-version-1-2.md new file mode 100644 index 0000000..a200d64 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.113-thermostat-setpoint-command-class-version-1-2.md @@ -0,0 +1,177 @@ + +# 4.113 Thermostat Setpoint Command Class, version 1-2 + +The Thermostat Setpoint Command Class is used to configure setpoints for the modes supported by a thermostat. + +## 4.113.1 Interoperability Considerations + +It has been found that early implementations of this Command Class specification apply two non- interoperable interpretations of the bit mask advertising the support for specific Setpoint Types. + +As a consequence, one may find thermostat products and controller products in the marketplace which [implement either of the two bit mask interpretations found in Table 142. The notation x.y indicates Bit](04.114-thermostat-setpoint-command-class-version-3.md#41142-interoperability-considerations) Mask byte x, bit y. + +Implementations of Thermostat Setpoint Command Class, version 1-2 MUST comply with Interpretation A. + +## 4.113.2 Thermostat Setpoint Set Command + +This command is used to specify the target value for the specified Setpoint Type at a supporting node. + +A supporting node MUST support the same format of Precision, Scale and Size fields values as it sends in the Thermostat Setpoint Supported Report Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT SET (0x01) _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| .. | | | | | | | | +| Value N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to specify the setpoint to be set at the receiving node . [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +If a non-supported setpoint type is specified, a receiving node MUST ignore the command. + +Precision (3 bits) + +This field is used to indicate how many decimal places are included in the Value field. For example, the Value field set to 1025 with the Precision field set to 2 MUST be interpreted as 10.25. + +Scale (2 bits) + +This field is used to specify what temperature scale is used for the setpoint value. [The field MUST be encoded according to Table 144.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +Size (3 bits) + +This field is used to indicate the length in bytes of the Value field. This field MUST be set to 1, 2 or 4. + +Value (N bytes) + +This field is used to advertise the actual setpoint value to be set at the receiving node. The length of this field MUST be according to the Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +## 4.113.3 Thermostat Setpoint Get Command + +This command is used to request the target value for a given setpoint type that is currently configured at a supporting node. + +The Thermostat Setpoint Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT GET (0x02) _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to specify which setpoint is requested. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +A supporting node receving a supported Setpoint Type value MUST be return the same value in the Thermostat Setpoint Report Command. + +A supporting node receiving a non-supported Setpoint Type value MUST return the value 0x00 (N/A) in the Thermostat Setpoint Report Command. + +## 4.113.4 Thermostat Setpoint Report Command + +This command is used to advertise the target value for a given setpoint type that is currently configured at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT REPORT (0x03) _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| .. | | | | | | | | +| Value N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to advertise the setpoint advertised by the sending node. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +If this field is set to 0x00 (N/A), it is RECOMMENDED to set the Size field to 1 and the Value field to 0. + +Precision (3 bits) + +This field is used to indicate how many decimal places are included in the Value field. For example, the Value field set to 1025 with the Precision field set to 2 MUST be interpreted as 10.25. + +Scale (2 bits) + +This field is used to specify what temperature scale is used for the setpoint value. [The field MUST be encoded according to Table 144.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +Size (3 bits) + +This field is used to indicate the length in bytes of the Value field. This field MUST be set to 1, 2 or 4. Value (N bytes) + +This field is used to advertise the actual setpoint value set at the sending node. + +The length of this field MUST be according to the Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +## 4.113.5 Thermostat Setpoint Supported Get Command + +This command is used to query the supported setpoint types. + +The Thermostat Setpoint Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT SUPPORTED GET (0x04) _ _ _ | | | | | | | | + +## 4.113.6 Thermostat Setpoint Supported Report Command + +This command is used to advertise the supported setpoint types. [This command is known to cause interoperability issues. Refer to section 4.113.1.](04.113-thermostat-setpoint-command-class-version-1-2.md#41131-interoperability-considerations) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT SUPPORTED REPORT (0x05) _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +This field advertises the supported Setpoint Types at the sending node. + +A supporting node MUST support at least one setpoint type. Setpoint types and their minimum [required version are described in Table 143. A node MUST NOT support a setpoint type associated to a](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) newer version than the version it supports. + +[This field MUST be encoded according to Table 142, interpretation A:](04.114-thermostat-setpoint-command-class-version-3.md#41142-interoperability-considerations) + + Bit 0 in Bit Mask 1 represents Mode = 0x00 (Off).  Bit 1 in Bit Mask 1 represents Mode = 0x01 (Heat).  Bit 2 in Bit Mask 1 represents Mode = 0x02 (Cooling).  Bit 3 in Bit Mask 1 represents Mode = 0x07 (Furnace).  … + +If a Setpoint Type is supported, the corresponding bit MUST be set to ‘1’. + +If a Setpoint Type is not supported, the corresponding bit MUST be set to ‘0’. + +This length of this field MUST be set to the minimum amount of bytes which allows advertising all supported Setpoint Types. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.114-thermostat-setpoint-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.114-thermostat-setpoint-command-class-version-3.md new file mode 100644 index 0000000..1427c18 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.114-thermostat-setpoint-command-class-version-3.md @@ -0,0 +1,336 @@ + +# 4.114 Thermostat Setpoint Command Class, version 3 + +The Thermostat Setpoint Command Class is used to configure setpoints for the modes supported by a thermostat. + +## 4.114.1 Compatibility considerations + +The Thermostat Setpoint Command Class, version 3 is backwards compatible with the Thermostat Setpoint Command Class, version 1-2. + +This version introduces: + + Setpoint capability discovery (allowed value range).  New setpoint types. + +## 4.114.2 Interoperability Considerations + +It has been found that early implementations of this Command Class specification apply two non- interoperable interpretations of the bit mask advertising the support for specific Setpoint Types. + +As a consequence, one may find thermostat products and controller products in the marketplace which [implement either of the two bit mask interpretations found in Table 142. The notation x.y indicates Bit](04.114-thermostat-setpoint-command-class-version-3.md#41142-interoperability-considerations) Mask byte x, bit y. + +Implementations of Thermostat Setpoint Command Class, version 3 MUST comply with Interpretation A. Table 142, Thermostat Setpoint Types Bit Mask encoding + +| Support Bit Mask, Interpretation A | Support Bit Mask, Interpretation B | Setpoint Type Identifier | Description | Version | +| --- | --- | --- | --- | --- | +| 1.0 | 1.0 | 0x00 | N/A | - | +| 1.1 | 1.1 | 0x01 | Heating | 1 | +| 1.2 | 1.2 | 0x02 | Cooling | 1 | +| | 1.3 | 0x03 | N/A | - | +| | 1.4 | 0x04 | N/A | - | +| | 1.5 | 0x05 | N/A | - | +| | 1.6 | 0x06 | N/A | - | +| 1.3 | 1.7 | 0x07 | Furnace | 1 | +| 1.4 | 2.0 | 0x08 | Dry Air | 1 | +| 1.5 | 2.1 | 0x09 | Moist Air | 1 | +| 1.6 | 2.2 | 0x0A | Auto changeover | 1 | +| 1.7 | 2.3 | 0x0B | Energy Save Heating | 2 | +| 2.0 | 2.4 | 0x0C | Energy Save Cooling | 2 | +| 2.1 | 2.5 | 0x0D | Away Heating | 2 | +| 2.2 | 2.6 | 0x0E | Away Cooling | 3 | +| 2.3 | 2.7 | 0x0F | Full Power | 3 | + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +## 4.114.3 Thermostat Setpoint Set Command + +This command is used to specify the target value for the specified Setpoint Type at a supporting node. + +A supporting node MUST support the same format of Precision, Scale and Size fields values as it sends in the Thermostat Setpoint Supported Report Command or Thermostat Setpoint Capabilities Report Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT SET (0x01) _ _ | | | | | | | | + +| Reserved | | Setpoint Type | | +| --- | --- | --- | --- | +| Precision | Scale | | Size | +| Value 1 | | | | +| .. | | | | +| Value N | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to specify the setpoint to be set at the receiving node. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +Table 143, Thermostat Setpoint Set::Setpoint Types + +| Value | Description | CC Version | +| --- | --- | --- | +| 0x00 | N/A | 1 | +| 0x01 | Heating | 1 | +| 0x02 | Cooling | 1 | +| 0x03 | N/A - reserved | - | +| 0x04 | N/A- reserved | - | +| 0x05 | N/A- reserved | - | +| 0x06 | N/A- reserved | - | +| 0x07 | Furnace | 1 | +| 0x08 | Dry Air | 1 | +| 0x09 | Moist Air | 1 | +| 0x0A | Auto Changeover | 1 | +| 0x0B | Energy Save Heating | 2 | +| 0x0C | Energy Save Cooling | 2 | +| 0x0D | Away Heating | 2 | +| 0x0E | Away Cooling | 3 | +| 0x0F | Full Power | 3 | + +Values marked as not applicable (N/A) MUST be ignored by a receiving node. All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Precision (3 bits) This field is used to specify how many decimal places are included in the Value field. For example, the decimal value 1025 with precision 2 MUST be interpreted as 10.25. + +Scale (2 bits) + +This field is used to specify what temperature scale is used for the setpoint value. [The field MUST be encoded according to Table 144.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +Table 144, Thermostat Setpoint Set::Scale encoding + +| Value | Scale used in Value field | +| --- | --- | +| 0 | Celcius | +| 1 | Fahrenheit | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Size (3 bits) + +This field is used to indicate the length in bytes of the Value field. This field MUST be set to 1, 2 or 4. + +Value (N bytes) + +This field is used to advertise the actual setpoint value to be set at the receiving node. + +The length of this field MUST be according to the Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +## 4.114.4 Thermostat Setpoint Get Command + +This command is used to request the target value for a given setpoint type that is currently configured at a supporting node. + +The Thermostat Setpoint Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT GET (0x02) _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to specify which setpoint is requested. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +A supporting node receving a supported Setpoint Type value MUST be return the same value in the Thermostat Setpoint Report Command. + +A supporting node receiving a non-supported Setpoint Type value MUST return the value 0x00 (N/A) in the Thermostat Setpoint Report Command. + +## 4.114.5 Thermostat Setpoint Report Command + +This command is used to advertise the value of a setpoint type. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT REPORT (0x03) _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| .. | | | | | | | | +| Value N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to advertise the setpoint advertised by the sending node. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +If this field is set to 0x00 (N/A), it is RECOMMENDED to set the Size field to 1 and the Value field to 0. + +Precision (3 bits) + +This field is used to indicate how many decimal places are included in the Value field. For example, the Value field set to 1025 with the Precision field set to 2 MUST be interpreted as 10.25. + +Scale (2 bits) + +This field is used to specify what temperature scale is used for the setpoint value. [The field MUST be encoded according to Table 144.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +Size (3 bits) + +This field is used to indicate the length in bytes of the Value field. This field MUST be set to 1, 2 or 4. Value (N bytes) + +This field is used to advertise the actual setpoint value set at the sending node. + +The length of this field MUST be according to the Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +A receiving node MUST ignore values outside the range advertised in the Thermostat Setpoint Capabilities Report Command for the actual Setpoint type. + +## 4.114.6 Thermostat Setpoint Supported Get Command + +This command is used to query the supported setpoint types. + +The Thermostat Setpoint Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT SUPPORTED GET (0x04) _ _ _ | | | | | | | | + +## 4.114.7 Thermostat Setpoint Supported Report Command + +This command is used to advertise the supported setpoint types. [This command is known to cause interoperability issues. Refer to section 4.114.2.](04.114-thermostat-setpoint-command-class-version-3.md#41142-interoperability-considerations) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT SUPPORTED REPORT (0x05) _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +This field advertises the supported Setpoint Types at the sending node. + +A supporting node MUST support at least one setpoint type. Setpoint types and their minimum [required version are described in Table 143. A node MUST NOT support a setpoint type associated to a](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) newer version than the version it supports. + +[This field MUST be encoded according to Table 142, interpretation A:](04.114-thermostat-setpoint-command-class-version-3.md#41142-interoperability-considerations) + + Bit 0 in Bit Mask 1 represents Mode = 0x00 (Off).  Bit 1 in Bit Mask 1 represents Mode = 0x01 (Heat).  Bit 2 in Bit Mask 1 represents Mode = 0x02 (Cooling).  Bit 3 in Bit Mask 1 represents Mode = 0x07 (Furnace).  … + +If a Setpoint Type is supported, the corresponding bit MUST be set to ‘1’. + +If a Setpoint Type is not supported, the corresponding bit MUST be set to ‘0’. + +This length of this field MUST be set to the minimum amount of bytes which allows advertising all supported Setpoint Types. + +## 4.114.8 Thermostat Setpoint Capabilities Get Command + +This command is used request the supported setpoint value range for an actual Setpoint Type. + +The Thermostat Setpoint Capabilities Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT CAPABILITIES GET (0x09) _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field is used to specify which setpoint is requested. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +A supporting node receving a supported Setpoint Type value MUST be return the same value in the Thermostat Setpoint Capabilities Report Command. + +A supporting node receiving a non-supported Setpoint Type value MUST return the value 0x00 (N/A) in the Thermostat Setpoint Capabilities Report Command. + +## 4.114.9 Thermostat Setpoint Capabilities Report Command + +This command is used advertise the supported setpoint value range for an actual Setpoint Type. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS THERMOSTAT SETPOINT (0x43) _ _ _ | | | | | | | | +| Command = THERMOSTAT SETPOINT CAPABILITIES REPORT (0x09) _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Min Value Precision | | | Min Value Scale | | Min Value Size | | | +| Min Value 1 | | | | | | | | +| .. | | | | | | | | +| Min Value N | | | | | | | | +| Max Value Precision | | | Max Value Scale | | Max Value Size | | | +| Max Value 1 | | | | | | | | +| .. | | | | | | | | +| Max Value N | | | | | | | | + +Setpoint Type (4 bits) + +This field is used to advertise the setpoint advertised by the sending node. [The value MUST comply with Table 143.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +If this field is set to 0x00 (N/A), it is RECOMMENDED to set the Min Value Size and Max Value Size fields to 1 and the Min Value and Max Value fields to 0. + +Min Value Precision (3 bits) + +This field is used to indicate how many decimal places are included in the Min Value field. For example, the Min Value field set to 1025 with the Min Value Precision field set to 2 MUST be interpreted as 10.25. + +Min Value Scale (2 bits) + +This field is used to specify what temperature scale is used for the setpoint Min Value field. [The field MUST be encoded according to Table 144.](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) + +Min Value Size (3 bits) + +This field is used to indicate the length in bytes of the Min Value field. This field MUST be set to 1, 2 or 4. Min Value (N bytes) + +This field is used to advertise the minimum value that is supported for the actual setpoint at the sending node. + +The length of this field MUST be according to the Min Value Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +Max Value Precision (3 bits) + +This field is used to indicate how many decimal places are included in the Max Value field. For example, the Max Value field set to 1025 with the Max Value Precision field set to 2 MUST be interpreted as 10.25. + +Max Value Scale (2 bits) + +This field is used to specify what temperature scale is used for the setpoint Max Value field. [The field MUST be encoded according to Table 144 and this field MUST be set to the same value as the](04.114-thermostat-setpoint-command-class-version-3.md#41143-thermostat-setpoint-set-command) Min Value Scale field + +Max Value Size (3 bits) + +This field is used to indicate the length in bytes of the Max Value field. This field MUST be set to 1, 2 or 4. + +Max Value (N bytes) + +This field is used to advertise the maximum value that is supported for the actual setpoint at the sending node. + +The length of this field MUST be according to the Max Value Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +This field MUST be set to a value greater than the Min Value field. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.115-user-code-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.115-user-code-command-class-version-1.md new file mode 100644 index 0000000..0831015 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.115-user-code-command-class-version-1.md @@ -0,0 +1,140 @@ + +# 4.115 User Code Command Class, version 1 + +The User Code Command Class is used to manage User Codes in access control systems. + +## 4.115.1 Interoperability considerations + +A node supporting the Door Lock Command Class SHOULD reflect user code inputs in the door lock status when relevant. (e.g. when the door becomes unlocked by a User Code input, the Door Lock Mode is also updated to unlocked) + +This Command Class can be used in conjunction with Schedule Entry Lock Command Class in order to schedule access for users. A node receiving a User Code Get Command MUST advertise what User Code is set in the User Code Report Command. + +It has been found that some version 1 nodes wrongfully report obfuscated User Codes in the User Code Report (e.g. ‘******’). + +A controlling node SHOULD understand that a code has been set correctly but cannot be read back with such nodes. + +## 4.115.2 User Code Set Command + +This command is used to set a User Code at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE SET (0x01) _ _ | | | | | | | | +| User Identifier | | | | | | | | +| User ID Status | | | | | | | | +| User Code 1 | | | | | | | | +| ... | | | | | | | | +| User Code N | | | | | | | | + +User Identifier (8 bits) + +This field is used to specify the actual User Identifier. + +The implemented User Identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 User Identifiers MUST accept values in the range 1..10. + +A receiving node MAY ignore this field if it only supports one User Code. + +The value 0 MUST indicate that the receiving node MUST set the User Code and User Status for all CC:0063.01.01.12.001 supported User Identifiers. The value 0 SHOULD be used only with User ID Status set to 0x00. + +If a non-existing User Identifier (higher than the advertised supported users number in the Users Number Report Command) is specified in this command, a receiving node MUST ignore the command + +User ID Status (8 bits) + +[The User ID Status field indicates the status of the User Identifier. This field MUST comply with Table 145.](04.115-user-code-command-class-version-1.md#41152-user-code-set-command) + +The User ID Status 0xFE SHOULD NOT be used in this command. Table 145, User Code Set::User ID Status encoding + +| Value | Description | +| --- | --- | +| 0x00 | Available (not set) | +| 0x01 | Occupied | +| 0x02 | Reserved by administrator | +| 0xFE | Status not available | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +User Code (N bytes) + +This field is used to advertise the User Code to be set for the User Identifier. + +The length of this field MUST be between 4 and 10 bytes. The field’s length MUST be determined using the length of the frame. + +Each byte in this field MUST be a digit encoded with ASCII representation (from 0x30 to 0x39). + +A node receiving an invalid User Code MUST ignore the command. + +The User Code field MUST be set to 0x00000000 (4 bytes) when User ID Status is equal to 0x00. + +## 4.115.3 User Code Get Command + +This command is used to request the User Code of a specific User Identifier. + +The User Code Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE GET (0x02) _ _ | | | | | | | | +| User Identifier | | | | | | | | + +User Identifier (8 bits) + +This field is used to specify the requested User Identifier. + +The value 0 MUST NOT be specified in the User Code Get Command. + +If the specified User Identifier is not supported, a responding node SHOULD return a User Code Report Command with the User ID Status set to 0xFE “Status not available”. + +## 4.115.4 User Code Report Command + +This command is used to advertise a User Code and its current status. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE REPORT (0x03) _ _ | | | | | | | | +| User Identifier | | | | | | | | +| User ID Status | | | | | | | | +| User Code 1 | | | | | | | | +| ... | | | | | | | | +| User Code N | | | | | | | | + +[For fields’ description, refer to 4.115.2 User Code Set Command.](04.115-user-code-command-class-version-1.md#41152-user-code-set-command) + +## 4.115.5 Users Number Get Command + +This command is used to request the number of user codes supported by the receiving node. + +The Users Number Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USERS NUMBER GET (0x04) _ _ | | | | | | | | + +## 4.115.6 Users Number Report Command + +This command is used to report the number of User Codes supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USERS NUMBER REPORT (0x05) _ _ | | | | | | | | +| Supported Users | | | | | | | | + +Supported Users (8 bits) + +This field is used to advertise the number of supported User Codes. + +This field MUST be set to the total amount of supported User Codes. The value ‘0’ MUST indicate that no User Code is supported by the node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.01-terminology.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.01-terminology.md new file mode 100644 index 0000000..f024c96 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.01-terminology.md @@ -0,0 +1,18 @@ + +# 4.116.1 Terminology + +User Codes are configured on a supporting node for different User Identifiers. Each User Code is associated to one User Identifier. An actual end user with several User Codes will also have several User Identifiers (one for each User Code). + +The entry of a user code can trigger different outcomes, such as opening a door, triggering a notification or ignoring the code. This can be configured with the User ID status. + +A supporting node may support one or several Keypad Modes. They allow configuring the keypad to accept, ignore or treat differently keypad input. + +A node may support the Master Code functionality. The Master Code is a separate unique code used to get access to the node’s administrator functionalities, such as the network settings and/or User Code management. A node may require the Master Code to be always set and in this case advertise that the Master Code can be modified but cannot be deactivated using Z-Wave. + +A node may support the User Code Checksum functionality. A controlling node can request a checksum representing all the user code set at the supporting node to ensure that the user code databases are synchronized. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.02-compatibility-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.02-compatibility-considerations.md new file mode 100644 index 0000000..9e21c17 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.02-compatibility-considerations.md @@ -0,0 +1,32 @@ + +# 4.116.2 Compatibility considerations + +The User Code Command Class, version 2 is backwards compatible with the User Code Command Class, version 1. + +All commands and fields not mentioned in this version MUST remain unchanged from the User Code Command Class, version 1. + +The Extended User Code Set Command permits to configure several user codes per command. The following command has been extended to match the extended number of supported users: + + Users Number Report Command + +The following commands are also introduced to address the extended range of users: + + Extended User Code Set Command  Extended User Code Get Command  Extended User Code Report Command + +Commands for advertising node capabilities, configuring the keypad mode and the Master Code are introduced: + + User Code Capabilities Get Command  User Code Capabilities Report Command  User Code Keypad Mode Get Command  User Code Keypad Mode Report Command  Master Code Set Command  Master Code Get Command  Master Code Report Command + +User Code Command Class, version 2 does not extend the existing User Code Set/Get/Report commands from version 1. The first 255 users that can be addressed by the User Code Set/Get Commands MUST be identical to the first 255 users that can be addressed by the (version 2) Extended User Code Set/Get Commands. + +Addressing User Codes for extended User Identifiers (in the range 256..65535) MUST be done with the (version 2) Extended User Code Set/Get Commands. + +A version 1 node MAY advertise support for 0 User Codes in the Users Number Report Command. A version 2 node MUST advertise support for at least 1 User Code. + +The implemented User Identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 Users MUST accept User Identifier values in the range 1..10. However, a controlling node MAY assign user codes non-continuously in the range of supported User Identifier. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.03-interoperability-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.03-interoperability-considerations.md new file mode 100644 index 0000000..d5a778e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.03-interoperability-considerations.md @@ -0,0 +1,22 @@ + +# 4.116.3 Interoperability considerations + +This Command Class can be used in conjunction with the Entry Control Command Class to report User Code input to a controlling application. + +A node supporting the “Messaging” User ID Status MUST support the Entry Control Command Class, version 1 or newer or the Notification Command Class, version 8 or newer. + +A node supporting this Command Class MUST support the Door Lock Command Class and SHOULD support the Timed Operation Type. + +A supporting node MUST reflect user code inputs in the door lock status when relevant. (e.g. when the door becomes unsecured by a User Code input, the Door Lock Operation mode is updated to unsecure with a timeout) + +A node supporting this Command Class MAY have an Association group issuing the corresponding Door Lock Operation Set Commands when valid User Codes are input in order to control several door locks simultaneously. + +This Command Class can be used in conjunction with Schedule Entry Lock Command Class to schedule access for users. + +A node receiving a User Code Get Command MUST advertise what User Code is set in the User Code Report Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.04-security-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.04-security-considerations.md new file mode 100644 index 0000000..2c9d359 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.04-security-considerations.md @@ -0,0 +1,18 @@ + +# 4.116.4 Security considerations + +A node identifies users on the background of User Code entry alone without User Identifier, the following security measures should be taken into consideration: + + Users SHOULD NOT be allowed to choose their own user codes. Users tend to choose codes such as birthdates and therefore the risk of having duplicate codes is high. A user may learn about another User Code when trying to set his own User Code and receiving a duplicate/rejection message. In such a case, User Codes SHOULD be generated randomly by the administrating company, if applicable. + + If a node is configured with a large number of User Codes: (e.g. 500), it is RECOMMENDED to increase the number of digits in each and every user code, making is less likely to randomly guess an assigned user code. + + It is RECOMMENDED to implement mechanisms preventing brute force attacks, such as exponential increasing waiting time between attempts or lock out after a number of failed attempts. + +If a node allows updating User Codes or User ID Statuses locally via a user interface using a Master Code, the supporting node MUST issue User Code Report Commands via the Lifeline to advertise local updates. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.05-user-code-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.05-user-code-set-command.md new file mode 100644 index 0000000..4cb1d33 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.05-user-code-set-command.md @@ -0,0 +1,40 @@ + +# 4.116.5 User Code Set Command + +This command is used to set a User Code at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE SET (0x01) _ _ | | | | | | | | +| User Identifier | | | | | | | | +| User ID Status | | | | | | | | +| User Code 1 | | | | | | | | +| ... | | | | | | | | +| User Code N | | | | | | | | + +All fields not described below MUST remain unchanged from version 1. + +User ID Status (8 bits) + +The User ID Status field indicates the state of the User Identifier. + +[This field MUST comply with Table 147, however the requirements in Table 146 MUST take precedence](04.116.12-extended-user-code-set-command.md#411612-extended-user-code-set-command) CC:0063.02.01.11.005 [over the requirements in Table 147.](04.116.12-extended-user-code-set-command.md#411612-extended-user-code-set-command) + +If a non-supported User ID Status is specified, a receiving node MUST ignore the command. + +User Identifier (8 bits) + +This field is used to specify the actual User Identifier. + +The implemented User Identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 User Codes MUST accept values in the range 1..10. + +The value 0 MUST indicate that the receiving node MUST set the User Code and User Status for all supported user identifiers less than 256. A receiving node supporting the User Code Command Class, version 2 MUST NOT apply the status to users from the extended range (User ID > 255) when this field is set to 0. The value 0 SHOULD be used only with User ID Status set to 0x00. + +If a non-existing User Identifier (higher than the advertised supported users number in the Users Number Report Command) is specified in this command, a receiving node MUST ignore the command diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.06-users-number-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.06-users-number-report-command.md new file mode 100644 index 0000000..50ce762 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.06-users-number-report-command.md @@ -0,0 +1,32 @@ + +# 4.116.6 Users Number Report Command + +This command is used to report the number of users that the sending node supports. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USERS NUMBER REPORT (0x05) _ _ | | | | | | | | +| Supported Users | | | | | | | | +| Extended Supported Users 1 (MSB) | | | | | | | | +| Extended Supported Users 2 (LSB) | | | | | | | | + +Supported Users (8 bits) + +This field is used to advertise the number of supported users for version 1 controlling nodes. + +This field MUST be in the range 1..255. + +If the node implements more than 255 users, this field MUST be set to 255. If the node implements 255 users or less, this field MUST be set to the total amount of supported users. + +Extended Supported Users (16 bits) + +This field is used to advertise the number of supported users for version 2 controlling nodes. + +If the node supports less than 256 users, this field MUST be identical to the Supported Users field. If the node implements 256 users or more, this field MUST be set to the total amount of supported users. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.07-user-code-capabilities-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.07-user-code-capabilities-get-command.md new file mode 100644 index 0000000..a39d544 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.07-user-code-capabilities-get-command.md @@ -0,0 +1,21 @@ + +# 4.116.7 User Code Capabilities Get Command + +This command is used to request the User Code capabilities of a node. + +The User Code Capabilities Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE CAPABILITIES GET (0x06) _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.08-user-code-capabilities-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.08-user-code-capabilities-report-command.md new file mode 100644 index 0000000..cb9bf62 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.08-user-code-capabilities-report-command.md @@ -0,0 +1,121 @@ + +# 4.116.8 User Code Capabilities Report Command + +This command is used to advertise User Code capabilities. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE CAPABILITIES REPORT (0x07) _ _ _ | | | | | | | | +| MC Support | MCD support | Res | Supported User ID Status Bit Mask Length | | | | | +| Supported User ID Status Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Supported User ID Status Bit Mask N | | | | | | | | +| UCC Support | MUCR Support | MUCS Support | Supported Keypad Modes Bit Mask Length | | | | | +| Supported Keypad Modes Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Supported Keypad Modes Bit Mask M | | | | | | | | +| Reserved | | | Supported Keys Bit Mask Length | | | | | +| Supported Keys Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Supported Keys Bit Mask L | | | | | | | | + +Reserved / Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +MC (Master Code) Support (1 bit) + +This field indicates if the sending node supports the Master Code functionality. + +The value 1 MUST indicate that the Master Code functionality is supported. The value 0 MUST indicate that the Master Code functionality is not supported. + +MCD (Master Code Deactivation) Support (1 bit) + +This field indicates if the sending node supports reporting the Master Code can be deactivated using a Master Code Set Command. + +The value 1 MUST indicate that the Master Code may be deactivated by issuing a Master Code Set with the length field set to 0. The value 0 MUST indicate that the Master Code cannot be deactivated and Master Code Set commands with the length field set to 0 will be ignored. + +This field MUST be set to 0 by a sending node if the MC Support field is set to 0. UCC (User Code Checksum) Support (1 bit) + +This field indicates if the sending node supports the User Code Checksum functionality. + +The value 1 MUST indicate that the User Code Checksum functionality is supported. The value 0 MUST indicate that the User Code Checksum functionality is not supported. + +MUCR (Multiple User Code Report) Support (1 bit) + +This field indicates if the sending node supports reporting the Multiple User Codes at once in a single Extended User Code Report Command. This functionality should be supported by node supporting large amount of User Codes. + +The value 1 MUST indicate that the Multiple User Code Report functionality is supported. The value 0 MUST indicate that the Multiple User Code Report functionality is not supported. + +MUCS (Multiple User Code Set) Support (1 bit) + +This field indicates if the sending node supports being set Multiple User Codes at once in a single Extended User Code Set Command. This functionality should be supported by node supporting large amount of User Codes. + +The value 1 MUST indicate that the Multiple User Code Set functionality is supported. The value 0 MUST indicate that the Multiple User Code Set functionality is not supported. + +Supported User ID Status Bit Mask Length (5 bits) + +This field MUST advertise the length in bytes of the Supported User ID Status Bit Mask field carried in the command. + +This field MUST be set to the minimum value which allows advertising all supported User ID Statuses. + +Supported User ID Status Bit Mask (N bytes) + +This field advertises the supported User ID status values. The length of this field in bytes MUST match the value advertised in the Supported User ID Status Bit Mask Length field. + +A node MUST support the User ID Status values 0x00, 0x01 and 0x02. + + Bit 0 in Bit Mask 1 represents User ID status 0x00.  Bit 1 in Bit Mask 1 represents User ID status 0x01.  … + +[User ID Status values are described in Table 147.](04.116.12-extended-user-code-set-command.md#411612-extended-user-code-set-command) + +If a User ID Status is supported, the corresponding bit MUST be set to ‘1’. If a User ID Status is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Supported Keypad Modes Bit Mask Length (5 bits) + +This field MUST advertise the length in bytes of the Supported Keypad Modes Bit Mask field carried in the command. + +This field MUST be set to the minimum value which allows advertising all supported keypad modes. Supported Keypad Mode Bit Mask (M bytes) + +This field describes the supported keypad mode values. The length of this field in bytes MUST match the value advertised in the Supported Keypad Modes Bit Mask Length field. + +A node MUST support the keypad mode 0x00 (normal mode). + + Bit 0 in Bit Mask 1 represents keypad mode 0x00 (normal mode).  Bit 1 in Bit Mask 1 represents keypad mode 0x01 (vacation mode).  … + +[Keypad mode values are described in Table 146.](04.116.09-user-code-keypad-mode-set-command.md#41169-user-code-keypad-mode-set-command) + +If a keypad mode is supported, the corresponding bit MUST be set to ‘1’. If a keypad mode is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Supported Keys Bit Mask Length (5 bits) + +This field MUST advertise the length in bytes of the Supported Keys Bit Mask field carried in the command. + +This field MUST be set to the minimum value which allows advertising all supported ASCII codes. + +Supported Keys Bit Mask (L bytes) + +This field describes the supported keys that can be input on the keypad by end users. The length of this field in bytes MUST match the value advertised in the Supported Keys Bit Mask Length field. + +This field MUST advertise the ASCII codes that represent the supported keys. + + Bit 0 in Bit Mask 1 represents ASCII code 0-  Bit 1 in Bit Mask 1 represents ASCII code 1.  …  Bit 7 in Bit Mask 16 represents ASCII code 127 + +If an ASCII code is supported, the corresponding bit MUST be set to ‘1’. If an ASCII code is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +A supporting node MUST NOT advertise an ASCII code representing the “enter” button on the keypad, but only ASCII codes that can be part of the user codes. + +A supporting node SHOULD support the ASCII codes 0x30..0x39 (decimal digits 0..9). diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.09-user-code-keypad-mode-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.09-user-code-keypad-mode-set-command.md new file mode 100644 index 0000000..8ebf01e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.09-user-code-keypad-mode-set-command.md @@ -0,0 +1,35 @@ + +# 4.116.9 User Code Keypad Mode Set Command + +This command is used to set the keypad mode at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE KEYPAD MODE SET (0x08) _ _ _ _ | | | | | | | | +| Keypad Mode | | | | | | | | + +Keypad Mode (8 bits) + +This field is used to set the keypad mode at the receiving node. + +[This field MUST be encoded according to Table 146.](04.116.09-user-code-keypad-mode-set-command.md#41169-user-code-keypad-mode-set-command) + +A supporting node being set a keypad mode MUST respect the requirements associated to this mode in [Table 146. The requirements in Table 146 (keypad mode) MUST take precedence over the requirements](04.116.09-user-code-keypad-mode-set-command.md#41169-user-code-keypad-mode-set-command) [in Table 147 (user code statuses).](04.116.12-extended-user-code-set-command.md#411612-extended-user-code-set-command) + +This command MUST be ignored by a receiving node if the specified keypad mode is not supported. Table 146, User Code Keypad Mode Set::Keypad mode encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Normal mode. This mode MUST be the default mode. When the Normal mode is active, the supporting node:  MUST work normally with all defined User Codes according to Table 147.  MUST accept the Master Code, if supported. | 1 | +| 0x01 | Vacation mode. This mode is used to disable/switch off the User Code functionalities for normal users. When the Vacation mode is active, the supporting node:  MUST ignore all input of assigned User Code (i.e. with Status ID different than 0x00 Available)  MUST react according to Table 147 when being input unknown codes (i.e. with Status ID 0x00 Available).  MUST accept the Master Code, if supported | 2 | +| 0x02 | Privacy mode. This mode is used to completely disable/switch off the User Code functionalities. When the Privacy mode is active, the supporting node:  MUST ignore any keypad input  MUST ignore the Master Code, if supported. This mode can be used e.g. to disallow User Code keypad use completely or to rely only on Entry Control Notifications, if supported. | 2 | +| 0x03 | Locked Out mode. This mode is used as a security measure to prevent brute force attacks. This mode is normally activated by the supporting node itself. If the node activates the Locked Out mode, it MUST issue a User Code Keypad Mode Report Command to the Lifeline destination. When the Locked Out mode is active, the supporting node:  MUST ignore any keypad input  MUST ignore the Master Code, if supported. A supporting node MUST return to the last active mode automatically after a defined timeout if it activated this mode. A controlling node may unlock the keypad again by issuing this command with a different mode. | 2 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.10-user-code-keypad-mode-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.10-user-code-keypad-mode-get-command.md new file mode 100644 index 0000000..af3b4a7 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.10-user-code-keypad-mode-get-command.md @@ -0,0 +1,19 @@ + +# 4.116.10 User Code Keypad Mode Get Command + +This command is used to request a node about its current keypad mode. + +The User Code Keypad Mode Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE KEYPAD MODE GET (0x09) _ _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.11-user-code-keypad-mode-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.11-user-code-keypad-mode-report-command.md new file mode 100644 index 0000000..4b159e5 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.11-user-code-keypad-mode-report-command.md @@ -0,0 +1,22 @@ + +# 4.116.11 User Code Keypad Mode Report Command + +This command is used by a node to advertise its current keypad mode. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE KEYPAD MODE REPORT (0x0A) _ _ _ _ | | | | | | | | +| Keypad Mode | | | | | | | | + +Keypad Mode (8 bits) + +This field is used to advertise the keypad mode currently active at the sending node. + +[This field MUST be encoded according to Table 146.](04.116.09-user-code-keypad-mode-set-command.md#41169-user-code-keypad-mode-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.12-extended-user-code-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.12-extended-user-code-set-command.md new file mode 100644 index 0000000..fc91eae --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.12-extended-user-code-set-command.md @@ -0,0 +1,99 @@ + +# 4.116.12 Extended User Code Set Command + +This command is used to set one or more User Codes in the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = EXTENDED USER CODE SET (0x0B) _ _ _ | | | | | | | | +| Number of User Codes | | | | | | | | +| User Identifier 1 (MSB) 1 | | | | | | | | +| User Identifier 2 (LSB) 1 | | | | | | | | +| User ID Status 1 | | | | | | | | +| Reserved | | | | User Code Length 1 | | | | +| User Code 1, 1 | | | | | | | | +| … | | | | | | | | +| User Code N, 1 | | | | | | | | +| … | | | | | | | | +| User Identifier 1 (MSB) M | | | | | | | | +| User Identifier 2 (LSB) M | | | | | | | | +| User ID Status M | | | | | | | | +| Reserved | | | | User Code Length M | | | | +| User Code 1, M | | | | | | | | +| … | | | | | | | | +| User Code N, M | | | | | | | | + +Number of User Codes (8 bits) + +This field is used to specify how many user codes blocks are contained in the actual command. + +This field MUST be in the range 1..255. A node MUST respect the Z-Wave MAC frame size or Transport service limits when sending this command, which means in most cases that this field SHOULD NOT be set to a value higher than 10. + +This field MUST be ignored and considered as set to 1 by a receiving node if it advertises no support for Multiple User Code Set (MUCS) in the User Code Capabilities Report Command + +The number of User Code blocks contained in the command MUST be according to this field. A User Code block MUST comprise the following fields: + + User Identifier  User ID Status  User Code Length  User Code + +User Identifier (16 bits) + +This field is used to specify the User Identifier for the actual User Code block. + +The first byte MUST carry the most significant byte of the 16-bit value. + +The value 0 MUST indicate that the receiving node MUST set the User Code and User Status for all supported User Identifiers. The value 0 SHOULD be used only with User ID Status set to 0x00 (erasing all User Codes). + +If a non-existing User Identifier (higher than the advertised supported users number in the Users Number Report Command) is specified in this command, a receiving node MUST ignore the actual User Code block + +User ID Status (8 bits) + +The User ID Status field indicates the state of the User Identifier for the actual User Code block. This [field MUST comply with Table 147, however the requirements in Table 146 MUST take precedence over the requirements in Table 147.](04.116.12-extended-user-code-set-command.md#411612-extended-user-code-set-command) + +If a non-supported User ID Status is specified, a receiving node MUST ignore the actual User Code block. + +Table 147, Extended User Code Set::User ID Status encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Available: The database entry represented by this User Identifier is not in use. This status MUST be used to delete codes or indicate that an identifier is not assigned. When a user enters an unassigned/unknown code, the node:  MUST indicate that the code is not accepted  MUST NOT grant access to this user  SHOULD take preventive actions for further attempts to enter User ID and/or User Code (refer to 4.116.4). | 1 | + +| Value | Description | Version | +| --- | --- | --- | +| 0x01 | Enabled / Grant Access The database entry represented by this User Identifier is in use and enabled. When a user enters a code with this status, the node:  MUST indicate that the code is accepted  MUST grant access to the user.  MUST secure the Door Lock again after a timeout (either configured if set in Timed Operation or pre-defined if the Door Lock is set in Constant Operation) | 1 | + +| Value | Description | Version | +| --- | --- | --- | +| 0x02 | Disabled The database entry represented by this User Identifier is in use but disabled. E.g. It allows a controller to push User Codes to a supporting node and let these codes be subsequently activated by a local interface. When a user enters a code with this status, the node:  MUST indicate that the code is not accepted  MUST NOT grant access to the user. | 1 | +| 0x03 | Messaging: The database entry represented by this User Identifier is in use. The value is used to relay notifications to a controlling application. E.g. A user may enter a messaging code for notifying that maintenance started or an application should activate the alarm system. When a user enters a code with this status, the node:  SHOULD indicate that the code is accepted  MUST NOT grant access to this user  MUST NOT take preventive actions for further attempts to enter User ID and/or User Code (refer to 4.116.4).  MUST send an Entry Control Notification or a Notification Report via the Lifeline Group to identify the messaging user code. | 2 | +| 0x04 | Passage Mode: The database entry represented by this User Identifier is in use. The value is used to let the Door Lock permanently grant access. Passage Mode can be activated and deactivated using the Door Lock Operation Set (Unsecured without timeout / Secured) or via a Passage Mode User Code input. E.g. A receptionist comes in the morning and enters a Passage Mode User Code to allow anybody to subsequently enter the premises without entering a code until Passage Mode is deactivated again. When a user enters a code with this status, the node:  MUST indicate that the code is accepted  MUST toggle the Door Lock operation state between secured and unsecured without timeout (and also disable any auto-relock functionality).  MUST send a Door Lock Operation Report and Door Lock Configuration Report via the Lifeline Association Group to advertise the new Door Lock state. | 2 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. User Code Length (4 bits) + +This field is used to advertise the length in bytes of the corresponding User Code field in the actual User Code block. + +The User Code Length MUST be in the range 4..10 if the User ID Status is different than 0x00. + +The User Code Length MUST be set to 0 if the User ID Status is set to 0x00. + +User Code (N bytes) + +This field is used to advertise the User Code to be set for the User ID for the actual User Code block. + +The length of this field in bytes MUST be according to the corresponding User Code Length field value. If the User Code Length is set to 0, this field MUST be omitted. + +Each byte in this field MUST be encoded with ASCII representation. + +A supporting node receiving a non-supported ASCII character MUST ignore the actual User Code block. + +A supporting node receiving a User Code identical to one already set to another User ID or identical to the Master Code MUST ignore the actual User Code block. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.13-extended-user-code-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.13-extended-user-code-get-command.md new file mode 100644 index 0000000..510ab21 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.13-extended-user-code-get-command.md @@ -0,0 +1,46 @@ + +# 4.116.13 Extended User Code Get Command + +This command is used to request the User Code of a specific User Identifier. + +The Extended User Code Report Command MUST be returned in response to this command + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = EXTENDED USER CODE GET (0x0C) _ _ _ | | | | | | | | +| User Identifier 1 (MSB) | | | | | | | | +| User Identifier 2 (LSB) | | | | | | | | +| Reserved | | | | | | | Report more | + +User Identifier (16 bits) + +This field is used to specify the requested User Identifier. + +The first byte MUST carry the most significant byte of the 16 bit value. + +This field MUST NOT be set to 0. + +A supporting node MUST return this value in the first User Code block of the returned Extended User Code Report Command. + +If a non-existing User Identifier (higher than the advertised supported users number in the Users Number Report Command) is specified in this command, a responding node MUST return an Extended User Code Report Command with the User ID Status set to 0xFE: “Status not available”. Report more (1 bit) + +This field is used to instruct the receiving node to report as many User Codes as possible within a single Z-Wave command (that fits in a single Z-Wave frame) because the sending node intends to read the whole (or a large part of the) User Code database. + +This field MUST be ignored by a receiving node if it advertises no support for Multiple User Code Report (MUCR) in the User Code Capabilities Report Command. + +The value 0 MUST indicate to return a report for the requested User Identifier only. + +The value 1 MUST indicate to return a report for the requested User Identifier and additionally report as many User Identifiers as possible in the response. + +When this field is set to 1, a node advertising support for Multiple User Code Report (MUCR) in the User Code Capabilities Report Command: + + MUST return at least 2 User Code blocks in the Extended User Code Report Command unless the last used User Identifier or a non-supported User Identifier is requested.  SHOULD return as many User Code blocks as possible.  Subsequent User Code blocks MUST contain consecutive User Identifier having a User ID Status different than 0. For example, a node supporting 4 User IDs that are set as follow MUST report User Identifier 1, 3, and 4 when requested about User Identifier 1:  User ID 1, status 0  User ID 2, status 0  User ID 3, status 1, code 38473  User ID 4, status 4, code 9277 diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.14-extended-user-code-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.14-extended-user-code-report-command.md new file mode 100644 index 0000000..8da3bd8 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.14-extended-user-code-report-command.md @@ -0,0 +1,88 @@ + +# 4.116.14 Extended User Code Report Command + +This command is used to advertise the User Code of a specific User Identifier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = EXTENDED USER CODE REPORT (0x0D) _ _ _ | | | | | | | | +| Number of User Codes | | | | | | | | +| User Identifier 1 (MSB) 1 | | | | | | | | +| User Identifier 2 (LSB) 1 | | | | | | | | +| User ID Status 1 | | | | | | | | +| Reserved | | | | User Code Length 1 | | | | +| User Code 1, 1 | | | | | | | | +| … | | | | | | | | +| User Code N, 1 | | | | | | | | +| … | | | | | | | | +| User Identifier 1 (MSB) M | | | | | | | | +| User Identifier 2 (LSB) M | | | | | | | | +| User ID Status M | | | | | | | | +| Reserved | | | | User Code Length M | | | | +| User Code 1, M | | | | | | | | +| … | | | | | | | | +| User Code N, M | | | | | | | | +| Next User Identifier 1 (MSB) | | | | | | | | +| Next User Identifier 2 (LSB) | | | | | | | | + +Number of User Codes (8 bits) + +This field is used to specify how many user codes blocks are contained in the actual command. + +This field MUST be in the range 1..255. A node MUST respect the Z-Wave MAC frame size or Transport service limits when sending this command, which means in most cases that this field SHOULD NOT be set to a value higher than 8. + +The number of User Code blocks contained in the command MUST be according to this field. A User Code block MUST comprise the following fields: + + User Identifier  User ID Status  User Code Length  User Code + +This field MUST be set to 1 by a node advertising no support for Multiple User Code Report (MUCR) in the User Code Capabilities Report Command. + +User Identifier (16 bits) + +This field is used to specify the actual User Identifier for the actual User Code block. The first byte MUST carry the most significant byte of the 16-bit value. + +User ID Status (8 bits) + +This field indicates the state of the User Identifier for the actual User Code block. This field MUST [comply with Table 148](04.116.14-extended-user-code-report-command.md#411614-extended-user-code-report-command) + +Table 148, Extended User Code Report::User ID Status encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Available. Refer to Table 147 | 1 | +| 0x01 | Enabled / Grant Access. Refer to Table 147 | 1 | +| 0x02 | Disabled. Refer to Table 147 | 1 | +| 0x03 | Messaging. Refer to Table 147 | 2 | +| 0x04 | Passage Mode. Refer to Table 147 | 2 | +| 0xFE | Status not available. The requested User Identifier is not valid (either 0 or higher than the supported users number in the Users Number Report Command) | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +User Code Length (4 bits) + +This field is used to advertise the length in bytes of the User Code field in the actual User Code block. + +The User Code Length MUST be in the range 4..10 if the User ID Status is different than 0x00 and 0xFE. The User Code Length MUST be set to 0 if the User ID Status is 0x00 or 0xFE. User Code (N bytes) + +This field is used to advertise the User Code currently set for the User ID in the actual User Code block. + +The length of this field in bytes MUST be according to the corresponding User Code Length field value. If the User Code Length is set to 0, this field MUST be omitted. + +Each byte in this field MUST be encoded with ASCII representation. + +Next User Identifier (16 bits) + +This field is used to specify the next User Identifier in use in the User Code database after the User Identifier advertised in the last User Code block. + +This field MUST be set to the next User Identifier having a User ID Status different than 0. The first byte MUST carry the most significant byte of the 16-bit value. + +The value 0 MUST indicate that the actual User Identifier is the last set at the sending node. + +If the status field is set to 0xFE for the last User Code block (User Identifier higher than the advertised supported users number in the Users Number Report Command), this field MUST be set to 0. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.15-master-code-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.15-master-code-set-command.md new file mode 100644 index 0000000..9b4ab55 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.15-master-code-set-command.md @@ -0,0 +1,53 @@ + +# 4.116.15 Master Code Set Command + +This command is used to set the Master Code in the receiving node. + +This command MUST be ignored by a receiving node advertising no support for the Master Code functionality (MD Support) in the User Code Capabilities Report Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = MASTER CODE SET (0x0E) _ _ | | | | | | | | +| Reserved | | | | Master Code Length | | | | +| Master Code 1 | | | | | | | | +| … | | | | | | | | +| Master Code N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Master Code Length (4 bits) + +This field is used to advertise the length in bytes of the Master Code field in the command. + +This field MUST be set to 0 or in the range 4..10. + +Values in the range 4..10 MUST indicate that the receiving node MUST set the Master Code as indicated in the Master Code field. The Value 0 MUST indicate that the receiving node MUST deactivate the Master Code. + +If this field is set to 0, this command MUST be ignored by a receiving node if it advertises no support for Master Code Deactivation (MCD) in the User Code Capabilities Report Command. + +Master Code (N bytes) + +This field is used to advertise the Master Code to be set for the node. + +The length of this field MUST be according to the Master Code Length field value. + +Each byte in this field MUST be encoded with ASCII representation. + +A supporting node receiving a non-supported ASCII character MUST ignore the command. + +A supporting node receiving a Master Code identical to one already set to another User ID MAY ignore the command. + +When the Master Code is input, the node: + +• MUST indicate that the code is accepted • MUST grant access to administrator functionalities, such as the network settings and/or User Code management interface. + +[Requirements in Table 146 (keypad modes) MUST take precedence over the above Master Code](04.116.09-user-code-keypad-mode-set-command.md#41169-user-code-keypad-mode-set-command) requirements diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.16-master-code-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.16-master-code-get-command.md new file mode 100644 index 0000000..82a4caa --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.16-master-code-get-command.md @@ -0,0 +1,19 @@ + +# 4.116.16 Master Code Get Command + +This command is used to request the Master Code currently set at the receiving node. + +The Master Code Report Command MUST be returned in response to this command + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = MASTER CODE GET (0x0F) _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.17-master-code-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.17-master-code-report-command.md new file mode 100644 index 0000000..ad42093 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.17-master-code-report-command.md @@ -0,0 +1,39 @@ + +# 4.116.17 Master Code Report Command + +This command is used to advertise the Master Code currently set at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = MASTER CODE REPORT (0x10) _ _ | | | | | | | | +| Reserved | | | | Master Code Length | | | | +| Master Code 1 | | | | | | | | +| … | | | | | | | | +| Master Code N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Master Code Length (4 bits) + +This field is used to advertise the length in bytes of the Master Code field in the command. + +This field MUST be in the range 4..10 if the Master Code is set and advertised in this command. + +This field MUST be set to 0 if the Master Code is deactivated or if the sending node advertises no support for the Master Code functionality (MC Support) in the User Code Capabilities Report Command. + +Master Code (N bytes) + +This field is used to advertise the Master Code currently set at the sending node. + +The length of this field MUST be according to the Master Code Length field value. If the Master Code Length is set to 0, this field MUST be omitted. + +Each byte in this field MUST be encoded with ASCII representation. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.18-user-code-checksum-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.18-user-code-checksum-get-command.md new file mode 100644 index 0000000..25f91e0 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.18-user-code-checksum-get-command.md @@ -0,0 +1,23 @@ + +# 4.116.18 User Code Checksum Get Command + +This command is used to request a User Code checksum representing all the User Codes currently set at the receiving node. + +This command MUST be ignored by a node advertising no support for the User Code Checksum functionality (UCC Support) in the User Code Capabilities Report Command. + +The User Code Checksum Report Command MUST be returned in response to this command if the User Code Checksum functionality (UCC Support) is advertised as supported in the User Code Capabilities Report Command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE CHECKSUM GET (0x11) _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.19-user-code-checksum-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.19-user-code-checksum-report-command.md new file mode 100644 index 0000000..0d31322 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/04.116.19-user-code-checksum-report-command.md @@ -0,0 +1,43 @@ + +# 4.116.19 User Code Checksum Report Command + +This command is used to advertise the current User Code checksum representing all the User codes set at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS USER CODE (0x63) _ _ _ | | | | | | | | +| Command = USER CODE CHECKSUM REPORT (0x12) _ _ _ | | | | | | | | +| User Code Checksum 1 (MSB) | | | | | | | | +| User Code Checksum 2 (LSB) | | | | | | | | + +User Code Checksum (16 bits) + +This field is used to advertise the checksum representing all User Codes set at the sending node. + +The checksum MUST be calculated using the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +This field MUST be set to 0x0000 if no User Code is set at node. + +The checksum data MUST be built by concatenating defined User Codes data (with User ID Status different than 0) in the ascending User ID order. The Master Code MUST NOT be part of the checksum calculation. + +Each defined User Code data MUST be formatted as follows: + +User ID (16 bits) | User ID Status (8 bits) | User Code (4..10 bytes) + +For example, a node supporting 4 User IDs that are set as follow: + + User ID 1, status 4, code 9277  User ID 2, status 0  User ID 3, status 1, code 88473  User ID 4, status 0 + +In this case, User Code data for User ID 1 and 3 MUST be concatenated to obtain the checksum data: + +0x0001 | 0x04 | 0x39 32 37 37 | 0x0003 | 0x01 | 0x38 38 34 37 33 + +The checksum data MUST be: 0x000104393237370003013838343733. + +The returned User Code Checksum field MUST be set to: 0xEAAD. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/index.md new file mode 100644 index 0000000..47f7d01 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.116-user-code-command-class-version-2/index.md @@ -0,0 +1,34 @@ + +# 4.116 User Code Command Class, version 2 + +The User Code Command Class is used to manage user codes in access control systems. + +User Code Command Class, version 2 extends the number of supported users to 65535, introduces new User ID Statuses, keypad modes and a Master Code functionality. + +## Contents + +- [4.116.1 Terminology](04.116.01-terminology.md) +- [4.116.2 Compatibility considerations](04.116.02-compatibility-considerations.md) +- [4.116.3 Interoperability considerations](04.116.03-interoperability-considerations.md) +- [4.116.4 Security considerations](04.116.04-security-considerations.md) +- [4.116.5 User Code Set Command](04.116.05-user-code-set-command.md) +- [4.116.6 Users Number Report Command](04.116.06-users-number-report-command.md) +- [4.116.7 User Code Capabilities Get Command](04.116.07-user-code-capabilities-get-command.md) +- [4.116.8 User Code Capabilities Report Command](04.116.08-user-code-capabilities-report-command.md) +- [4.116.9 User Code Keypad Mode Set Command](04.116.09-user-code-keypad-mode-set-command.md) +- [4.116.10 User Code Keypad Mode Get Command](04.116.10-user-code-keypad-mode-get-command.md) +- [4.116.11 User Code Keypad Mode Report Command](04.116.11-user-code-keypad-mode-report-command.md) +- [4.116.12 Extended User Code Set Command](04.116.12-extended-user-code-set-command.md) +- [4.116.13 Extended User Code Get Command](04.116.13-extended-user-code-get-command.md) +- [4.116.14 Extended User Code Report Command](04.116.14-extended-user-code-report-command.md) +- [4.116.15 Master Code Set Command](04.116.15-master-code-set-command.md) +- [4.116.16 Master Code Get Command](04.116.16-master-code-get-command.md) +- [4.116.17 Master Code Report Command](04.116.17-master-code-report-command.md) +- [4.116.18 User Code Checksum Get Command](04.116.18-user-code-checksum-get-command.md) +- [4.116.19 User Code Checksum Report Command](04.116.19-user-code-checksum-report-command.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.117-window-covering-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.117-window-covering-command-class-version-1.md new file mode 100644 index 0000000..f43572f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.117-window-covering-command-class-version-1.md @@ -0,0 +1,365 @@ + +# 4.117 Window Covering Command Class, version 1 + +The Window Covering Command Class is used to control window covering devices. [The Window Covering Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 4.117.1 Terminology + +A window covering device may be closed or open. The term closed represents the lowest light throughput, while open represents the highest light throughput. + +A window covering device may provide one or more properties such as up/down movement combined with for example slats angle control. + +Each of the available properties is advertised. A window covering device may offer precise control of the position of a property or it may offer a more limited movement control, where it is possible to start and stop movement in one of two directions but where the target position cannot be specified. + +If a window covering parameter is marked as position unknown, this indicates that the actual property can only be controlled via start and stop of movement. + +[The parameters controlling edges are identified as outlined in Table 149.](04.117-window-covering-command-class-version-1.md#41171-terminology) + +Table 149, Identification of edges + +| Edge Title | Description | Usage examples | +| --- | --- | --- | +| out left _ | Outbound edge towards the left | | +| out right _ | Outbound edge towards the right | | +| in left _ | Inbound edge towards the left | | +| in right _ | Inbound edge towards the right | | +| in right left _ _ | Inbound edges controlled horizontally as one | | + +![figure p651](assets/img-817f13d4ec.png) + +![figure p651](assets/img-c7049c3f45.png) + +![figure p651](assets/img-8101ef46fc.png) + +![figure p651](assets/img-6620b1beac.png) + +![figure p651](assets/img-cc3757bf06.png) + +| Edge Title | Description | Usage examples | +| --- | --- | --- | +| out bottom _ | Outbound edge towards the bottom | | +| out top _ | Outbound edge towards the top | | +| in bottom _ | Inbound edge towards the bottom | | +| in top _ | Inbound edge towards the top | | +| in top bottom _ _ | Inbound edges controlled vertically as one | | + +![figure p652](assets/img-90f32b94b4.png) + +![figure p652](assets/img-b391b0ae58.png) + +![figure p652](assets/img-d3b9d2ea2d.png) + +![figure p652](assets/img-a6f1afb4ac.png) + +![figure p652](assets/img-5c95fb2a15.png) + +## 4.117.2 Compatibility considerations + +This Command Class replaces the following command classes: + + Basic Window Covering Command Class [OBSOLETED]  Move To Position Window Covering Command Class [OBSOLETED] + +### 4.117.2.1 Motor Control Device Class support + +A node supporting this Command Class SHOULD comply implement the Motor Control Specific Device [Class B or C (refer to [1], [10] or [22]) for backwards compatibility with existing window covering control](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) applications. + +### 4.117.2.2 Command Class dependencies + +A node supporting the Window Covering Command Class, Version 1 MUST support the Multilevel Switch Command Class, version 3 or newer. + +With the exception for slats angle control, the following mapping MUST apply: + + The Multilevel Switch value 0x00 MUST represent the least light, i.e. covering fully closed.  The Multilevel Switch value 0x63 MUST represent the most light, i.e. covering fully opened. + +For slats angle control, the following mapping MUST apply: + + The Multilevel Switch value 0x00 MUST represent slats closed to the one side.  The Multilevel Switch value 0x32 MUST represent slats open.  The Multilevel Switch value 0x63 MUST represent slats closed to the other side. + +By mapping the Multilevel Switch value 0 to the closed position, a multicasted or broadcasted Multilevel Switch Command that turns off light sources will also cause window coverings to close, thus reducing light from the outside. + +A supporting node MAY use the Multilevel Switch Command Class to control multiple features like up/down control as well as slats angle control. For instance, the Start Level Change command may start changing the slats angle towards the extreme angle and when reaching that extreme angle, it may start moving up or down. This way, multiple functions can be controlled from a general purpose remote control, although with less convenience than if a dedicated window covering remote control is used. + +## 4.117.3 Window Covering Parameters + +Each distinct property of a window covering node is accessed via a dedicated parameter. + +Two variants are defined for many parameters: One allows full position control, including movement control. The other variant is limited to movement control. + +If a node supports full position control of a property (even parameter IDs), it MUST NOT support the corresonding parameter limited to movement control (odd parameter IDs). + +The term “Closed” represents the lowest light throughput, while “Open” represents the highest light throughput of the window covering. + +Table 150, Window Covering Parameter IDs + +| Parm ID | Description | Value range | Encoding | +| --- | --- | --- | --- | +| Outbound horizontal control | | | | +| 0 | out left: Outbound edge towards the left _ Right/Left movement (Position unknown) | NA | Level Change Up = Opening Level Change Down = Closing | +| 1 | out left: Outbound edge towards the left _ Right/Left position Parm 0 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| 2 | out right: Outbound edge towards the right _ Right/Left movement (Position unknown) | NA | Level Change Up = Opening Level Change Down = Closing | +| 3 | out right: Outbound edge towards the right _ Right/Left position Parm 2 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | + +| Parm ID | Description | Value range | Encoding | +| --- | --- | --- | --- | +| Inbound horizontal control | | | | +| 4 | in left: Inbound edge towards the left _ Right/Left movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 5 | in left: Inbound edge towards the left _ Right/Left position Parm 4 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| 6 | in right: Inbound edge towards the right _ Right/Left movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 7 | in right: Inbound edge towards the right _ Right/Left position Parm 6 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| 8 | in right left: _ _ Inbound edges controlled horizontally as one Right/Left movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 9 | in right left: _ _ Inbound edges controlled horizontally as one Right/Left position Parm 8 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| Angle control of vertical slats | | | | +| 10 | Vertical slats angle Right/Left movement (Position unknown) | NA | Level Change Down = Closing; to the right inside Level Change Up = Closing; to the left inside (Open is passed midway between the two closing positions) | +| 11 | Vertical slats angle Right/Left position Parm 10 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed; to the right inside 0x32 = Open 0x63 = Closed; to the left inside | + +| Parm ID | Description | Value range | Encoding | +| --- | --- | --- | --- | +| Outbound vertical control | | | | +| 12 | out bottom: Outbound edge towards the _ bottom Up/Down movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 13 | out bottom: Outbound edge towards the _ bottom Up/Down position Parm 12 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| 14 | out top: Outbound edge towards the top _ Up/Down movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 15 | out top: Outbound edge towards the top _ Up/Down position Parm 14 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| Inbound vertical control | | | | +| 16 | in bottom: Inbound edge towards the bottom _ Up/Down movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 17 | in bottom: Inbound edge towards the bottom _ Up/Down position Parm 16 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| 18 | in top: Inbound edge towards the top _ Up/Down movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 19 | in top: Inbound edge towards the top _ Up/Down position Parm 18 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | + +| Parm ID | Description | Value range | Encoding | +| --- | --- | --- | --- | +| 20 | in top bottom: _ _ Inbound edges controlled vertically as one Up/Down movement (Position unknown) | NA | Level Change Down = Closing Level Change Up = Opening | +| 21 | in top bottom: _ _ Inbound edges controlled vertically as one Up/Down position Parm 20 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed 0x63 = Open | +| Angle control of horizontal slats | | | | +| 22 | Horizontal slats angle Up/Down movement (Position unknown) | NA | Level Change Down = Closing; up inside Level Change Up = Closing; down inside (Open is passed midway between the two closing positions) | +| 23 | Horizontal slats angle Up/Down position Parm 22 MUST NOT be supported | 0x00 – 0x63 | 0x00 = Closed; up inside 0x32 = Open 0x63 = Closed; down inside | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A device MAY implement up to 100 hardware levels (including 0) for a given parameter. If a device implements less than 100 hardware levels, the hardware levels MUST be distributed uniformly over the entire range. The mapping of parameter values to hardware levels MUST be monotonous, i.e. a higher value MUST [be mapped to either the same or a higher hardware level. An example is found in Table 151.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +Table 151, Parameter value mapping to a limited number of hardware levels (example) + +| Horizontal Slats Angle | Hardware level | +| --- | --- | +| 0x00..0x13 | 100% Up inside | +| 0x14..0x27 | 50% Up inside | +| 0x28..0x3B | Open | +| 0x3C..0x4F | 50% Down inside | +| 0x50..0x63 | 100% Down inside | + +## 4.117.4 Window Covering Supported Get Command + +This command is used to request the supported properties of a device. + +The Window Covering Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING SUPPORTED GET (0x01) _ _ _ | | | | | | | | + +## 4.117.5 Window Covering Supported Report Command + +This command is used to advertise the supported properties of a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING SUPPORTED REPORT (0x02) _ _ _ | | | | | | | | +| Reserved | | | | Number of Parameter Mask bytes | | | | +| Parameter Mask 1 | | | | | | | | +| … | | | | | | | | +| Parameter Mask N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Number of Parameter Mask bytes (4 bits) + +The Number of Parameter Masks field MUST advertise the number of bytes carrying the Covering Parameter Mask field. + +The value MUST be in the range 1..15. + +Parameter Mask (N Bytes) + +The Parameter Mask field MUST advertise the Parameters supported by the device. + +The length of this field MUST be advertised by the Number of Parameter Masks field. + + Bit 0 in Bit Mask 1 indicates if Parameter ID 0 is supported  Bit 1 in Bit Mask 1 indicates if Parameter ID 1 is supported  … + +[For the definition of Parameter IDs, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +## 4.117.6 Window Covering Get Command + +This command is used to request the status of a specified Covering Parameter. + +The Window Covering Report command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING GET (0x03) _ _ | | | | | | | | +| Parameter ID | | | | | | | | + +Parameter ID (8 bits) + +This field MUST specify the Parameter for which the status is requested. [For the definition of Parameter IDs, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +A node receiving an even Parameter ID (marked as “position unknown”) MUST set the Current Value and Target Value fields to 0x00 and the Duration field to 0xFE in the returned Report if the window covering is not moving (i.e., stationary). + +## 4.117.7 Window Covering Report Command + +This command is used to advertise the status of a Parameter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING REPORT (0x04) _ _ | | | | | | | | +| Parameter ID | | | | | | | | +| Current Value | | | | | | | | +| Target Value | | | | | | | | +| Duration | | | | | | | | + +Parameter ID (8 bits) + +This field MUST advertise the Parameter covered by this report. [For the definition of Parameter IDs, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) Current Value (8 bits) + +The Current Value field MUST advertise the current value of the Parameter identified by the Parameter ID field. + +The Current Value SHOULD be identical to the Target Value when a transition has ended. [For the definition of valid parameter values, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +Target Value (8 bits) + +The Target Value field MUST advertise the target value of an ongoing transition or the most recent transition for the advertised Parameter ID. + +If a transition is initiated in an interactive fashion via a local user interface or via a Start Level Change command, the advertised Target Value MUST be 0x00 or 0x63, depending on the direction. + +[For the definition of valid parameter values, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +Duration (8 bits) + +The Duration field SHOULD advertise the time needed to reach the Target Value at the actual transition [rate. The encoding of the Duration field MUST be according to Table 8, Actuator Command Class Duration Report encoding.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) + +The Duration is defined as the interval from start of the transition until the Target Value is reached. + +## 4.117.8 Window Covering Set Command + +This command is used to control one or more parameters in a window covering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING SET (0x05) _ _ | | | | | | | | +| Reserved | | | Parameter Count | | | | | +| Parameter ID 1 | | | | | | | | +| Value 1 | | | | | | | | +| ... | | | | | | | | +| Parameter ID N | | | | | | | | +| Value N | | | | | | | | +| Duration | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Parameter Count (5 bits) + +This field MUST specify the number of (Parameter ID, Value) datasets contained in the Window Covering Set command. Parameter ID (N bytes) + +This field MUST specify the Parameter to receive a new value. + +A receiving node MUST ignore even Parameters ID (marked as “position unknown”). [For the definition of Parameter IDs, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +Value (N bytes) + +This field MUST specify the value of the Parameter identified by the Parameter ID field. [For the definition of valid parameter ID values, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) + +Duration (8 bits) + +The Duration field MUST specify the time that the transition should take from the current value to the new target value. A supporting device SHOULD respect the specified Duration value. + +[The encoding of the Duration field MUST be according to Table 7, Actuator Command Class Duration Set encoding.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) + +## 4.117.9 Window Covering Start Level Change Command + +This command is used to initiate a transition of one parameter to a new level. + +A receiving node MUST initiate the transition to a new value for the specified Parameter ID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING START LEVEL CHANGE (0x06) _ _ _ _ | | | | | | | | +| Res | Up/ Down | Res | | | | | | +| Parameter ID | | | | | | | | +| Duration | | | | | | | | + +Up/Down (1 bit) + +This field MUST specify the direction of the level change. + +If the Up/Down bit is set to 0 the level change MUST be increasing. If the Up/Down bit is set to 1 the level change MUST be decreasing. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Parameter ID (8 bits) + +This field MUST specify the Parameter to start a transition. + +A node receiving this command MUST accept all its supported parameter IDs (even and odd). [For the definition of Parameter IDs, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) Duration (8 bits) + +The level change rate MUST be calculated to match a level change from the minimum value to the maximum value during the time specified by the Duration field. A supporting device SHOULD respect the specified Duration value. + +[The encoding of the Duration field MUST be according to Table 7, Actuator Command Class Duration Set encoding.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) + +## 4.117.10 Window Covering Stop Level Change Command + +This command is used to stop an ongoing transition. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WINDOW COVERING (0x6A) _ _ _ | | | | | | | | +| Command = WINDOW COVERING STOP LEVEL CHANGE (0x07) _ _ _ _ | | | | | | | | +| Parameter ID | | | | | | | | + +Parameter ID (8 bits) + +This field MUST specify the parameter to stop a transition. + +A receiving node MUST stop the transition if the specified Parameter ID is currently in transition to a new value. A receiving node MUST NOT stop ongoing transitions for other Parameter IDs than the one specified. + +A node receiving this command MUST accept all parameter IDs supported by the device. [For the definition of Parameter IDs, refer to Table 150.](04.117-window-covering-command-class-version-1.md#41173-window-covering-parameters) APPENDIX AASCII CODES + +The standard ASCII table defines 128 character codes (from 0 to 127), of which, the first 32 are control codes (non-printable), and the remaining 96 character codes are printable characters. The table below shows the hexadecimal values of the ASCII character codes, e.g. the ASCII code for the capital letter “A” is equal to 0x41: + +Table 152, The standard ASCII Table + +![figure p662](assets/img-81079508de.jpeg) + +In addition to the 128 standard ASCII codes (the ones listed above ranging from 0 to 127), most systems have another 128 extra codes which form what is known as extended ASCII (with ranges from 128 to 255). The OEM Extended ASCII character set is included in all PC-compatible computers as the default character set when the system boots before loading any operating system and under MS-DOS. It includes some foreign signs, some marked characters and also pieces to draw simple panels. The table below shows the hexadecimal values of the OEM Extended ASCII character codes, e.g. the ASCII code for the capital letter “Æ” is equal to 0x92: Table 153, OEM Extended ASCII Table + +![figure p663](assets/img-5494f2b277.jpeg) + +Below are listed codes for players, radios etc. as an alternative to the OEM Extended ASCII codes. Undefined values MUST be ignored. + +Table 154, Players Table + +![figure p663](assets/img-dcd97ada58.jpeg) + +References + +[1] Silicon Labs, SDS10242, Software Design Spec., Z-Wave Device Class Specification. [2] Silicon Labs, SDS12657, Z-Wave Command Class Specification A-M. [3] Silicon Labs, SDS12652, Z-Wave Command Class Specification N-Z. [4] IETF RFC 4861, Neighbor Discovery for IP version 6 (IPv6), [http://tools.ietf.org/pdf/rfc4861.pdf](http://tools.ietf.org/pdf/rfc4861.pdf) [5] IETF RFC 3122, Extensions to IPv6 Neighbor Discovery for Inverse Discovery Specification, [http://tools.ietf.org/pdf/rfc3122.pdf](http://tools.ietf.org/pdf/rfc3122.pdf) [6] IETF RFC 2119, Key words for use in RFCs to Indicate Requirement Levels, [http://tools.ietf.org/pdf/rfc2119.pdf](http://tools.ietf.org/pdf/rfc2119.pdf) [7] IETF RFC 2460, Internet Protocol, Version 6 (IPv6) Specification, [http://tools.ietf.org/pdf/rfc2460.pdf](http://tools.ietf.org/pdf/rfc2460.pdf) [8] IETF RFC 4291, IP Version6 Addressing Architecture, [http://tools.ietf.org/pdf/rfc4291.pdf](http://tools.ietf.org/pdf/rfc4291.pdf) [9] Silicon Labs, SDS11846, Z-Wave Plus Role Types Specification. [10] Silicon Labs, SDS11847, Z-Wave Plus Device Type Specification. [11] Graphical UI elements, [http://en.wikipedia.org/wiki/Graphical_user_interface_elements](http://en.wikipedia.org/wiki/Graphical_user_interface_elements) [12] Silicon Labs, SDS13425. Z-Wave Plus Assigned Manufacturer IDs. [13] Silicon Labs, SDS13548, List of defined Z-Wave Command Classes [14] Silicon Labs, SDS13783, Z-Wave Transport-Encapsulation Command Class Specification [15] Silicon Labs, SDS13782, Z-Wave Management Command Class Specification [16] Silicon Labs, SDS13784, Z-Wave Network-Protocol Command Class Specification [17] Silicon Labs, SDS13812, Multilevel Sensor Command Class, list of assigned Multilevel Sensor types and scales [18] Silicon Labs, SDS13713, Notification Command Class, list of assigned Notifications [19] Silicon Labs, SDS13907, Simple AV Command Class, list of assigned AV Control codes [20] Silicon Labs, SDS14223, Z-Wave Command Class Control Specification [21] Silicon Labs, SDS14305, Meter Table Monitor Command Class, list of assigned types, scales and datasets [22] Silicon Labs, SDS14224, Z-Wave Plus v2 Device Type Specification. [23] Silicon Labs, SDS14223, Z-Wave Command Class Control Specification [24] diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.12-barrier-operator-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.12-barrier-operator-command-class-version-1.md new file mode 100644 index 0000000..239ec9e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.12-barrier-operator-command-class-version-1.md @@ -0,0 +1,221 @@ + +# 4.12 Barrier Operator Command Class, version 1 + +The Barrier Operator Command Class is used to control and query the status of motorized barriers. + +## 4.12.1 Compatibility considerations + +A supporting node MAY ignore a Barrier Operator Command if the requested operation violates operational limitations or safety regulations. + +### 4.12.1.1 Node Information Frame (NIF) + +The Barrier Operator Command Class MUST be supported only using secure communication (S0 and/or S2 Command Class). + +A supporting node MUST NOT advertise the Barrier Operator Command Class in its NIF after network inclusion. + +### 4.12.1.2 Command Class dependencies + +A node supporting the Barrier Operator Command Class MUST support the Notification Command Class, version 4 or newer. + +## 4.12.2 Barrier Operator Set Command + +This command is used to initiate an unattended change in state of the barrier. + +A supporting node MAY ignore this command if the requested operation violates operational limitations or safety regulations. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR SET _ _ | | | | | | | | +| Target Value | | | | | | | | + +Target Value (8 bits) + +This field MUST specify the intended state of the device. + +[The encoding of this field MUST be according to Table 17.](04.12-barrier-operator-command-class-version-1.md#4122-barrier-operator-set-command) + +Table 17, Barrier Set::Target Value + +| Target Value | | Description | Version | +| --- | --- | --- | --- | +| 0x00 | CLOSE | Initiate unattended close | 1 | +| 0xFF | OPEN | Initiate unattended open | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +![Figure 7, Barrier Set, state transitions](assets/img-e7a467d482.png) + +A receiving node MUST comply with the allowed state changes and triggering commands specified in [Figure 7. Any state/command pair not specified in Figure 7 MUST NOT cause any action.](04.12-barrier-operator-command-class-version-1.md#4122-barrier-operator-set-command) + +The receiving node SHOULD respond to OPEN and CLOSE commands. However, the receiving node CC:0066.01.01.11.005 MUST NOT respond to OPEN or CLOSE commands if any safety issue is detected. + +The receiving node MUST NOT respond to the CLOSE command unless it is in the “Open” state. + +### 4.12.2.1 Error Handling + +The device MUST stop if any safety issue is detected. + +If the requested operation is overruled by a safety mechanism, the device MUST notify the requester via a Notification Report with the Notification {Access Control::Barrier unable to perform requested operation due to UL requirements}. + +If the requested operation is prohibited by the specific device class, e.g. SPECIFIC_TYPE_SECURE_BARRIER_OPEN_ONLY or SPECIFIC_TYPE_SECURE_BARRIER_CLOSE_ONLY, the device MUST notify the requester by issuing an Application Rejected Request Command. The Application Rejected Request Command is a member of the Application Status Command Class. + +## 4.12.3 Barrier Operator Get Command + +This command is used to request the current state of a barrier operator device. + +[The Barrier Operator Report Command MUST be returned in response to this command.](04.12-barrier-operator-command-class-version-1.md#4124-barrier-operator-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR GET _ _ | | | | | | | | + +## 4.12.4 Barrier Operator Report Command + +This command is used to advertise the status of the barrier operator device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR REPORT _ _ | | | | | | | | +| State | | | | | | | | + +State (8 bits) + +This field MUST advertise the current state of the device. + +[The encoding of this field MUST be according to Table 18.](04.12-barrier-operator-command-class-version-1.md#4124-barrier-operator-report-command) Table 18, Barrier Report::State + +| Value | State | Requirement level | Description | Version | +| --- | --- | --- | --- | --- | +| 0x00 | Closed | REQUIRED | The barrier is in the Closed position | 1 | +| 0x01..0x63 | Stopped at exact Position | RECOMMENDED | 0x01 = 1% (Near Closed) 0x63 = 99% (Near Open) | 1 | +| 0xFC | Closing | REQUIRED | The barrier is closing. The current position is unknown. | 1 | +| 0xFD | Stopped | REQUIRED | The barrier is stopped. The current position is unknown. | 1 | +| 0xFE | Opening | REQUIRED | The barrier is opening. The current position is unknown. | 1 | +| 0xFF | Open | REQUIRED | The barrier is in the Open position | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.12.5 Barrier Operator Get Signaling Capabilities Supported Command + +This command is used to query a device for available subsystems which may be controlled via Z-Wave. + +The Barrier Operator Report Signaling Capabilites Supported Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR SIGNAL SUPPORTED GET _ _ _ _ | | | | | | | | + +## 4.12.6 Barrier Operator Report Signaling Capabilities Supported Command + +This command returns a bit mask of signaling subsystem(s) supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR SIGNAL SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| …. | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +This field is used to advertise the event signaling capabilities supported by the sending node. + +It MUST be treated as a bitmask. + +1. Bit 0 in Bit Mask 1 indicates if subsystem type 0x01 is supported 2. Bit 1 in Bit Mask 1 indicates if subsystem type 0x02 is supported 3. … + +If the subsystem type is supported, the corresponding bit MUST be set to 1. If the subsystem type is not supported, the corresponding bit MUST be set to 0. + +[For the complete list of subsystem types, refer to Table 19.](04.12-barrier-operator-command-class-version-1.md#4127-barrier-operator-event-signal-set-command) + +The length of this field depends on the number of subsystems supported by the sending node. The length of this field MUST be in the range 1..32 bytes. + +A sending node MUST limit the length of this field to represent only those subsystems supported and MUST NOT extend the length of the Bit Mask to pad the packet with 0x00. + +## 4.12.7 Barrier Operator Event Signal Set Command + +This command is used to turn on or off an event signaling subsystem that is supported by the device. + +A supporting node MAY ignore this command if the requested operation violates safety regulartions. + +UL requirements MUST take precedence over any Set command sent to a subsystem. It is up to the discretion of the device to accept or reject the requested action. If the requested action is rejected, the node MUST notify the requester via the Notification Command Class Report with the Notification {Access Control::Barrier unable to perform requested operation due to UL requirements}. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR SIGNAL SET _ _ _ | | | | | | | | +| Subsystem Type | | | | | | | | +| Subsystem State | | | | | | | | + +Subsystem Type (8 bits) This field is used to indicate which subsystem type MUST be set at the receiving node. This field MUST [comply with Table 19.](04.12-barrier-operator-command-class-version-1.md#4127-barrier-operator-event-signal-set-command) + +Table 19, Barrier Operator Event signal::Subsystem types encoding + +| Subsystem Type | Description | Version | +| --- | --- | --- | +| 0x00 | NOT SUPPORTED - reserved | 1 | +| 0x01 | The Barrier Device has an Audible Notification subsystem controllable via Z-Wave (For example: Siren) | 1 | +| 0x02 | The Barrier Device has an Visual Notification subsystem controllable via Z-Wave (For example: Flashing Light) | 1 | +| 0x03.. 0xFF | reserved | 1 | + +Subsystem State (8 bits) + +This field is used to indicate the state that the specified subsystem MUST assume at the receiving node. [This field MUST comply with Table 20.](04.12-barrier-operator-command-class-version-1.md#4127-barrier-operator-event-signal-set-command) + +Table 20, Barrier Operator Event Signal::Subsystem states encoding + +| Subsystem State | Description | Version | +| --- | --- | --- | +| 0x00 | Subsystem OFF | 1 | +| … | reserved | 1 | +| 0xFF | Subsystem ON | 1 | + +## 4.12.8 Barrier Operator Event Signaling Get Command + +This command is used to request the state of a signaling subsystem to a supporting node. + +The Barrier Operator Event Signaling Report Command MUST be returned in response to this command if the specified type is supported. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR SIGNAL GET _ _ _ | | | | | | | | +| Subsystem Type | | | | | | | | + +[For fields’ description, refer to 4.12.7 Barrier Operator Event Signal Set Command.](04.12-barrier-operator-command-class-version-1.md#4127-barrier-operator-event-signal-set-command) + +## 4.12.9 Barrier Operator Event Signaling Report + +This command is used to indicate the state of a notification subsystem of a Barrier Device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | +| Command = BARRIER OPERATOR SIGNAL REPORT _ _ _ | | | | | | | | +| Subsystem Type | | | | | | | | +| Subsystem State | | | | | | | | + +[For fields’ description, refer to 4.12.7 Barrier Operator Event Signal Set Command](04.12-barrier-operator-command-class-version-1.md#4127-barrier-operator-event-signal-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.05-basic-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.13-basic-command-class-version-1.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.05-basic-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.13-basic-command-class-version-1.md index dfdb0d9..f0a769c 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.05-basic-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.13-basic-command-class-version-1.md @@ -1,11 +1,11 @@ -# 4.5 Basic Command Class, version 1 +# 4.13 Basic Command Class, version 1 The Basic Command Class allows a controlling device to operate the primary functionality of a supporting device without any further knowledge. @@ -13,7 +13,7 @@ The Basic Command Class ensures a basic interoperability if no other command cla [The Basic Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) -## 4.5.1 Compatibility considerations +## 4.13.1 Compatibility considerations A specific device may not be able to support all Basic CC commands or parameter levels. For instance, a relay can only open fully in response to any non-zero value. @@ -21,33 +21,33 @@ Any device SHOULD support the Basic Command Class. A device MUST implement mappings from the Basic Command Class to specific commands according to the advertised generic and specific device class of the Node Info frame. Mappings defined by a Specific Device Class have precedence over the Generic Device Class. -For Z-Wave Plus devices, the Basic Command Class MUST be mapped according to the actual Z-Wave [Plus Device Type. For further information, refer to [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +For Z-Wave Plus devices, the Basic Command Class MUST be mapped according to the actual Z-Wave [Plus Device Type. For further information, refer to [10], [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -The following sections only present frame formats. For details on the mapping to other command [classes, refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +The following sections only present frame formats. For details on the mapping to other command [classes, refer to [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -### 4.5.1.1 Node Information Frame (NIF) +### 4.13.1.1 Node Information Frame (NIF) -The Basic Command Class MUST NOT be advertised in the Node Information Frame. The Basic Command Class MUST NOT be advertised in the Security Commands Supported Report (S0 as well as S2) +The Basic Command Class MUST NOT be advertised in the Node Information Frame. The Basic Command Class MUST NOT be advertised in the Security Commands Supported Report (S0 as CC:0020.01.00.21.004 well as S2) A securely included node MAY support the Basic Command Class at the highest security level but it MUST NOT support the Basic Command Class at any lower security level or non-securely. -## 4.5.2 Basic Set Command +## 4.13.2 Basic Set Command This command is used to set a value in a supporting device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | +| Command = BASIC SET _ | | | | | | | | +| Value | | | | | | | | Value (8 bits) -A supporting device SHOULD support all parameter values in the range {0x00..0x63, 0xFF}. A controlling device MUST NOT assume that a receiving device reacts to this command. +A supporting device SHOULD support all parameter values in the range {0x00..0x63, 0xFF}. CC:0020.01.01.11.001 A controlling device MUST NOT assume that a receiving device reacts to this command. -A receiving device MUST interpret Basic Set parameter values according to the requirements of the [Device Class implemented by the device. Refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +A receiving device MUST interpret Basic Set parameter values according to the requirements of the [Device Class implemented by the device. Refer to [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -## 4.5.3 Basic Get Command +## 4.13.3 Basic Get Command This command is used to request the status of a supporting device. @@ -55,39 +55,39 @@ The Basic Report Command MUST be returned in response to this command. This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC GET _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | +| Command = BASIC GET _ | | | | | | | | -## 4.5.4 Basic Report Command +## 4.13.4 Basic Report Command This command is used to advertise the status of the primary functionality of the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | +| Command = BASIC REPORT _ | | | | | | | | +| Value | | | | | | | | Value (8 bits) The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. -[For details on the mapping of values, refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[For details on the mapping of values, refer to [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) A controlling device MUST NOT assume that the Value is identical to a value previously specified in a Set command; not even when a transition has ended. -[A receiving device MUST interpret the Value field according to Table 17.](04.05-basic-command-class-version-1.md#454-basic-report-command) +[A receiving device MUST interpret the Value field according to Table 21.](04.13-basic-command-class-version-1.md#4134-basic-report-command) -Table 17, Basic Report :: Value +Table 21, Basic Report :: Value -| | Value | | | Level | | | State | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | | 0% | | | Off | | | -| 1..99 (0x01..0x63) | | | 1..100% | | | On | | | -| … | | | Reserved | | | Reserved | | | -| 254 (0xFE) | | | Unknown | | | Unknown | | | -| 255 (0xFF) | | | 100% | | | On | | | +| Value | Level | State | +| --- | --- | --- | +| 0 (0x00) | 0% | Off | +| 1..99 (0x01..0x63) | 1..100% | On | +| … | Reserved | Reserved | +| 254 (0xFE) | Unknown | Unknown | +| 255 (0xFF) | 100% | On | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.06-basic-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.14-basic-command-class-version-2.md similarity index 59% rename from docs/specs/command-class-specification/04-command-class-definitions/04.06-basic-command-class-version-2.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.14-basic-command-class-version-2.md index e03128a..048c81f 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.06-basic-command-class-version-2.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.14-basic-command-class-version-2.md @@ -1,11 +1,11 @@ -# 4.6 Basic Command Class, version 2 +# 4.14 Basic Command Class, version 2 The Basic Command Class allows a controlling device to operate the primary functionality of another device without any further knowledge. @@ -13,43 +13,43 @@ The Basic Command Class ensures a basic interoperability if no other Command Cla [The Basic Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) -## 4.6.1 Compatibility considerations +## 4.14.1 Compatibility considerations A device supporting Basic Command Class, version 2 MUST support Basic Command Class, version 1. Commands not described in this version remain unchanged from version 1. Version 2 adds the distinction between the Current Value and the Target State of the device. Version 2 elevates the requirement level so that the Current Value field of the Basic Report command MUST advertise the current value of the device hardware; also while in transition to a new target value. -[The compatibility considerations from version 1 also apply to this version. Refer to 4.5.1.](04.05-basic-command-class-version-1.md#451-compatibility-considerations) +[The compatibility considerations from version 1 also apply to this version. Refer to 4.13.1.](04.13-basic-command-class-version-1.md#4131-compatibility-considerations) -## 4.6.2 Basic Report Command +## 4.14.2 Basic Report Command This command is used to advertise the status of the primary functionality of the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC _ _ | | | | | | | | +| Command = BASIC REPORT _ | | | | | | | | +| Current Value | | | | | | | | +| Target Value | | | | | | | | +| Duration | | | | | | | | Current Value (8 bits) The Current Value field MUST advertise the current value of the device hardware; also while in transition to a new target value. -The advertised values may vary depending on the device class implemented by the supporting device. A [controlling device MUST interpret the value according to Table 17.For details on the mapping of values,](04.05-basic-command-class-version-1.md#454-basic-report-command) [refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +The advertised values may vary depending on the device class implemented by the supporting device. A [controlling device MUST interpret the value according to Table 21.For details on the mapping of values,](04.13-basic-command-class-version-1.md#4134-basic-report-command) [refer to [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -The Current Value SHOULD be identical to the Target Value when a transition has ended. Target Value (8 bits) +The Current Value SHOULD be identical to the Target Value when a transition has ended. -The Target Value field MUST advertise the target value of an ongoing transition or the most recent transition. +Target Value (8 bits) -The advertised values may vary depending on the device class implemented by the supporting device. A [controlling device MUST interpret the value according to Table 17.](04.05-basic-command-class-version-1.md#454-basic-report-command) +The Target Value field MUST advertise the target value of an ongoing transition or the most recent transition. -[For details on the mapping of values, refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +The advertised values may vary depending on the device class implemented by the supporting device. A [controlling device MUST interpret the value according to Table 21.](04.13-basic-command-class-version-1.md#4134-basic-report-command) [For details on the mapping of values, refer [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) If queried after receiving a Set command, the Target Value field MUST advertise the target value specified in the Set command. The Target Value MAY change at a later time due to local control or a “Stop” motion control command. -If the device is in a motion controlled transition, the Target Value field MUST advertise the min or max [value (depending on the direction) according to the command class mappings defined in [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +If the device is in a motion controlled transition, the Target Value field MUST advertise the min or max [value (depending on the direction) according to the command class mappings defined in [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Duration (8 bits) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.07-basic-tariff-information-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.15-basic-tariff-information-command-class-version-1.md similarity index 60% rename from docs/specs/command-class-specification/04-command-class-definitions/04.07-basic-tariff-information-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.15-basic-tariff-information-command-class-version-1.md index d57d0e5..a39c274 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.07-basic-tariff-information-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.15-basic-tariff-information-command-class-version-1.md @@ -1,11 +1,11 @@ -# 4.7 Basic Tariff Information Command Class, version 1 +# 4.15 Basic Tariff Information Command Class, version 1 This Basic Tariff Information Command Class for use with a single element or dual element meter, and for use with import (electricity received from grid) rates only. The command class is kept as simple as possible without any pricing information. @@ -13,7 +13,7 @@ This command class supports a GET and REPORT. No Set command is supported, as it is not appropriate to set any of the parameters through Z-Wave. -## 4.7.1 Basic Tariff Information Get Command +## 4.15.1 Basic Tariff Information Get Command This command is used to request current tariff information from the meter. @@ -21,33 +21,33 @@ The Basic Tariff Information Report Command MUST be returned in response to this This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC TARIFF INFO _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC TARIFF INFO GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC TARIFF INFO _ _ _ _ | | | | | | | | +| Command = BASIC TARIFF INFO GET _ _ _ | | | | | | | | -## 4.7.2 Basic Tariff Information Report Command +## 4.15.2 Basic Tariff Information Report Command This command returns information on the number of import rates supported, and current import rate information. Application can send unsolicited Basic Tariff Report commands or requested by the Basic Tariff Get Information command. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC TARIFF INFO _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC TARIFF INFO REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Dual | | | Reserved | | | | | | | | | Total No. Import Rates | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | E1 – Current Rate in Use | | | | | | | | | | | | -| E1 - Rate Consumption Register – MSB | | | | | | | | | | | | | | | | | | | | | | | | -| E1 - Rate Consumption Register | | | | | | | | | | | | | | | | | | | | | | | | -| E1 - Rate Consumption Register | | | | | | | | | | | | | | | | | | | | | | | | -| E1 - Rate Consumption Register – LSB | | | | | | | | | | | | | | | | | | | | | | | | -| E1 – Time for Next Rate – Hours | | | | | | | | | | | | | | | | | | | | | | | | -| E1 – Time for Next Rate – Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| E1 – Time for Next Rate – Seconds | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | E2 – Current Rate in Use | | | | | | | | | | | | -| E2 - Rate Consumption Register – MSB | | | | | | | | | | | | | | | | | | | | | | | | -| E2 - Rate Consumption Register | | | | | | | | | | | | | | | | | | | | | | | | -| E2 - Rate Consumption Register | | | | | | | | | | | | | | | | | | | | | | | | -| E2 - Rate Consumption Register – LSB | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC TARIFF INFO _ _ _ _ | | | | | | | | +| Command = BASIC TARIFF INFO REPORT _ _ _ | | | | | | | | +| Dual | Reserved | | | Total No. Import Rates | | | | +| Reserved | | | | E1 – Current Rate in Use | | | | +| E1 - Rate Consumption Register – MSB | | | | | | | | +| E1 - Rate Consumption Register | | | | | | | | +| E1 - Rate Consumption Register | | | | | | | | +| E1 - Rate Consumption Register – LSB | | | | | | | | +| E1 – Time for Next Rate – Hours | | | | | | | | +| E1 – Time for Next Rate – Minutes | | | | | | | | +| E1 – Time for Next Rate – Seconds | | | | | | | | +| Reserved | | | | E2 – Current Rate in Use | | | | +| E2 - Rate Consumption Register – MSB | | | | | | | | +| E2 - Rate Consumption Register | | | | | | | | +| E2 - Rate Consumption Register | | | | | | | | +| E2 - Rate Consumption Register – LSB | | | | | | | | Dual (1 bit) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.16-basic-window-covering-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.16-basic-window-covering-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..f3a29ea --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.16-basic-window-covering-command-class-version-1-obsoleted.md @@ -0,0 +1,43 @@ + +# 4.16 Basic Window Covering Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST NOT support this command class. + +New window covering device implementations SHOULD support the Window Covering Command Class. + +This section contains Commands that may be used to control a Basic Window Covering Command Class. + +## 4.16.1 Basic Window Covering Start Level Change Command + +This command is used to start moving drapes, shades, blinds in a given direction. The speed of the movement is implementation specific. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC WINDOW COVERING _ _ _ _ | | | | | | | | +| Command = BASIC WINDOW COVERING START LEVEL CHANGE _ _ _ _ _ | | | | | | | | +| Reserved | Open/ Close | Reserved | | | | | | + +Open/Close (1 bit) + +If the Open/Close bit is set to 0 the window covering SHOULD open. If field is set to 1 the window covering SHOULD close. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.16.2 Basic Window Covering Stop Level Change Command + +This command is used to stop moving drapes, shades, blinds in a given direction. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BASIC WINDOW COVERING _ _ _ _ | | | | | | | | +| Command = BASIC WINDOW COVERING STOP LEVEL CHANGE _ _ _ _ _ | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.09-binary-sensor-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.17-binary-sensor-command-class-version-1-deprecated.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.09-binary-sensor-command-class-version-1-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.17-binary-sensor-command-class-version-1-deprecated.md index 88255ca..90d5db6 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.09-binary-sensor-command-class-version-1-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.17-binary-sensor-command-class-version-1-deprecated.md @@ -1,11 +1,11 @@ -# 4.9 Binary Sensor Command Class, version 1 [DEPRECATED] +# 4.17 Binary Sensor Command Class, version 1 [DEPRECATED] THIS COMMAND CLASS HAS BEEN DEPRECATED @@ -13,7 +13,7 @@ A device MAY implement this command class, but it is RECOMMENDED that new implem The Binary Sensor Command Class is used to realize binary sensors, such as movement sensors. -## 4.9.1 Binary Sensor Get Command +## 4.17.1 Binary Sensor Get Command This command is used to request the status of a sensor. @@ -21,20 +21,20 @@ The Binary Sensor Report Command MUST be returned in response to this command. This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR BINARY GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | +| Command = SENSOR BINARY GET _ _ | | | | | | | | -## 4.9.2 Binary Sensor Report Command +## 4.17.2 Binary Sensor Report Command This command is used to advertise a sensor value. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR BINARY REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Value | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | +| Command = SENSOR BINARY REPORT _ _ | | | | | | | | +| Sensor Value | | | | | | | | Sensor Value (8 bits) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.10-binary-sensor-command-class-version-2-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.18-binary-sensor-command-class-version-2-deprecated.md similarity index 52% rename from docs/specs/command-class-specification/04-command-class-definitions/04.10-binary-sensor-command-class-version-2-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.18-binary-sensor-command-class-version-2-deprecated.md index 18b8b02..27127a0 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.10-binary-sensor-command-class-version-2-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.18-binary-sensor-command-class-version-2-deprecated.md @@ -1,11 +1,11 @@ -# 4.10 Binary Sensor Command Class, version 2 [DEPRECATED] +# 4.18 Binary Sensor Command Class, version 2 [DEPRECATED] THIS COMMAND CLASS HAS BEEN DEPRECATED @@ -19,7 +19,7 @@ The Binary Sensor Command Class is used to realize binary sensors, such as movem NOTE: A binary sensor is defined as a sensor unit capable of providing a binary value in the report i.e. that an event was “triggered” or “not triggered” and not other intermediate values. For sensor units providing multiple values the Multilevel Sensor Command Class is more suitable. The Binary Sensor Command Class can further advance through implementation of the Notification Command Class to communicate details about the event. -## 4.10.1 Binary Sensor Get Command +## 4.18.1 Binary Sensor Get Command This command is used to request the status of the specific sensor device. @@ -27,72 +27,70 @@ The Binary Sensor Report Command MUST be returned in response to this command. This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR BINARY GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | +| Command = SENSOR BINARY GET _ _ | | | | | | | | +| Sensor Type | | | | | | | | Sensor Type (8 bits) -[Sensor Type specifies what type of sensor this command originates from. Refer to Table 18. The sensor](04.10-binary-sensor-command-class-version-2-deprecated.md#4101-binary-sensor-get-command) type value 0xFF returns the first found supported sensor type in the bit mask (starting from bit 0 in Bit Mask 1) by the Binary Sensor Supported Report. - -Table 18, Binary Sensor Get::Sensor Type encoding - -| | Value | | | Sensor Type | | -| --- | --- | --- | --- | --- | --- | -| | 0x00 | | | Reserved | | -| 0x01 | | | General purpose | | | -| 0x02 | | | Smoke | | | -| 0x03 | | | CO | | | -| 0x04 | | | CO 2 | | | -| 0x05 | | | Heat | | | -| 0x06 | | | Water | | | -| 0x07 | | | Freeze | | | -| 0x08 | | | Tamper | | | -| 0x09 | | | Aux | | | -| 0x0A | | | Door/Window | | | -| 0x0B | | | Tilt | | | -| 0x0C | | | Motion | | | -| 0x0D | | | Glass Break | | | -| | 0x0E..0xFE | | | Reserved | | -| 0xFF | | | Return 1st Sensor Type on supported list | | | - -## 4.10.2 Binary Sensor Report Command +[Sensor Type specifies what type of sensor this command originates from. Refer to Table 22. The sensor](04.18-binary-sensor-command-class-version-2-deprecated.md#4181-binary-sensor-get-command) type value 0xFF returns the first found supported sensor type in the bit mask (starting from bit 0 in Bit Mask 1) by the Binary Sensor Supported Report. + +Table 22, Binary Sensor Get::Sensor Type encoding + +| Value | Sensor Type | +| --- | --- | +| 0x00 | Reserved | +| 0x01 | General purpose | +| 0x02 | Smoke | +| 0x03 | CO | +| 0x04 | CO 2 | +| 0x05 | Heat | +| 0x06 | Water | +| 0x07 | Freeze | +| 0x08 | Tamper | +| 0x09 | Aux | +| 0x0A | Door/Window | +| 0x0B | Tilt | +| 0x0C | Motion | +| 0x0D | Glass Break | +| 0x0E..0xFE | Reserved | +| 0xFF | Return 1st Sensor Type on supported list | + +## 4.18.2 Binary Sensor Report Command This command is used to advertise a sensor value. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR BINARY REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Value | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | +| Command = SENSOR BINARY REPORT _ _ | | | | | | | | +| Sensor Value | | | | | | | | +| Sensor Type | | | | | | | | -Sensor Value (8 bits) +Sensor Value (8 bits) Sensor Value = 0x00 indicates that the sensor is idle and 0xFF indicates that the sensor has detected an event. -Sensor Value = 0x00 indicates that the sensor is idle and 0xFF indicates that the sensor has detected an event. - -## 4.10.3 Binary Sensor Get Supported Sensor Command +## 4.18.3 Binary Sensor Get Supported Sensor Command This command is used to request the supported sensor types from the binary sensor device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR BINARY SUPPORTED GET SENSOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | +| Command = SENSOR BINARY SUPPORTED GET SENSOR _ _ _ _ | | | | | | | | -## 4.10.4 Binary Sensor Supported Sensor Report Command +## 4.18.4 Binary Sensor Supported Sensor Report Command This command must be sent as requested by a received Binary Sensor Get Supported Sensor Command. This command indicates the supported sensor types of the binary sensor device in a bit mask format and MUST NOT be transmitted unsolicited. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR BINARY SUPPORTED SENSOR REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR BINARY _ _ _ | | | | | | | | +| Command = SENSOR BINARY SUPPORTED SENSOR REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | Bit Mask (N bytes) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.19-binary-switch-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.19-binary-switch-command-class-version-1.md new file mode 100644 index 0000000..62826c9 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.19-binary-switch-command-class-version-1.md @@ -0,0 +1,87 @@ + +# 4.19 Binary Switch Command Class, version 1 + +The Binary Switch Command Class is used to control the On/Off state of supporting nodes. + +[The Binary Switch Command Class is an actuator control Command Class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 1.1.1 Binary Switch Set Command + +This command is used to set the On/Off state at the receiving node. + +A receiving node MAY apply a non-zero duration to the transition from one value to a new value. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | +| Command = SWITCH BINARY SET _ _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +This field is used to specify the On/Off state that the receiving node MUST assume. This field MUST be [encoded according to Table 23.](04.19-binary-switch-command-class-version-1.md#111-binary-switch-set-command) + +Table 23, Binary Switch Set :: Value + +| Value | Level | State | +| --- | --- | --- | +| 0 (0x00) | 0% | Off | +| 1..99 (0x01..0x63) | 100% | On | +| 255 (0xFF) | 100% | On | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +CC:0025.01.01.11.003 If the supporting node uses this Command Class, the values MUST be interpreted as follow: + + The value 0 MUST represent the lowest possible throughput (light, water, sound, etc.)  The values 1..99 and 255 MUST represent the highest possible throughput (light, water, sound, etc.) + +The above value mapping of the Binary Switch Command Class Value allows a controlling node to control a mixed group of Binary Switch and Multilevel Switch supporting nodes via Basic Set commands. Nodes supporting the Binary Switch Command Class turn On or Off while nodes supporting the Multilevel Switch Command Class are set at the specified value level. + +## 1.1.2 Binary Switch Get Command + +This command is used to request the current On/Off state from a node. + +The Binary Switch Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | +| Command = SWITCH BINARY GET _ _ | | | | | | | | + +## 1.1.3 Binary Switch Report Command + +This command is used to advertise the current On/Off state at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | +| Command = SWITCH BINARY REPORT _ _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +This field is used to advertise the current On/Off state at the sending node. This field MUST be encoded [according to Table 24.](04.19-binary-switch-command-class-version-1.md#113-binary-switch-report-command) + +Table 24, Binary Switch Report :: Value + +| Value | Level | State | +| --- | --- | --- | +| 0 (0x00) | 0% | Off | +| 254(0xFE) | Unknown | Unknown | +| 255(0xFF) | 100% | On | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +This field SHOULD advertise the current value of the node’s hardware; also while in transition to a new value. + +A controlling node MUST NOT assume that this field’s value is identical to the value previously issued with a Binary Switch Set Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.20-binary-switch-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.20-binary-switch-command-class-version-2.md new file mode 100644 index 0000000..b94b3cc --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.20-binary-switch-command-class-version-2.md @@ -0,0 +1,73 @@ + +# 4.20 Binary Switch Command Class, version 2 + +The Binary Switch Command Class is used to control the On/Off state of supporting nodes. + +[The Binary Switch Command Class is an actuator control Command Class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 4.20.1 Compatibility considerations + +A node supporting Binary Switch Command Class, version 2 MUST support the Binary Switch Command Class, version 1. + +Commands not described in this version MUST remain unchanged from version 1. + +Version 2 adds duration and target value control and reporting. + +## 4.20.2 Binary Switch Set Command + +This command is used to set the binary state at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | +| Command = SWITCH BINARY SET _ _ | | | | | | | | +| Target Value | | | | | | | | +| Duration | | | | | | | | + +Target Value (8 bits) + +This field is used to specify the On/Off state that the receiving node MUST assume. This field MUST be [encoded according to Table 23.](04.19-binary-switch-command-class-version-1.md#111-binary-switch-set-command) + +Duration (8 bits) + +This field is used to specify the duration that the transition from the current value to the Target Value SHOULD take. + +A supporting node SHOULD respect the specified duration value. + +[The encoding of the Duration value MUST be according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) + +## 4.20.3 Binary Switch Report Command + +This command is used to advertise the current On/Off state at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | +| Command = SWITCH BINARY REPORT _ _ | | | | | | | | +| Current Value | | | | | | | | +| Target Value | | | | | | | | +| Duration | | | | | | | | + +Current Value (8 bits) + +This field is used to advertise the current On/Off state at the sending node. This field MUST be encoded [according to Table 24.](04.19-binary-switch-command-class-version-1.md#113-binary-switch-report-command) + +The advertised Current Value MUST NOT be updated to the Target Value before the hardware actuator has actually reached the Target Value. + +Target Value (8 bits) + +This field MUST advertise the target value of an ongoing transition or the most recent transition. + +[This field MUST be encoded according to Table 24.](04.19-binary-switch-command-class-version-1.md#113-binary-switch-report-command) + +Duration (8 bits) + +The duration field SHOULD advertise the duration of a transition from the Current Value to the Target Value. + +[The encoding of the Duration field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.21-binary-toggle-switch-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.21-binary-toggle-switch-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..dbcb474 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.21-binary-toggle-switch-command-class-version-1-obsoleted.md @@ -0,0 +1,50 @@ + +# 4.21 Binary Toggle Switch Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +A node MUST NOT implement this Command Class. New implementations MUST use the Binary Switch Command Class. + +The Binary Toggle Switch Command Class is used for toggle-style control of binary actuator devices. + +## 4.21.1 Binary Toggle Switch Set Command + +This command is used to toggle a device e.g. from on to off and from off to on. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE BINARY _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE BINARY SET _ _ _ | | | | | | | | + +## 4.21.2 Binary Toggle Switch Get Command + +This command is used to request the state of the load controlled by the device. + +The Binary Toggle Switch Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE BINARY _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE BINARY GET _ _ _ | | | | | | | | + +## 4.21.3 Binary Toggle Switch Report Command + +This command is used to advertise the value of a toggle switch. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE BINARY _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE BINARY REPORT _ _ _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +The value MAY be 0x00 (off) or 0xFF (on). diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.15-central-scene-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.22-central-scene-command-class-version-1-obsoleted.md similarity index 66% rename from docs/specs/command-class-specification/04-command-class-definitions/04.15-central-scene-command-class-version-1-obsoleted.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.22-central-scene-command-class-version-1-obsoleted.md index 76f8351..3d76623 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.15-central-scene-command-class-version-1-obsoleted.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.22-central-scene-command-class-version-1-obsoleted.md @@ -1,11 +1,11 @@ -# 4.15 Central Scene Command Class, version 1 [OBSOLETED] +# 4.22 Central Scene Command Class, version 1 [OBSOLETED] THIS COMMAND CLASS HAS BEEN OBSOLETED @@ -13,9 +13,9 @@ New implementations MUST support the Central Scene Command Class, version 3 or n The Central Scene Command Class is used to communicate central scene activations to a central controller using the lifeline concept. The central scene controller only need to configure lifeline association in relevant nodes before the home control application can take action in the central scene controller. The typical application contains up to 10-15 selected nodes creating a nice “out of the box” experience with minimum effort by the customer. A scene is typically activated via a push button on the device in question. -The Central Scene Command Class can instruct the central scene controller to perform the relevant [actions as shown on Figure 5.](04.15-central-scene-command-class-version-1-obsoleted.md#415-central-scene-command-class-version-1-obsoleted) +The Central Scene Command Class can instruct the central scene controller to perform the relevant [actions as shown on Figure 8.](04.22-central-scene-command-class-version-1-obsoleted.md#422-central-scene-command-class-version-1-obsoleted) -![Figure 5, Centralized feedback and control](assets/img-6ceb291c6e.png) +![Figure 8, Centralized feedback and control](assets/img-6ceb291c6e.png) Multiple sending nodes MAY advertise the same Scene number. Therefore, a receiving node MUST interpret the advertised Scene number in combination with the source NodeID of the sending node. @@ -25,7 +25,7 @@ Notice that this configuration has a single point of failure in case the central To compensate for single point of failure in case the central scene controller is broken the devices could do fallback to alternative association groups to control devices directly. These association groups are activated only if the device does not receive acknowledge from configured lifeline. This will ensure some basic level of light control in the house until the central scene controller is restored. Alternatively, a backup central scene controller could be added to the system to take over in case the first one fails. -## 4.15.1 Central Scene Supported Get Command +## 4.22.1 Central Scene Supported Get Command This command is used to request the maximum number of scenes that this device supports. @@ -33,20 +33,20 @@ The Central Scene Supported Report Command MUST be returned in response to this This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE SUPPORTED GET _ _ _ | | | | | | | | -## 4.15.2 Central Scene Supported Report Command +## 4.22.2 Central Scene Supported Report Command This command is used to report the maximum number of scenes that the requested device supports. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Scenes | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE SUPPORTED REPORT _ _ _ | | | | | | | | +| Supported Scenes | | | | | | | | Supported Scenes (8 bits) @@ -54,23 +54,23 @@ This field indicates the maximum number of scenes supported by the requested dev This field MUST advertise the number of available scenes. Scenes MUST be numbered in the range 1..[Supported Scenes]. -A device MAY implement virtual buttons via two-button presses, touch screen swipes or other means. Virtual buttons MUST be numbered after physical push buttons or graphical button objects. +A device MAY implement virtual buttons via two-button presses, touch screen swipes or other means. Virtual buttons MUST be numbered after physical push buttons or graphical button objects. CC:005B.01.02.11.002 The advertised number of Supported Scenes MUST cover physical push buttons, graphical button objects as well as virtual buttons. Therefore, the advertised number of Supported Scenes MAY be larger than the number of physical push buttons or graphical button objects. -## 4.15.3 Central Scene Notification Command +## 4.22.3 Central Scene Notification Command This command is used to report activated scene on device in question including how notification must be interpreted. In case a lifeline is configured in group #1 using Association Command Class, the device must use this lifeline for transmitting the Central Scene Notification Command. It is allowed to define other association groups handling Central Scene Notification Command and setup rules between the groups. However, lifeline has precedence over other groups handling Central Scene Notification Command in case lifeline is defined. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Key Attributes | | | | | | | | | -| Scene Number | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE NOTIFICATION _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Reserved | | | | | Key Attributes | | | +| Scene Number | | | | | | | | Sequence Number (8 bits) @@ -78,21 +78,21 @@ The sequence number MUST be incremented each time a Central Scene Notification C Key Attributes (3 bits) -[The key Attributes field specifies the state of the key. The field MUST be encoded according to Table 23](04.15-central-scene-command-class-version-1-obsoleted.md#4153-central-scene-notification-command) +[The key Attributes field specifies the state of the key. The field MUST be encoded according to Table 25](04.22-central-scene-command-class-version-1-obsoleted.md#4223-central-scene-notification-command) -Table 23, Central Scene Notification :: Key Attributes +Table 25, Central Scene Notification :: Key Attributes -| | Key Attribute | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Key Pressed | | | -| 0x01 | | | Key Released | | | -| 0x02 | | | Key Held Down | | | +| Key Attribute | Description | +| --- | --- | +| 0x00 | Key Pressed | +| 0x01 | Key Released | +| 0x02 | Key Held Down | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. -[Notifications carrying these Key Attributes MUST comply with Figure 6.](04.15-central-scene-command-class-version-1-obsoleted.md#4153-central-scene-notification-command) +[Notifications carrying these Key Attributes MUST comply with Figure 9.](04.22-central-scene-command-class-version-1-obsoleted.md#4223-central-scene-notification-command) -![Figure 6, Central Scene version 1 button press decoding and timer management](assets/img-1f27ee63d2.png) +![Figure 9, Central Scene version 1 button press decoding and timer management](assets/img-1f27ee63d2.png) Reserved @@ -102,4 +102,4 @@ Scene Number (8 bits) The advertised number of Supported Scenes MUST cover physical push buttons, graphical button objects as well as virtual buttons. Therefore, the advertised number of Supported Scenes MAY be larger than the number of physical push buttons or graphical button objects. -![Figure 7, Scene number mapping to button layout](assets/img-f586b8bafd.png) +![Figure 10, Scene number mapping to button layout](assets/img-f586b8bafd.png) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.23-central-scene-command-class-version-2-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.23-central-scene-command-class-version-2-obsoleted.md new file mode 100644 index 0000000..b48312e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.23-central-scene-command-class-version-2-obsoleted.md @@ -0,0 +1,113 @@ + +# 4.23 Central Scene Command Class, version 2 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST support the Central Scene Command Class, version 3 or newer. + +The Central Scene Command Class is used to communicate central scene activations to a central controller using the lifeline concept. + +## 4.23.1 Compatibility considerations + +Central Scene Command Class version 2 is extended on the following areas: + + The Central Scene Supported Report Command is updated to advertise Key Attributes support for each scene.  Additional Key Attributes are defined. + +Commands and paragraphs not mentioned in this version remain unchanged from version 1. + +## 4.23.2 Central Scene Supported Report Command + +This command is used to report the maximum number of supported scenes and the Key Attributes supported for each scene. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE SUPPORTED REPORT _ _ _ | | | | | | | | +| Supported Scenes | | | | | | | | +| Reserved | | | | | Number of Bit Mask Bytes | | Identical | +| Supported Key Attributes for Scene 1 – Byte 1 | | | | | | | | +| … | | | | | | | | +| Supported Key Attributes for Scene 1 – Byte N | | | | | | | | +| … | | | | | | | | +| Supported Key Attributes for Scene M – Byte 1 | | | | | | | | +| … | | | | | | | | +| Supported Key Attributes for Scene M – Byte N | | | | | | | | + +Fields not described below remain unchanged from version 1. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Number of Bit Mask Bytes (2 bits) + +This field advertises the size of each “Supported Key Attributes” field measured in bytes. CC:005B.02.02.11.002 The value MUST be in the range 1..3. + +Identical (1 bit) + +This field indicates if all scenes are supporting the same Key Attributes: + +The value 1 MUST indicate that all scenes support the same set of Key Attributes. In this case, the field “Supported Key Attributes for Scene 1” MUST advertise the supported Key Attributes for all scenes + +The value 0 MUST indicate that scenes support different Key Attributes. In this case, Supported Key Attributes MUST be advertised for each individual scene. + +Supported Key Attributes (N bytes) + +This Bit Mask field advertises the attributes supported by the corresponding scene. The field MUST be [encoded according to Table 26.](04.23-central-scene-command-class-version-2-obsoleted.md#4232-central-scene-supported-report-command) + +Table 26: Central Scene Supported Report::Supported Key Attributes + +| Byte:Bit | Supported Key Attributes | +| --- | --- | +| 1:0 | Key Pressed 1 time | +| 1:1 | Key Released. | +| 1:2 | Key Held Down. | +| 1:3 | Key Pressed 2 times | +| 1:4 | Key Pressed 3 times | +| 1:5 | Key Pressed 4 times | +| 1:6 | Key Pressed 5 times | +| 1:7 | Reserved | + +If the Key Released attribute is supported, the Key Held Down attribute MUST also be supported. If the Key Held Down attribute is supported, the Key Released attribute MUST also be supported. + +## 4.23.3 Central Scene Notification Command + +This command is used to advertise one or more key events. + +If the device implements Z-Wave Plus Lifeline support is implemented, the device MUST send the Central Scene Notification Command to the actual Lifeline targets. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE NOTIFICATION _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Reserved | | | | | Key Attributes | | | +| Scene Number | | | | | | | | + +Fields not described below remain unchanged from version 1. + +Key Attributes (3 bits) + +This field advertises one or more events detected by the key. The field MUST be encoded according to [Table 27](04.23-central-scene-command-class-version-2-obsoleted.md#4233-central-scene-notification-command) + +Table 27: Central Scene Notification::Key Attributes + +| Key Attribute | Description | Version | +| --- | --- | --- | +| 0x00 | Key Pressed 1 time | 1 | +| 0x01 | Key Released | 1 | +| 0x02 | Key Held Down | 1 | +| 0x03 | Key Pressed 2 times | 2 | +| 0x04 | Key Pressed 3 times | 2 | +| 0x05 | Key Pressed 4 times | 2 | +| 0x06 | Key Pressed 5 times | 2 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[Notification carrying these Key Attributes MUST comply with Figure 11.](04.23-central-scene-command-class-version-2-obsoleted.md#4233-central-scene-notification-command) + +![Figure 11, Central Scene button press decoding and timer management](assets/img-73381c079f.png) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.17-central-scene-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.24-central-scene-command-class-version-3.md similarity index 55% rename from docs/specs/command-class-specification/04-command-class-definitions/04.17-central-scene-command-class-version-3.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.24-central-scene-command-class-version-3.md index efa5f89..695c13e 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.17-central-scene-command-class-version-3.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.24-central-scene-command-class-version-3.md @@ -1,31 +1,29 @@ -# 4.17 Central Scene Command Class, version 3 +# 4.24 Central Scene Command Class, version 3 -The Central Scene Command Class, version 3 extends version 2 by adding a new mode for the transmission of Key Held Down notifications. This allows a node to send Key Held Down refreshes at a low rate for the duration of the key held down. - -The purpose of this new feature is to provide improved compatibility with FLiRS beaming and network routing. +The Central Scene Command Class, version 3 extends version 2 by adding a new mode for the transmission of Key Held Down notifications. This allows a node to send Key Held Down refreshes at a low rate for the duration of the key held down. The purpose of this new feature is to provide improved compatibility with FLiRS beaming and network routing. Central Scene Command Class, version 3 introduces three new commands to allow a controller to query and configure node capabilities. - [Central Scene Configuration Set Command](04.17-central-scene-command-class-version-3.md#4172-central-scene-configuration-set-command)  [Central Scene Configuration Get Command](04.17-central-scene-command-class-version-3.md#4173-central-scene-configuration-get-command)  [Central Scene Configuration Report Command](04.17-central-scene-command-class-version-3.md#4174-central-scene-configuration-report-command) + [Central Scene Configuration Set Command](04.24-central-scene-command-class-version-3.md#4242-central-scene-configuration-set-command)  [Central Scene Configuration Get Command](04.24-central-scene-command-class-version-3.md#4243-central-scene-configuration-get-command)  [Central Scene Configuration Report Command](04.24-central-scene-command-class-version-3.md#4244-central-scene-configuration-report-command) Central Scene Command Class, version 3 extends the following commands for a scene launching node to advertise its optional capabilities. - [Central Scene Supported Report Command](04.17-central-scene-command-class-version-3.md#4176-central-scene-supported-report-command)  [Central Scene Notification Command](04.17-central-scene-command-class-version-3.md#4177-central-scene-notification-command) + [Central Scene Supported Report Command](04.24-central-scene-command-class-version-3.md#4246-central-scene-supported-report-command)  [Central Scene Notification Command](04.24-central-scene-command-class-version-3.md#4247-central-scene-notification-command) -## 4.17.1 Compatibility considerations +## 4.24.1 Compatibility considerations A scene controller SHOULD NOT try to detect multiple key presses from the reception of successive key press notifications in any single or multiple key attribute combination. FLiRS beaming, collisions or routing may add delays between messages and render the timing between notifications unreliable. Version 1 and version 2 required to send Key Held Down notifications commands every 200ms. It has been found that this requirement cannot be observed when the network is using FLiRS beaming or routing. Further, issuing the 200ms refreshes also degrades general network reliability and availability. -Version 3 introduces the Slow Refresh Capability, which allows a node to send refreshes every [55 seconds instead of 200ms. For details about the Slow Refresh capability, refer to 4.17.7.](04.17-central-scene-command-class-version-3.md#4177-central-scene-notification-command) +Version 3 introduces the Slow Refresh Capability, which allows a node to send refreshes every [55 seconds instead of 200ms. For details about the Slow Refresh capability, refer to 4.24.7.](04.24-central-scene-command-class-version-3.md#4247-central-scene-notification-command) In order to ensure a functioning network, the Slow Refresh capability MUST be enabled by default after inclusion. @@ -35,31 +33,39 @@ However, it has been found that there exist nodes supporting version 1 or versio A controller SHOULD apply an adaptive approach based on the reception of the Key Released Notification. Initially, the controller SHOULD time out if not receiving any Key Held Down Notification refresh after 400ms and consider this to be a Key Up Notification. If, however, the controller subsequently receives a Key Released Notification, the controller SHOULD consider the sending node to be operating with the Slow Refresh capability enabled. -### 4.17.1.1 Multi Channel considerations +### 4.24.1.1 Central Scene Configuration commands support + +If a node supports Slow Refresh Capability (that allows a node to send refresh every 55 seconds instead of 200 ms), may not allow users to turn off the ‘Slow Refresh’ functionality. If this is the case, the node MAY choose to ignore the Central Scene Configuration Set Command with ‘Slow Refresh’ bit set to zero. + +If the node chooses to ignore the Central Scene Configuration Set Command, the node MUST return an application Reject Request Command when receiving Central Scene Configuration Set command (if it received without Supervision encapsulation). + +### 4.24.1.2 Multi Channel considerations Multi Channel End Points SHOULD NOT support the Central Scene Command Class. -## 4.17.2 Central Scene Configuration Set Command +## 4.24.2 Central Scene Configuration Set Command This command is used to configure the use of optional node capabilities for scene notifications. -| | 7 | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE CONFIGURATION SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Slow Refresh | | Reserved | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE CONFIGURATION SET _ _ _ | | | | | | | | +| Slow Refresh | Reserved | | | | | | | Slow Refresh (1 bit) This flag is used to configure the use of the Slow Refresh capability. -The value 1 MUST indicate that the scene launching node MUST use Slow Refresh. The value 0 MUST indicate that the scene launching node MUST NOT use Slow Refresh. +The value 1 MUST indicate that the scene launching node MUST use Slow Refresh. + +The value 0 MUST indicate that the scene launching node MUST NOT use Slow Refresh. Reserved This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. -## 4.17.3 Central Scene Configuration Get Command +## 4.24.3 Central Scene Configuration Get Command This command is used to query the configuration of optional node capabilities for scene notifications. @@ -67,20 +73,20 @@ The Central Scene Configuration Report Command MUST be returned in response to t This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE CONFIGURATION GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE CONFIGURATION GET _ _ _ | | | | | | | | -## 4.17.4 Central Scene Configuration Report Command +## 4.24.4 Central Scene Configuration Report Command This command is used to advertise the configuration of optional node capabilities for scene notifications. -| | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | -| Command = CENTRAL SCENE CONFIGURATION REPORT _ _ _ | | | | | | | | | | | -| Slow Refresh | | Reserved | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE CONFIGURATION REPORT _ _ _ | | | | | | | | +| Slow Refresh | Reserved | | | | | | | Slow Refresh (1 bit) @@ -92,7 +98,7 @@ Reserved This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. -## 4.17.5 Central Scene Supported Get Command +## 4.24.5 Central Scene Supported Get Command This command is used to request the maximum number of scenes that this device supports. @@ -100,28 +106,28 @@ The Central Scene Supported Report Command MUST be returned in response to this This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | -| Command = CENTRAL SCENE SUPPORTED GET _ _ _ | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE SUPPORTED GET _ _ _ | | | | | | | | -## 4.17.6 Central Scene Supported Report Command +## 4.24.6 Central Scene Supported Report Command This command is used to report the maximum number of supported scenes and the Key Attributes supported for each scene. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Scenes | | | | | | | | | | | | | | | | | | | | | | | | -| Slow Refresh Support | | | Reserved | | | | | | | | | | | | Number of Bit Mask Bytes | | | | | | Identical | | | -| | Supported Key Attributes for Scene 1 – Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Key Attributes for Scene 1 – Byte N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Key Attributes for Scene M – Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Key Attributes for Scene M – Byte N | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE SUPPORTED REPORT _ _ _ | | | | | | | | +| Supported Scenes | | | | | | | | +| Slow Refresh Support | Reserved | | | | Number of Bit Mask Bytes | | Identical | +| Supported Key Attributes for Scene 1 – Byte 1 | | | | | | | | +| … | | | | | | | | +| Supported Key Attributes for Scene 1 – Byte N | | | | | | | | +| … | | | | | | | | +| Supported Key Attributes for Scene M – Byte 1 | | | | | | | | +| … | | | | | | | | +| Supported Key Attributes for Scene M – Byte N | | | | | | | | All fields not described below are the same as in version 2. @@ -131,27 +137,29 @@ This field indicates whether the node supports the Slow Refresh capability. The value 1 MUST indicate that the node supports the Slow Refresh capability. The value 0 MUST indicate that the node does not support the Slow Refresh capability. -## 4.17.7 Central Scene Notification Command +## 4.24.7 Central Scene Notification Command This command is used to advertise a key event. If the device implements Z-Wave Plus Lifeline support, the device MUST send the Central Scene Notification Command to the actual Lifeline targets. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Slow Refresh | | | Reserved | | | | | | | | | | | | Key Attribute | | | | | | | | | -| Scene Number | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | +| Command = CENTRAL SCENE NOTIFICATION _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Slow Refresh | Reserved | | | | Key Attribute | | | +| Scene Number | | | | | | | | + +All fields not described below are the same as in version 2. -All fields not described below are the same as in version 2. Slow Refresh (1 bit) +Slow Refresh (1 bit) -This flag is used to advertise if the node is sending Key Held Down notifications at a slow rate. A sending node MUST always set this field according to the configured mode. A receiving node MUST ignore this field if the command is not carrying the Key Held Down key attribute. +This flag is used to advertise if the node is sending Key Held Down notifications at a slow rate. A sending CC:005B.03.03.11.002 node MUST always set this field according to the configured mode. A receiving node MUST ignore this field if the command is not carrying the Key Held Down key attribute. If the Slow Refresh field is 0: - A new Key Held Down notification MUST be sent every 200ms until the key is released.  The Sequence Number field MUST be updated at each notification transmission.  If not receiving a new Key Held Down notification within 400ms, a controlling node SHOULD use [an adaptive timeout approach as described in 4.17.1.](04.17-central-scene-command-class-version-3.md#4171-compatibility-considerations) + A new Key Held Down notification SHOULD be sent every 200ms until the key is released.  The Sequence Number field MUST be updated at each notification transmission.  If not receiving a new Key Held Down notification within 400ms, a controlling node SHOULD use [an adaptive timeout approach as described in 4.24.1.](04.24-central-scene-command-class-version-3.md#4241-compatibility-considerations) If the Slow Refresh field is 1: diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.25-climate-control-schedule-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.25-climate-control-schedule-command-class-version-1-deprecated.md new file mode 100644 index 0000000..1a38877 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.25-climate-control-schedule-command-class-version-1-deprecated.md @@ -0,0 +1,234 @@ + +# 4.25 Climate Control Schedule Command Class, version 1 [DEPRECATED] + +THIS COMMAND CLASS HAS BEEN DEPRECATED + +A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Schedule Command Class. If implementing this command class, it is RECOMMENDED that the Schedule Command Class is also implemented. + +The Climate Control Schedule Command Class allows devices to exchange schedules and overrides, which specify when to perform a setback on the setpoint. + +Note: The setpoint is the temperature a device will try to maintain. The setback is a deviation from the setpoint. When a setback is in use the device will apply the setback to the setpoint, resulting in a different temperature. When using schedules and overrides it is possible to define several setbacks occurring at specific times. + +Schedules are exchanged using the Schedule Commands. Overrides of schedules are exchanged using the Schedule Override Commands. Detection of updated schedules is done using the Schedule Changed Commands. + +The Climate Control Schedule uses the Schedule State type to define each setback. The Schedule State type has the following format: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Schedule State | | | | | | | | + +Schedule State (8 bits) + +The values are as follows: + +| Schedule State | | Description | +| --- | --- | --- | +| Hexadecimal | Decimal | | +| 0x80 … 0xFF 0x00 0x01 … 0x78 | -128 … -1 0 1 … 120 | The setback in 1/10 degrees (Kelvin) Example: 0 = 0 degrees setback 1 = 0.1 degrees is added to the setpoint 2 = 0.2 degrees is added to the setpoint -1 = 0.1 degrees is subtracted from the setpoint -2 = 0.2 degrees is subtracted from the setpoint | +| 0x79 | 121 | Frost Protection | +| 0x7A | 122 | Energy Saving Mode | +| 0x7B – 0x7E | 123 – 126 | Reserved | +| 0x7F | 127 | Unused State | + +When converting between Celsius and Fahrenheit proper rounding MUST be applied with at least two decimals in the internal calculations of a device to avoid rounding errors. + +When displaying converted Fahrenheit values it is RECOMMENDED that the displayed value is rounded to nearest quarter of a degree. + +## 4.25.1 Schedule Set Command + +This command is used to set the climate control schedule in a device for a specific weekday. A climate control schedule defines when to use a setback on the setpoint in a device. A schedule can hold a maximum of 9 switchpoints. A switchpoint defines one setback from the current setpoint. + +The entire list of switchpoints in the Command MUST be ordered by time, ascending from 00:00 towards 23:59. Switchpoints which have a Schedule State set to “Unused” MUST be placed last. Duplicates MUST NOT be allowed for Switchpoints which have a Schedule State different from “Unused”. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE SET _ | | | | | | | | +| Reserved | | | | | Weekday | | | +| Switchpoint 0 Byte 1 | | | | | | | | +| Switchpoint 0 Byte 2 | | | | | | | | +| Switchpoint 0 Byte 3 | | | | | | | | +| … | | | | | | | | +| Switchpoint 8 Byte 1 | | | | | | | | +| Switchpoint 8 Byte 2 | | | | | | | | +| Switchpoint 8 Byte 3 | | | | | | | | + +Weekday (3 bits) + +[This field MUST be encoded according to Table 28.](04.25-climate-control-schedule-command-class-version-1-deprecated.md#4251-schedule-set-command) + +Table 28, Climate Control Schedule Set::Weekday encoding + +| Value | Description | +| --- | --- | +| 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 | Reserved Monday Tuesday Wednesday Thursday Friday Saturday Sunday | + +Switchpoint (9*24 bits) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Reserved | | | Hour | | | | | +| Reserved | | Minute | | | | | | +| Schedule State | | | | | | | | + +Hour (5 bits) + +This field is used to specify the hour of the of the actual switchpoint. This field MUST be in the range 0..23. + +Minute (6 bits) + +This field is used to specifiy the minute of the actual switchpoint. This field MUST be in the range 0..59. + +Schedule State (8 bits) + +[Schedule State uses the Schedule State type format, see section 4.25. If Schedule State has the value of](04.25-climate-control-schedule-command-class-version-1-deprecated.md#425-climate-control-schedule-command-class-version-1-deprecated) “Unused”, the Hour and Minute field MUST be ignored. Once a Schedule State of “Unused” is encountered, the parsing of switchpoints must stop. + +## 4.25.2 Schedule Get Command + +This command is used to request the climate control schedule in a device for a specific weekday. + +The Schedule Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE GET _ | | | | | | | | +| Reserved | | | | | Weekday | | | + +[For fields’ description, refer to 4.25.1 Schedule Set Command](04.25-climate-control-schedule-command-class-version-1-deprecated.md#4251-schedule-set-command) + +## 4.25.3 Schedule Report Command + +This command is used to report the climate control schedule in a device for a specific weekday. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE REPORT _ | | | | | | | | +| Reserved | | | | | Weekday | | | +| Switchpoint 0 Byte 1 | | | | | | | | +| Switchpoint 0 Byte 2 | | | | | | | | +| Switchpoint 0 Byte 3 | | | | | | | | +| … | | | | | | | | +| Switchpoint 8 Byte 1 | | | | | | | | +| Switchpoint 8 Byte 2 | | | | | | | | +| Switchpoint 8 Byte 3 | | | | | | | | + +[For fields’ description, refer to 4.25.1 Schedule Set Command](04.25-climate-control-schedule-command-class-version-1-deprecated.md#4251-schedule-set-command) + +## 4.25.4 Schedule Changed Get Command + +This command is used to check if the climate control schedule has changed. + +The Schedule Changed Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE CHANGED GET _ _ | | | | | | | | + +## 4.25.5 Schedule Changed Report Command + +This command is used to report if the climate control schedule has changed. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE CHANGED REPORT _ _ | | | | | | | | +| ChangeCounter | | | | | | | | + +ChangeCounter (8 bits) + +The ChangeCounter is a timestamp for a climate control schedule and it is kept in devices which exchange climate control schedules. + +One device holds a climate control schedule and other devices uses this climate control schedule. Whenever the climate control schedule changes, the device MUST update its ChangeCounter, and the other devices MUST regularly use the Schedule Changed Get Command on the device which holds the Climate Control Schedule to see if the ChangeCounter is different from last time – indicating a change in a climate control schedule. + +The possible values are: + +| Value | Description | +| --- | --- | +| 0x00 | The climate control schedule change mechanism is temporarily disabled by the override function. | +| 0x01..0xFF | The climate control schedule change mechanism is enabled. ChangeCounter is incremented by one every time climate control schedule changes. When ChangeCounter eventually reach 0xFF, the next increment MUST rollover to 0x01. | + +When a device is fresh and has no climate control schedule it MUST retrieve a climate control schedule using the Schedule Get Command and it MUST also use the Schedule Changed Get to get the first copy of the current ChangeCounter, thus avoiding getting the climate control schedule initially twice. + +When a device is awake after sleep mode it SHOULD use this Command to detect if the schedule has been changed. + +## 4.25.6 Schedule Override Set Command + +This command is used to set the override in a device. + +The purpose of an override is to inform a device to ignore its current climate control schedule and assume the setting provided by the Override Type and Override State fields. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE OVERRIDE SET _ _ | | | | | | | | +| Reserved | | | | | | Override Type | | +| Override State | | | | | | | | + +Override Type (2 bits) + +[This field MUST be encoded according to Table 29.](04.25-climate-control-schedule-command-class-version-1-deprecated.md#4256-schedule-override-set-command) + +Table 29, Climate Control Schedule Override Set::Override Type encoding + +| Value | Description | +| --- | --- | +| 0x00 0x01 0x02 0x03 | No override Temporary override Permanent override Reserved | + +Note: The difference between a temporary and a permanent override is that a temporary override only overrides the current switchpoint in the climate control schedule. + +Both temporary and permanent overrides MAY be cancelled in the device, which receives the SCHEDULE_OVERRIDE_SET. This cancellation MUST be notified in an unsolicited SCHEDULE_OVERRIDE_REPORT as specified in the following sequence diagram: + +Controller Thermostat + +Figure 12, Sequence diagram for cancellation of a Schedule Override Set + +Override State (8 bits) + +[The Override State uses the Schedule State type format, see section 4.25](04.25-climate-control-schedule-command-class-version-1-deprecated.md#425-climate-control-schedule-command-class-version-1-deprecated) + +## 4.25.7 Schedule Override Get Command + +This command is used to request the override, currently in use in a device. + +The Schedule Override Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE OVERRIDE GET _ _ | | | | | | | | + +## 4.25.8 Schedule Override Report Command + +The Schedule Override Report Command is used to report the override, currently in use in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | +| Command = SCHEDULE OVERRIDE REPORT _ _ | | | | | | | | +| Reserved | | | | | | Override Type | | +| Override State | | | | | | | | + +Override Type (2 bits) + +[This field MUST be encoded according to Table 29.](04.25-climate-control-schedule-command-class-version-1-deprecated.md#4256-schedule-override-set-command) + +Both temporary and permanent overrides MAY be cancelled in the device, which receives the SCHEDULE_OVERRIDE_SET. This cancellation MUST be notified in an unsolicited [SCHEDULE_OVERRIDE_REPORT as shown on figure in section 4.25.6](04.25-climate-control-schedule-command-class-version-1-deprecated.md#4256-schedule-override-set-command) + +Override State (8 bits) + +[The Override State uses the Schedule State type format, see section 4.25](04.25-climate-control-schedule-command-class-version-1-deprecated.md#425-climate-control-schedule-command-class-version-1-deprecated) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.26-clock-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.26-clock-command-class-version-1.md new file mode 100644 index 0000000..f7706df --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.26-clock-command-class-version-1.md @@ -0,0 +1,98 @@ + +# 4.26 Clock Command Class, version 1 + +The Clock Command Class is used to implement a simple clock functionality. + +## 1.1.1 Interoperability considerations + +A controlling node SHOULD configure the current time and weekday in a supporting node during node commissioning. It has been found that some version 1 nodes issue Clock Get Command to controllers in order to learn the current time and use the returned Clock Report Command as a Clock Set Command. + +A supporting node SHOULD NOT learn the current time with a Clock Get Command. + +A node SHOULD control the Time Command Class to read the current time from supporting nodes (time servers) or support the Clock Command Class and wait to be set the current time by a controlling node. + +A Z-Wave Plus node SHOULD issue a Clock Report Command via the Lifeline Association Group if they suspect to have inaccurate time and/or weekdays (e.g. after battery removal). + +A controlling node SHOULD compare the received time and weekday with its current time and set the time again at the supporting node if a deviation is observed (e.g. different weekday or more than a minute difference) + +## 4.26.1 Multi Channel Considerations + +Multi Channel End Points SHOULD NOT support the Clock Command Class. + +## 4.26.2 Clock Set Command + +This command is used to set the current time in a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLOCK _ _ | | | | | | | | +| Command = CLOCK SET _ | | | | | | | | +| Weekday | | | Hour | | | | | +| Minute | | | | | | | | + +Weekday (3 bits) + +This field is used to indicate the current weekday that the receiving node MUST assume. + +[This field MUST comply with Table 30](04.26-clock-command-class-version-1.md#4262-clock-set-command) Table 30, Clock Set Command::Weekday encoding + +| Value | Description | +| --- | --- | +| 0x00 | Unused/unknown This value may be specified if the weekday is not used or not known | +| 0x01 | Monday | +| 0x02 | Tuesday | +| 0x03 | Wednesday | +| 0x04 | Thursday | +| 0x05 | Friday | +| 0x06 | Saturday | +| 0x07 | Sunday | + +Hour (5 bits) + +This field is used to indicate the hour of the current time that the receiving node MUST assume. + +This field MUST be in the range 0..23. + +Minute (8 bits) + +This field is used to indicate the minute of the current time that the receiving node MUST assume. + +This field MUST be in the range 0..59. + +A sending node knowing the current time with seconds precision SHOULD round its current time to the nearest minute when sending this command. + +## 1.1.2 Clock Get Command + +This command is used to request the current time set at a supporting node. + +[The Clock Report Command MUST be returned in response to this command.](04.26-clock-command-class-version-1.md#113-clock-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLOCK _ _ | | | | | | | | +| Command = CLOCK GET _ | | | | | | | | + +## 1.1.3 Clock Report Command + +This command is used to advertise the current time set at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CLOCK _ _ | | | | | | | | +| Command = CLOCK REPORT _ | | | | | | | | +| Weekday | | | Hour | | | | | +| Minute | | | | | | | | + +[For fields’ description, refer to Clock Set Command](04.26-clock-command-class-version-1.md#4262-clock-set-command) + +[A sending node MUST comply with fields’ description from Clock Set Command](04.26-clock-command-class-version-1.md#4262-clock-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.27-color-switch-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.27-color-switch-command-class-version-1.md new file mode 100644 index 0000000..224f6e2 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.27-color-switch-command-class-version-1.md @@ -0,0 +1,234 @@ + +# 4.27 Color Switch Command Class, version 1 + +The Color Switch Command Class is used to control color capable devices. + +The Color Switch Command Class manipulates the color components of a device. Each color component is scaled by the brightness level previously set by a Multilevel Switch Set, Binary Switch Set or Basic Set Command. + +[The Color Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 4.27.1 Compatibility considerations + +The Color Switch Command Class, version 1 was previously named the Color Control Command Class, version 1. The Color Switch Command Class, version 1 is binary compatible with the Color Control Command Class, version 1. + +### 4.27.1.1 Command Class dependencies + +Nodes supporting the Color Switch Command Class, version 1 MUST support one of the following command classes in order to control the color brightness: + + Multilevel Switch Command Class, version 2  Binary Switch Command Cass, version 2. + +## 4.27.2 Interoperability considerations + +The Color Switch Command Class MUST be treated as a separate Command Class. + +Basic and Binary/Multilevel Switch Command Class commands MUST NOT affect color component levels controlled by the Color Switch Command Class. + +The Color Switch Command Class commands MUST NOT affect the brightness level controlled by Basic or Binary/Multilevel Switch Command Classes. + +If the brightness level is requested via a Basic Get or Binary/Multilevel Switch Get command, the reported value MUST reflect the brightness level previously set via Basic or Multilevel Switch commands. + +If a color component is requested via the Color Switch Get command, the reported value MUST reflect the color component level previously set via Color Switch commands. + +An implementation MUST scale color component levels by the brightness level . Thus, to achieve a resulting light level of 100% for a given color component, the color component level must be set to 100% (via the Color Switch Command Class) and the brightness level must be set to 100% (via Basic or Multilevel Switch Command Class). + +A controlling device SHOULD specify the highest possible color component levels of a given color tone to achieve the highest light yield when scaled by the brightness level. + +The controlling device MAY however limit color component levels to achieve the same brightness for blended color tones as for pure colors. For this reason, a supporting device MUST NOT normalize color CC:0033.01.00.31.007 components manipulated by the Color Switch Command Class. Likewise, a supporting device implementing indexed colors should reduce its internal color component levels for blended colors to achieve the same brightness for all color tones. + +## 4.27.3 Color Switch Supported Get Command + +This command is used to request the supported color components of a device. + +The Color Switch Supported Report command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR SUPPORTED GET _ _ _ | | | | | | | | + +## 4.27.4 Color Switch Supported Report Command + +This command is used to report the supported color components of a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR SUPPORTED REPORT _ _ _ | | | | | | | | +| Color Component Mask 1 | | | | | | | | +| Color Component Mask 2 | | | | | | | | + +Color Component Mask (variable length) + +The Color Component Mask field MUST advertise the color components supported by the device. + + Bit 0 in Bit Mask 1 indicates if color component 0 is supported  Bit 1 in Bit Mask 1 indicates if color component 1 is supported  … + +[For the definition of Color Component IDs, refer to section 4.27.7.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +## 4.27.5 Color Switch Get Command + +This command is used to request the status of a specified color component. + +The Color Switch Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR GET _ _ | | | | | | | | +| Color Component ID | | | | | | | | + +Color Component ID (8 bits) + +This field MUST specify the color component for which the status is requested. + +[For the definition of Color Component IDs, refer to section 4.27.7.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +## 4.27.6 Color Switch Report Command + +This command is used to advertise the status of a color component. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR REPORT _ _ | | | | | | | | +| Color Component ID | | | | | | | | +| Value | | | | | | | | + +Color Component ID (8 bits) + +This field MUST advertise the color component covered by this report. + +[For the definition of Color Component IDs, refer to section 4.27.7.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +Value (8 bits) + +The Value field MUST advertise the value of the color component identified by the Color Component ID. + +The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. + +A controlling device MUST NOT assume that the Value is identical to a value previously issued with a Set command; not even when a transition has ended. + +## 4.27.7 Color Switch Set Command + +This command is used to control one or more color components in a device. + +[Color component levels MUST be scaled by the brightness level. Refer to 4.27.2.](04.27-color-switch-command-class-version-1.md#4272-interoperability-considerations) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR SET _ _ | | | | | | | | +| Reserved | | | Color Component Count | | | | | +| Color Component ID 1 | | | | | | | | +| Value 1 | | | | | | | | +| … | | | | | | | | +| Color Component ID N | | | | | | | | +| Value N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Color Component Count (5 bits) + +This field MUST specify the number of (Color Component ID, Value) datasets contained in the Color Switch Set command. Color Component ID (8 bits) + +This field MUST specify the color component to receive a new value. This field MUST be encoded [according to Table 31.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +Table 31, Color Switch Component IDs + +| Component ID | Label | Value range | +| --- | --- | --- | +| 0 | Warm White | 0x00..0xFF | +| 1 | Cold White | 0x00..0xFF | +| 2 | Red | 0x00..0xFF | +| 3 | Green | 0x00..0xFF | +| 4 | Blue | 0x00..0xFF | +| 5 | Amber (for 6ch Color mixing) | 0x00..0xFF | +| 6 | Cyan (for 6ch Color mixing) | 0x00..0xFF | +| 7 | Purple (for 6ch Color mixing) | 0x00..0xFF | +| 8 | Indexed Color [OBSOLETED] A supporting node MUST NOT support indexed colors | 0x00 – 0xFF: Color Index 0- 255 | + +CC:0033.01.05.11.008 A supporting node MUST NOT support indexed + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be CC:0033.01.05.11.005 ignored by a receiving node. + +Value (8 bits) + +This field MUST specify the value of the color component identified by the Color Component ID field. + +Unlike other actuator control command classes, the Value used by the Color Switch Command Class spans the entire range from 0x00 to 0xFF. Thus, except for the Indexed Color, the value 0x00 MUST yield to 0% and 0xFF MUST yield to 100% of the actual color component. + +## 4.27.8 Color Switch Start Level Change Command + +This command is used to initiate a transition of one color component to a new level. + +A receiving device MUST initiate the transition to a new value for the specified Color Component ID. + +The device MAY apply a non-zero duration to the transition from one value to a new value. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR START LEVEL CHANGE _ _ _ _ | | | | | | | | +| Reserved | Up/ Down | Ignore Start Level | Reserved | | | | | +| Color Component ID | | | | | | | | +| Start Level | | | | | | | | + +Up/Down (1 bit) + +This field MUST specify the direction of the level change. + +If the Up/Down bit is set to 0 the level change MUST be increasing. If the Up/Down bit is set to 1 the level change MUST be decreasing. + +Ignore Start Level (1 bit) + +A receiving device SHOULD respect the Start Level if the Ignore Start Level bit is 0. A receiving device MUST ignore the Start Level if the Ignore Start Level bit is 1. A controlling device SHOULD set the Ignore Start Level bit to 1. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Color Component ID (8 bits) + +This field MUST specify the color component to start a transition. + +[For the definition of Color Component IDs, refer to section 4.27.7.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +Start Level (8 bits) + +The Start Level field MUST specify the initial value of the level change. + +## 4.27.9 Color Switch Stop Level Change Command + +[This command is used to stop an ongoing transition initiated by a Color Switch Start Level Change Command.](04.27-color-switch-command-class-version-1.md#4278-color-switch-start-level-change-command) + +A receiving device MUST stop the transition if the specified Color Component ID is currently in transition to a new value. + +A receiving device MUST NOT stop ongoing transitions for other Color Component IDs than the one specified. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR STOP LEVEL CHANGE _ _ _ _ | | | | | | | | +| Color Component ID | | | | | | | | + +Color Component ID (8 bits) + +This field MUST specify the color component to stop a transition. + +[For the definition of Color Component IDs, refer to section 4.27.7.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.28-color-switch-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.28-color-switch-command-class-version-2.md new file mode 100644 index 0000000..807b084 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.28-color-switch-command-class-version-2.md @@ -0,0 +1,72 @@ + +# 4.28 Color Switch Command Class, version 2 + +The Color Switch Command Class, version 2 is used to control color capable devices. + +[The Color Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 4.28.1 Compatibility considerations + +A device supporting Color Switch Command Class, version 2 MUST support Color Switch Command Class, version 1. + +Version 2 adds a duration parameter to the Color Switch Set Command. + +Commands not described in this version remain unchanged from version 1. + +### 4.28.1.1 Command Class dependencies + +Nodes supporting the Color Switch Command Class, version 2 MUST support one of the following command classes in order to control the color brightness: + + Multilevel Switch Command Class, version 2  Binary Switch Command Cass, version 2. + +## 4.28.2 Interoperability considerations + +[Refer to 4.27.2.](04.27-color-switch-command-class-version-1.md#4272-interoperability-considerations) + +## 4.28.3 Color Switch Set Command + +This command is used to control one or more color components in a device. + +[Color component levels MUST be scaled by the brightness level. Refer to 4.27.2.](04.27-color-switch-command-class-version-1.md#4272-interoperability-considerations) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR SET _ _ | | | | | | | | +| Reserved | | | Color Component Count | | | | | +| Color Component ID 1 | | | | | | | | +| Value 1 | | | | | | | | +| ... | | | | | | | | +| Color Component ID N | | | | | | | | +| Value N | | | | | | | | +| Duration | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Color Component Count (5 bits) + +This field MUST specify the number of (Color Component ID, Value) datasets contained in the Color Switch Set command. + +Color Component ID (8 bits) + +This field MUST specify the color component to receive a new value. + +[For the definition of Color Component IDs, refer to section 4.27.7.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +Value (8 bits) + +This field MUST specify the value of the color component identified by the Component ID field. + +[Refer to section Table 31.](04.27-color-switch-command-class-version-1.md#4277-color-switch-set-command) + +Duration (8 bits) + +The Duration field MUST specify the time that the transition should take from the current value to the new target value. + +A supporting device SHOULD respect the specified Duration value. [The encoding of the Duration field MUST be according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) The factory default duration SHOULD be the same as the duration used for the Color Switch Set command, version 1. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.21-color-switch-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.29-color-switch-command-class-version-3.md similarity index 52% rename from docs/specs/command-class-specification/04-command-class-definitions/04.21-color-switch-command-class-version-3.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.29-color-switch-command-class-version-3.md index b2f86cb..385970e 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.21-color-switch-command-class-version-3.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.29-color-switch-command-class-version-3.md @@ -1,11 +1,11 @@ -# 4.21 Color Switch Command Class, version 3 +# 4.29 Color Switch Command Class, version 3 The Color Switch Command Class is used to control color capable devices. @@ -13,7 +13,7 @@ The Color Switch Command Class manipulates the color components of a device. Eac [The Color Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) -## 4.21.1 Compatibility considerations +## 4.29.1 Compatibility considerations A node supporting Color Switch Command Class, version 3 MUST support the Color Switch Command Class, version 2. @@ -23,34 +23,32 @@ Commands not described in this version remain unchanged from version 2. A node receiving a version 1 Color Switch Set command MAY apply a factory default duration to the transition. -### 4.21.1.1 Command Class dependencies +### 4.29.1.1 Command Class dependencies Nodes supporting the Color Switch Command Class, version 3 MUST support one of the following Command Classes in order to control the color brightness:  Multilevel Switch Command Class, version 4  Binary Switch Command Cass, version 2. -## 4.21.2 Interoperability considerations +## 4.29.2 Interoperability considerations -[Refer to 4.19.2](04.19-color-switch-command-class-version-1.md#4192-interoperability-considerations) +[Refer to 4.27.2](04.27-color-switch-command-class-version-1.md#4272-interoperability-considerations) -## 4.21.3 Color Switch Report Command +## 4.29.3 Color Switch Report Command This command is used to advertise the status of a color component. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Color Component ID | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR REPORT _ _ | | | | | | | | +| Color Component ID | | | | | | | | +| Current Value | | | | | | | | +| Target Value | | | | | | | | +| Duration | | | | | | | | Color Component ID (8 bits) -This field MUST advertise the color component covered by this report. - -Current Value (8 bits) +This field MUST advertise the color component covered by this report. Current Value (8 bits) The Current Value field MUST advertise the current value of the color component identified by the Color Component ID. @@ -64,34 +62,34 @@ The Target Value field MUST advertise the target value of an ongoing transition Refer to the Color Switch Set command for valid values. -If a transition is initiated in an interactive fashion via a local user interface or via a Start Level Change command, the advertised Target Value MUST be 0x00 or 0xFF, depending on the direction. +If a transition is initiated in an interactive fashion via a local user interface or via a Start Level Change CC:0033.03.04.11.004 command, the advertised Target Value MUST be 0x00 or 0xFF, depending on the direction. The Current Value SHOULD be identical to the Target Value when a transition has ended. Duration (8 bits) -The Duration field SHOULD advertise the time needed to reach the Target Value at the actual transition [rate. The encoding of the Duration field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) +The Duration field SHOULD advertise the time needed to reach the Target Value at the actual transition CC:0033.03.04.11.005 [rate. The encoding of the Duration field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) -## 4.21.4 Color Switch Start Level Change Command +## 4.29.4 Color Switch Start Level Change Command This command is used to initiate a transition of one color component to a new value. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR START LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Res | | | Up/ Down | | | Ignore Start Level | | | Reserved | | | | | | | | | | | | | | | -| Color Component ID | | | | | | | | | | | | | | | | | | | | | | | | -| Start Level | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | +| Command = SWITCH COLOR START LEVEL CHANGE _ _ _ _ | | | | | | | | +| Res | Up/ Down | Ignore Start Level | Reserved | | | | | +| Color Component ID | | | | | | | | +| Start Level | | | | | | | | +| Duration | | | | | | | | Up/Down (1 bit) -This field MUST specify the direction of the level change. +This field MUST specify the direction of the level change. If the Up/Down bit is set to 0 the level change MUST be increasing. If the Up/Down bit is set to 1 the level change MUST be decreasing. Ignore Start Level (1 bit) -If the Up/Down bit is set to 0 the level change MUST be increasing. If the Up/Down bit is set to 1 the level change MUST be decreasing. Ignore Start Level (1 bit) +A receiving device SHOULD respect the Start Level if the Ignore Start Level bit is 0. -A receiving device SHOULD respect the Start Level if the Ignore Start Level bit is 0. A receiving device MUST ignore the Start Level if the Ignore Start Level bit is 1. +A receiving device MUST ignore the Start Level if the Ignore Start Level bit is 1. A controlling device SHOULD set the Ignore Start Level bit to 1. @@ -109,6 +107,8 @@ The Start Level field MUST specify the initial value of the level change. Duration (8 bits) -The level change rate MUST be calculated to match a level change from 0x00 to 0xFF during the time specified by the Duration field. A supporting device SHOULD respect the specified Duration value. +The level change rate MUST be calculated to match a level change from 0x00 to 0xFF during the time specified by the Duration field. + +A supporting device SHOULD respect the specified Duration value. -[For encoding of the Duration value, refer to the Color Switch Set Command.](04.20-color-switch-command-class-version-2.md#4203-color-switch-set-command) +[For encoding of the Duration value, refer to the Color Switch Set Command.](04.28-color-switch-command-class-version-2.md#4283-color-switch-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.30-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.30-configuration-command-class-version-1.md new file mode 100644 index 0000000..bcb7341 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.30-configuration-command-class-version-1.md @@ -0,0 +1,120 @@ + +# 4.30 Configuration Command Class, version 1 + +The Configuration Command Class allows product specific configuration parameters to be changed. One example could be the default dimming rate of a light dimmer. + +Configuration parameters MUST be specified in the product documentation. Configuration parameters CC:0070.01.00.11.002 accessed via this command class MUST NOT replace similar commands provided by other existing Command Classes. + +A device MUST be able to operate with default factory configuration parameter values. + +It is RECOMMENDED that configuration parameters can be manipulated via a local user interface. CC:0070.01.00.12.002 It is RECOMMENDED that default factory configuration parameter values can be restored via a local user interface. + +## 4.30.1 Compatibility considerations + +### 4.30.1.1 “Default” flag + +Earlier text revisions of the Configuration Command Class, versions 1-3 presented conflicting interpretations of the default field. Controllers should be aware that nodes with version 3 or less MAY CC:0070.01.00.23.001 reset all configuration parameters to default when receiving a Configuration Set or Configuration Bulk Set Command with the Default bit set to 1. + +A controller SHOULD probe a node in order to discover what behavior it implements. The following steps are RECOMMENDED: + + If the device is version 1- 2, scan the node for available configuration parameters. Else discover the available parameters thanks to the Configuration Properties Get Command.  Determine how the default bit works if the node implements 2 or more parameters + +Step 1: + + One at a time, issue a Configuration Set for a parameter number, and check whether the value can be read back. Try each parameter for 1, 2 and 4 bytes sizes.  Store the discovered parameter list for future use. + +Step 2: + + Choose 2 parameters and issue a Configuration Set with the default bit set to 1 for each parameter.  Read back both parameters value with a Configuration Get.  Try to modify both parameters to non-default values (it is recommended to try the default value ± 1)  Send a Configuration Set for one of parameters with the default bit set to 1.  Read back both parameters and check whether one or both returned to the default value + +## 4.30.2 Configuration Set Command + +The Configuration Set Command is used to set the value of a configuration parameter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION SET _ | | | | | | | | +| Parameter Number | | | | | | | | +| Default | Reserved | | | | Size | | | +| Configuration Value 1 | | | | | | | | +| … | | | | | | | | +| Configuration Value N | | | | | | | | + +Parameter Number (8 bits) + +This field is used to specify the actual configuration parameter. Parameter Numbers MAY be product CC:0070.01.04.12.001 specific. Parameter Numbers SHOULD be assigned in a sequence starting from 1. + +Default (1 bit) + +This field is used to specify if the default value is to be restored for the specified configuration parameter. + +The value 1 MUST indicate that default factory settings must be restored for the specified Parameter Number. In this case, the Configuration Value field MUST be ignored and the receiving node MUST reset CC:0070.01.04.11.002 the specified parameter and SHOULD NOT reset any other parameters. + +The value 0 MUST indicate that the specified Parameter Number must assume the value specified by the Configuration Value field. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Size (3 bits) + +This field is used to specify the size of the actual parameter. The advertised size of a given parameter [MUST always be the same. The value of this field MUST comply with Table 32.](04.30-configuration-command-class-version-1.md#4302-configuration-set-command) Table 32, Configuration Set::Size encoding + +| Size | Size of Value field | +| --- | --- | +| 1 | 8 bit | +| 2 | 16 bit | +| 4 | 32 bit | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Configuration Value (N bytes) + +This field carries the value to be assigned. The size of the field MUST comply with the size advertised by the Size field. + +[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The field Value 1 MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +## 4.30.3 Configuration Get Command + +This command is used to query the value of a configuration parameter. + +The Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION GET _ | | | | | | | | +| Parameter Number | | | | | | | | + +Parameter Number (8 bits) + +This field is used to specify the requested configuration parameter. Parameter Numbers MAY be CC:0070.01.05.12.001 product specific. Parameter Numbers SHOULD be assigned in a sequence starting from 1. + +A node receiving this command for an unsupported parameter SHOULD return a Report advertising the value of the first available parameter in the node. + +## 4.30.4 Configuration Report Command + +This command is used to advertise the actual value of the advertised parameter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION REPORT _ | | | | | | | | +| Parameter Number | | | | | | | | +| Reserved | | | | | Size | | | +| Configuration Value 1 | | | | | | | | +| .. | | | | | | | | +| Configuration Value N | | | | | | | | + +Refer to the Configuration Set Command for parameter details. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.31-configuration-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.31-configuration-command-class-version-2.md new file mode 100644 index 0000000..f709319 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.31-configuration-command-class-version-2.md @@ -0,0 +1,241 @@ + +# 4.31 Configuration Command Class, version 2 + +The Configuration Command Class allows product specific configuration parameters to be changed. One example could be the default dimming rate of a light dimmer. + +Configuration parameters MUST be specified in the product documentation. Configuration parameters accessed via this command class MUST NOT replace similar commands provided by other existing CC:0070.02.00.11.002 Command Classes. + +A device MUST be able to operate with default factory configuration parameter values. + +It is RECOMMENDED that configuration parameters can be manipulated via a local user interface. + +It is RECOMMENDED that default factory configuration parameter values can be restored via a local user interface. + +## 4.31.1 Compatibility considerations + +Configuration Command Class, version 2 extends the addressing space to 65.535 product specific configuration parameters. Further, Configuration Command Class, version 2 makes it possible to set multiple configuration parameters with one Command. + +A device supporting Configuration Command Class, version 2 MUST support Configuration Command Class, version 1. + +### 4.31.1.1 “Default” flag + +[Refer to 4.30.1.1](04.30-configuration-command-class-version-1.md#43011-default-flag) + +## 4.31.2 Interoperability considerations + +Configuration Command Class, version 2 is backwards compatible with Configuration Command Class, version 1. + +Configuration Command Class, version 2 does not extend any existing commands of Configuration CC:0070.02.00.31.001 Command Class, version 1. The 255 parameters that can be addressed by the Configuration Set Command MUST be identical to the first 255 parameters that can be addressed by the (version 2) Configuration Bulk Set Command. + +## 4.31.3 Configuration Set Command + +This Command is used to set the value of a configuration parameter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION SET _ | | | | | | | | +| Parameter Number | | | | | | | | +| Default | Reserved | | | | Size | | | +| Configuration Value 1 | | | | | | | | +| … | | | | | | | | +| Configuration Value N | | | | | | | | + +Parameter Number (8 bits) + +This field is used to specify the actual configuration parameter. Parameter Numbers MAY be product CC:0070.02.04.12.001 specific. Parameter Numbers SHOULD be assigned in a sequence starting from 1. + +Default (1 bit) + +This field is used to specify if the default value is to be restored for the specified configuration parameter. + +The value 1 MUST indicate that default factory settings must be restored for the specified Parameter Number. In this case, the Configuration Value field MUST be ignored and the receiving node MUST reset CC:0070.02.04.11.002 the specified parameter and SHOULD NOT reset any other parameters. + +The value 0 MUST indicate that the specified Parameter Number must assume the value specified by the Configuration Value field. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Size (3 bits) + +This field is used to specify the size of the actual parameter. The advertised size of a given parameter [MUST always be the same. The value of this field MUST comply with Table 32.](04.30-configuration-command-class-version-1.md#4302-configuration-set-command) + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Configuration Value (N bytes) + +This field carries the value to be assigned. The size of the field MUST comply with the size advertised by the Size field. + +[The field MUST carry a signed value. The binary encoding of the signed value MUST comply withTable 10. The field Value 1 MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +## 4.31.4 Configuration Bulk Set Command + +This command is used to set the value of one or more configuration parameters. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION BULK SET _ _ | | | | | | | | +| Parameter Offset 1 (MSB) | | | | | | | | +| Parameter Offset 2 (LSB) | | | | | | | | +| Number of Parameters | | | | | | | | +| Default | Hand- shake | Reserved | | | Size | | | +| Parameter 1 – Configuration Value 1 (MSB) | | | | | | | | +| … | | | | | | | | +| Parameter 1 – Configuration Value N (LSB) | | | | | | | | +| … | | | | | | | | +| Parameter M – Configuration Value 1 (MSB) | | | | | | | | +| … | | | | | | | | +| Parameter M – Configuration Value N (LSB) | | | | | | | | + +Parameter Offset (16 bits) + +This field is used to specify the first parameter in a range of one or more parameters. The first byte MUST carry the most significant byte of the 16 bit value. + +Number of Parameters (8 bits) + +This field is used to specify the number (M) of configuration parameters contained in this command. + +The value of this field MUST be in the range 1..255. + +The advertised parameters MUST be in a consecutive range. For example, Parameter Offset set to 4 and Number of Parameters set to 3 MUST represent parameters number 4, 5 and 6. + +A receiving node MUST ignore values for non-existing parameters + +Default (1 bit) + +This field is used to specify if the default value is to be restored for the specified configuration parameters. + +The value 1 MUST indicate that default factory settings must be restored for the Parameter Numbers defined by the Parameter Offset and Number of Parameters fields. In this case, the Configuration Value field MUST be ignored and the receiving node MUST reset the specified parameters and SHOULD NOT reset any other parameters. The value 0 MUST indicate that the specified Parameter Numbers must assume the value specified by the Configuration Value field. + +Handshake (1 bit) + +This field is used to indicate if a Configuration Bulk Report Command is to be returned when the specified configuration parameters have been stored in non-volatile memory. + +If the Handshake bit is set to 1, a Configuration Bulk Report Command MUST be returned. The CC:0070.02.07.11.007 command MUST echo all parameters found in this Configuration Bulk Set Command. A node returning a Configuration Bulk Report Command with the Handshake bit set MUST be ready to receive another Configuration Bulk Set Command. If the Handshake bit is set, an originating node MUST wait for the Configuration Bulk Report Command for at least one second. If not receiving a report, the originating node SHOULD assume that the operation failed and resend the same Configuration Bulk Set Command one more time. + +If the Handshake bit is set to 0, a receiving node MUST NOT return a Configuration Bulk Report in response. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Size (3 bits) + +This field is used to specify the size of the actual parameters. The advertised size of a given parameter CC:0070.02.07.11.00C [MUST always be the same. The value of this field MUST comply with Table 32.](04.30-configuration-command-class-version-1.md#4302-configuration-set-command) + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Parameter – Configuration Value (M*N bytes) + +These fields carry the values to be assigned. Each field MUST have the same size. The size of each field MUST comply with the size advertised by the Size field. + +[The field MUST carry a signed value. The binary encoding of the signed value MUST comply withTable 10. The Value 1 field MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +## 4.31.5 Configuration Bulk Get Command + +This command is used to query the value of one or more configuration parameters. + +The Configuration Bulk Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION BULK GET _ _ | | | | | | | | +| Parameter Offset 1 (MSB) | | | | | | | | +| Parameter Offset 2 (LSB) | | | | | | | | +| Number of Parameters | | | | | | | | + +Parameter Offset (16 bits) + +This field is used to specify the first parameter in a range of one or more parameters. The first byte MUST carry the most significant byte of the 16 bit value. + +Parameter Numbers SHOULD be assigned in a sequence starting from 1. + +Number of Parameters (8 bits) + +This field is used to specify the number of requested configuration parameters. + +The value of this field MUST be in the range 1..255. + +The advertised parameters MUST be in a consecutive range. For example, Parameter Offset set to 4 and Number of Parameters set to 3 MUST represent parameters number 4, 5 and 6. + +## 4.31.6 Configuration Bulk Report Command + +This command is used to advertise the actual value of one or more advertised parameters. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION BULK REPORT _ _ | | | | | | | | +| Parameter Offset 1 (MSB) | | | | | | | | +| Parameter Offset 2 (LSB) | | | | | | | | +| Number of Parameters | | | | | | | | +| Reports to follow | | | | | | | | +| Default | Hand- shake | Reserved | | | Size | | | +| Parameter 1 – Configuration Value 1 (MSB) | | | | | | | | +| … | | | | | | | | +| Parameter 1 – Configuration Value N (LSB) | | | | | | | | +| … | | | | | | | | +| Parameter M – Configuration Value 1 (MSB) | | | | | | | | +| … | | | | | | | | +| Parameter M – Configuration Value N (LSB) | | | | | | | | + +Parameter Offset (16 bits) + +This field is used to advertise the first parameter in a range of one or more parameters. The first byte MUST carry the most significant byte of the 16 bit value. + +Number of Parameters (8 bits) + +This field is used to advertise the number (M) of configuration parameters contained in this command. + +The value of this field MUST be in the range 1..255. + +The advertised parameters MUST be in a consecutive range. For example, Parameter Offset set to 4 and Number of Parameters set to 3 MUST represent parameters number 4, 5 and 6, regardless of whether they exist at the sending node. + +Reports to follow (8 bits) + +This field MUST be used to advertise the number of reports left before all requested configuration parameters values have been transferred. + +The value 0 MUST indicate that this is the last report. + +If the Handshake field is 1 , this field MUST be set to 0. The value of this field MUST be in the range 0..255. + +Default (1 bit) + +This field MUST be used to advertise if all advertised configuration parameters have the factory default value. + +The value 1 MUST indicate that all advertised configuration parameters have the factory default value. The value 0 MUST indicate that one or more of the advertised configuration parameters do not have CC:0070.02.09.11.009 the factory default value. + +Handshake (1 bit) + +This field is used to indicate if this report is returned in response to a Configuration Bulk Set Command. + +The value 1 MUST indicate that all configuration parameters have been stored in non-volatile memory and that the sending node is ready to receive another Configuration Bulk Set Command. Except for the Reports to Follow field, all other fields MUST echo the values received in the Configuration Bulk Set Command. The Reports to Follow field MUST be 0. + +The value 0 MUST indicate that this report is returned in response to a Configuration Bulk Get Command. + +Size (3 bits) + +This field is used to advertise the size of the actual parameter. The advertised size of a given parameter [MUST always be the same. The value of this field MUST comply with Table 32.](04.30-configuration-command-class-version-1.md#4302-configuration-set-command) + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Parameter – Configuration Value (M*N bytes) + +These fields carry the values advertised by the Parameter Offset and Number of Parameters fields. Each CC:0070.02.09.11.010 field MUST have the same size. The size of each field MUST comply with the size advertised by the Size field. + +[The field MUST carry a signed value. The binary encoding of the signed value MUST comply withTable 10. The Value 1 field MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +A sending node SHOULD set this field to 0 for non-existing parameters. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.24-configuration-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.32-configuration-command-class-version-3.md similarity index 53% rename from docs/specs/command-class-specification/04-command-class-definitions/04.24-configuration-command-class-version-3.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.32-configuration-command-class-version-3.md index 32aadce..d8c5eff 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.24-configuration-command-class-version-3.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.32-configuration-command-class-version-3.md @@ -1,25 +1,27 @@ -# 4.24 Configuration Command Class, version 3 +# 4.32 Configuration Command Class, version 3 The Configuration Command Class, version 3 allows product specific configuration parameters to be changed. Examples include the default dimming rate of a light dimmer and the endpoints of a window covering device. -Configuration parameters accessed via this command class MUST NOT replace similar commands provided by other existing application Command Classes. Configuration parameter documentation MUST be provided in the product documentation. Configuration parameter documentation SHOULD be provided via Z-Wave via this command class CC:0070.03.00.12.001 version. +Configuration parameters accessed via this command class MUST NOT replace similar commands provided by other existing application Command Classes. Configuration parameter documentation MUST be provided in the product documentation. Configuration parameter documentation SHOULD be provided via Z-Wave via this command class version. A device MUST be able to operate with default factory configuration parameter values. -It is RECOMMENDED that configuration parameters can be manipulated via a local user interface. It is RECOMMENDED that default factory configuration parameter values can be restored via a local user interface. +It is RECOMMENDED that configuration parameters can be manipulated via a local user interface. -## 4.24.1 Compatibility considerations +It is RECOMMENDED that default factory configuration parameter values can be restored via a local user interface. + +## 4.32.1 Compatibility considerations The following additions are made to the Configuration Command Class, version 3: - [Configuration Name Get Command](04.24-configuration-command-class-version-3.md#4243-configuration-name-get-command)  [Configuration Name Report Command](04.24-configuration-command-class-version-3.md#4244-configuration-name-report-command)  [Configuration Info Get Command](04.24-configuration-command-class-version-3.md#4245-configuration-info-get-command)  [Configuration Info Report Command](04.24-configuration-command-class-version-3.md#4246-configuration-info-report-command)  [Configuration Properties Get Command](04.24-configuration-command-class-version-3.md#4247-configuration-properties-get-command)  [Configuration Properties Report Command](04.24-configuration-command-class-version-3.md#4248-configuration-properties-report-command) + [Configuration Name Get Command](04.32-configuration-command-class-version-3.md#4323-configuration-name-get-command)  [Configuration Name Report Command](04.32-configuration-command-class-version-3.md#4324-configuration-name-report-command)  [Configuration Info Get Command](04.32-configuration-command-class-version-3.md#4325-configuration-info-get-command)  [Configuration Info Report Command](04.32-configuration-command-class-version-3.md#4326-configuration-info-report-command)  [Configuration Properties Get Command](04.32-configuration-command-class-version-3.md#4327-configuration-properties-get-command)  [Configuration Properties Report Command](04.32-configuration-command-class-version-3.md#4328-configuration-properties-report-command) The purpose of the above commands is to allow a manufacturer to advertise information relating to the use of a specific configuration parameter directly from the configuration interface. The advertised information should be the same as can be found in the printed documentation. @@ -33,36 +35,38 @@ A device supporting the Configuration Command Class v3 MUST respond to a Configu Configuration Command Class version 2 extended the possible parameter range from 1..255 to 1..65535. The first 255 parameters of the two ranges are identical. Parameters in the range 1..255 can be addressed using either the Bulk Set/Get Commands or Set/Get Commands while parameters in the range 256..65535 can only be addressed using the Bulk Set/Get Commands. -### 4.24.1.1 “Default” flag +### 4.32.1.1 “Default” flag -[Refer to 4.22.1.1.](04.22-configuration-command-class-version-1.md#42211-default-flag) +[Refer to 4.30.1.1.](04.30-configuration-command-class-version-1.md#43011-default-flag) -### 4.24.1.2 Configuration Properties Report +### 4.32.1.2 Configuration Properties Report -Earlier text revisions of the Configuration Command Class, version 3 did not explicitly specify that the “Min Value”, “Max Value” and “Default Value” fields MUST be omitted if the advertised size is 0 in the [Configuration Properties Report Command.](04.24-configuration-command-class-version-3.md#4248-configuration-properties-report-command) +Earlier text revisions of the Configuration Command Class, version 3 did not explicitly specify that the CC:0070.03.00.21.003 “Min Value”, “Max Value” and “Default Value” fields MUST be omitted if the advertised size is 0 in the [Configuration Properties Report Command.](04.32-configuration-command-class-version-3.md#4328-configuration-properties-report-command) Controlling nodes SHOULD be aware that some legacy nodes supporting version 3 could by error include the “Min Value”, “Max Value” and “Default Value” fields and set them to 0x00 with an arbitrary size. If a controlling node receives a Report in which the “Next Parameter Number” field seems to be set to 0x0000 when requesting parameter number 0, the controlling node SHOULD inspect the last 2 bytes of the command frame in order to find out what is the Next Parameter Number. -## 4.24.2 Interoperability considerations +## 4.32.2 Interoperability considerations It is RECOMMENDED that the name and information stored in a supporting device are in English. It is RECOMMENDED that the last line of the information field presents an Internet URL which points to updated information for the actual configuration parameter as well as other language variants. -## 4.24.3 Configuration Name Get Command +## 4.32.3 Configuration Name Get Command This command is used to request the name of a configuration parameter. The Configuration Name Report Command MUST be returned in response to this command. -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. +This command MUST NOT be issued via multicast addressing. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION NAME GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION NAME GET _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | Parameter Number (16 bits) @@ -70,20 +74,20 @@ This field is used to specify the requested configuration parameter. The first byte MUST carry the most significant byte of the 16 bit value. -## 4.24.4 Configuration Name Report Command +## 4.32.4 Configuration Name Report Command This command is used to advertise the name of a parameter. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION NAME REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to follow | | | | | | | | | | | | | | | | | | | | | | | | -| Name 1 | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Name N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION NAME REPORT _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | +| Reports to follow | | | | | | | | +| Name 1 | | | | | | | | +| .. | | | | | | | | +| Name N | | | | | | | | Parameter Number (16 bits) @@ -91,7 +95,7 @@ This field is used to advertise the actual configuration parameter. The first byte MUST carry the most significant byte of the 16 bit value. -If a non-existing parameter is specified in a Configuration Name Get Command, a receiving node MAY return a zero-length Name field in the Configuration Name Report Command. The receiving node SHOULD however return an error message e.g. “Unassigned parameter”. CC:0070.03.0B.12.001 +If a non-existing parameter is specified in a Configuration Name Get Command, a receiving node MAY return a zero-length Name field in the Configuration Name Report Command. The receiving node SHOULD however return an error message e.g. “Unassigned parameter”. Parameter numbers above 255 can only be addressed using the Bulk Set/Get Commands. Parameter numbers in the range 1..255 can be addressed using either the Bulk Set/Get Commands or the Set/Get Commands. @@ -111,20 +115,22 @@ Bytes MUST be encoded in UTF-8 format. It is RECOMMENDED that the name stored in a supporting device is in English. -## 4.24.5 Configuration Info Get Command +## 4.32.5 Configuration Info Get Command This command is used to request usage information for a configuration parameter. The Configuration Info Report Command MUST be returned in response to this command. -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. +This command MUST NOT be issued via multicast addressing. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION INFO GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION INFO GET _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | Parameter Number (16 bits) @@ -132,20 +138,20 @@ This field is used to specify the requested configuration parameter. The first byte MUST carry the most significant byte of the 16 bit value. -## 4.24.6 Configuration Info Report Command +## 4.32.6 Configuration Info Report Command This command is used to advertise usage information for a configuration parameter. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION INFO REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to follow | | | | | | | | | | | | | | | | | | | | | | | | -| Info 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Info N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION INFO REPORT _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | +| Reports to follow | | | | | | | | +| Info 1 | | | | | | | | +| … | | | | | | | | +| Info N | | | | | | | | Parameter Number (16 bits) @@ -167,15 +173,17 @@ Info (N bytes) This field is used to advertise the detailed information available for the parameter. It is RECOMMENDED that the Info field carries all information found in the documentation. -The field MUST carry a byte string with no zero termination. The number of Info bytes transmitted MUST be determined from the length field in the frame. The Info field MAY span multiple reports. The number of Info bytes MAY be zero. +The field MUST carry a byte string with no zero termination. -Bytes MUST be encoded in UTF-8 format. +The number of Info bytes transmitted MUST be determined from the length field in the frame. -It is RECOMMENDED that the information stored in a supporting device is in English. +The Info field MAY span multiple reports. The number of Info bytes MAY be zero. -It is RECOMMENDED that the last line of the information field presents an Internet URL which points to updated information for the actual configuration parameter as well as other language variants. +Bytes MUST be encoded in UTF-8 format. + +It is RECOMMENDED that the information stored in a supporting device is in English. It is RECOMMENDED that the last line of the information field presents an Internet URL which points to updated information for the actual configuration parameter as well as other language variants. -## 4.24.7 Configuration Properties Get Command +## 4.32.7 Configuration Properties Get Command This command is used to request the properties of a configuration parameter. @@ -185,12 +193,12 @@ If a Configuration Properties Report command is not returned in response to a Co This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION PROPERTIES GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION PROPERTIES GET _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | Parameter Number (16 bits) @@ -198,32 +206,34 @@ This field is used to specify the requested configuration parameter. The first byte MUST carry the most significant byte of the 16 bit value. -If a non-existing parameter is specified in this command, a receiving node MUST advertise zero values in the Format and Size fields. The Next Parameter Number field MUST advertise the next available configuration parameter. +If a non-existing parameter is specified in this command, a receiving node MUST advertise zero values in the Format and Size fields. The Next Parameter Number field MUST advertise the next available CC:0070.03.0E.11.003 configuration parameter. + +It is RECOMMENDED that a controlling device initiates probing of supported configuration parameters by issuing this command for parameter number 0. -It is RECOMMENDED that a controlling device initiates probing of supported configuration parameters by issuing this command for parameter number 0. If a Size field value of zero is returned, a controlling device SHOULD issue a Configuration Properties Get Command for the parameter advertised in the Next Parameter Number field. +If a Size field value of zero is returned, a controlling device SHOULD issue a Configuration Properties Get Command for the parameter advertised in the Next Parameter Number field. -## 4.24.8 Configuration Properties Report Command +## 4.32.8 Configuration Properties Report Command This command is used to advertise the properties of a configuration parameter. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION PROPERTIES REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | Format | | | | | | | | | Size | | | | | | | | | -| Min Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Min Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Max Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Max Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Default Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Default Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Next Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Next Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION PROPERTIES REPORT _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | +| Reserved | | Format | | | Size | | | +| Min Value 1 (MSB) | | | | | | | | +| .. | | | | | | | | +| Min Value N (LSB) | | | | | | | | +| Max Value 1 (MSB) | | | | | | | | +| .. | | | | | | | | +| Max Value N (LSB) | | | | | | | | +| Default Value 1 (MSB) | | | | | | | | +| .. | | | | | | | | +| Default Value N (LSB) | | | | | | | | +| Next Parameter Number 1 (MSB) | | | | | | | | +| Next Parameter Number 2 (LSB) | | | | | | | | Parameter Number (16 bits) @@ -241,26 +251,26 @@ This field MUST be set to 0 by a sending node and MUST be ignored by a receiving Format (3 bits) -This field is used to advertise the format of the parameter. +This field is used to advertise the format of the parameter. [The value of this field MUST comply with Table 33.](04.32-configuration-command-class-version-3.md#4328-configuration-properties-report-command) -[The value of this field MUST comply with Table 29.](04.24-configuration-command-class-version-3.md#4248-configuration-properties-report-command) Table 29, Configuration Properties Report :: Format encoding +Table 33, Configuration Properties Report :: Format encoding -| | Value | | | Parameter format and presentation | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Signed Integer | | | -| 0x01 | | | Unsigned Integer | | | -| 0x02 | | | Enumerated (Radio buttons) | | | -| 0x03 | | | Bit field (Checkboxes) | | | +| Value | Parameter format and presentation | +| --- | --- | +| 0x00 | Signed Integer | +| 0x01 | Unsigned Integer | +| 0x02 | Enumerated (Radio buttons) | +| 0x03 | Bit field (Checkboxes) | -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. +CC:0070.03.0F.11.006 All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. If the parameter format is “Unsigned integer”, normal binary integer encoding MUST be used. [If the parameter format is “Signed integer”, the binary encoding MUST comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) -If the parameter format is “Enumerated”, the parameter MUST be treated as an unsigned integer. [A graphical configuration tool SHOULD present this parameter as a series of radio buttons [11].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +If the parameter format is “Enumerated”, the parameter MUST be treated as an unsigned integer. CC:0070.03.0F.12.001 [A graphical configuration tool SHOULD present this parameter as a series of radio buttons [11].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -If the parameter format is “Bit field” the parameter MUST be treated as a bit field where each individual bit can be set or reset. [A graphical configuration tool SHOULD present this parameter as a series of checkboxes [11].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +If the parameter format is “Bit field” the parameter MUST be treated as a bit field where each individual bit can be set or reset. [A graphical configuration tool SHOULD present this parameter as a series of checkboxes [11].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Size (3 bits) @@ -268,20 +278,18 @@ This field is used to advertise the size of the actual parameter. The advertised size MUST also apply to the fields “Min Value”, “Max Value”, “Default Value” carried in this command. -[The value of this field MUST comply with Table 30.](04.24-configuration-command-class-version-3.md#4248-configuration-properties-report-command) +[The value of this field MUST comply with Table 34.](04.32-configuration-command-class-version-3.md#4328-configuration-properties-report-command) -Table 30, Configuration Properties Report :: Size encoding +Table 34, Configuration Properties Report :: Size encoding -| | Size | | | Size of parameter | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | 0 bit (Unassigned parameter, Value fields omitted) | | | -| 1 | | | 8 bit | | | -| 2 | | | 16 bit | | | -| 4 | | | 32 bit | | | +| Size | Size of parameter | +| --- | --- | +| 0 | 0 bit (Unassigned parameter, Value fields omitted) | +| 1 | 8 bit | +| 2 | 16 bit | +| 4 | 32 bit | -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Min Value (N bytes) +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Min Value (N bytes) This field MUST advertise the minimum value that the actual parameter can assume. @@ -289,11 +297,13 @@ If the parameter is “Bit field”, this field MUST be set to 0. The size of the field MUST comply with the size advertised by the Size field. This field MUST be omitted if the Size field is set to 0. -The sign encoding MUST comply with the mode advertised by the Signed field. Max Value (N bytes) +The sign encoding MUST comply with the mode advertised by the Signed field. + +Max Value (N bytes) This field MUST advertise the maximum value that the actual parameter can assume. -If the parameter is “Bit field”, each individual supported bit MUST be set to ‘1’, while each un-supported bit of MUST be set to ‘0’. A graphical configuration tool SHOULD NOT present checkboxes for un-supported bits. +If the parameter is “Bit field”, each individual supported bit MUST be set to ‘1’, while each un- supported bit of MUST be set to ‘0’. A graphical configuration tool SHOULD NOT present checkboxes for un-supported bits. The size of the field MUST comply with the size advertised by the Size field. This field MUST be omitted if the Size field is set to 0. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.33-configuration-command-class-version-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.33-configuration-command-class-version-4.md new file mode 100644 index 0000000..a99df38 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.33-configuration-command-class-version-4.md @@ -0,0 +1,223 @@ + +# 4.33 Configuration Command Class, version 4 + +The Configuration Command Class, version 4 introduces the support of read-only parameters, parameters requiring network re-inclusion and advanced parameters as well as allows optional support for Bulk Commands. + +A read-only parameter can be accessed with Get commands but cannot be modified with Set Commands. A parameter requiring re-inclusion is typically a parameter altering the node capabilities, which requires performing the inclusion again in order to have the controller to learn about the node capabilities once more. A parameter may be advertised as "advanced" to indicate to the controlling application that the actual parameter is intended only for advanced use, e.g. calibration. + +The following commands are modified in version 4: + + [Configuration Set Command](04.33-configuration-command-class-version-4.md#4332-configuration-set-command)  [Configuration Bulk Set Command](04.33-configuration-command-class-version-4.md#4333-configuration-bulk-set-command)  [Configuration Properties Report Command](04.33-configuration-command-class-version-4.md#4334-configuration-properties-report-command) + +The following new command is introduced: + + [Configuration Default Reset Command](04.33-configuration-command-class-version-4.md#4335-configuration-default-reset-command) + +All commands not mentioned in this version remain unchanged from previous versions. + +## 4.33.1 Compatibility considerations + +Configuration Command Class, version 4 is backwards compatible with the previous versions of Configuration Command Class. + +A device supporting Configuration Command Class, version 4 MUST support Configuration Command Class, version 3. + +### 4.33.1.1 Multi Channel Consideration + +Multi Channel End Points SHOULD NOT support the Configuration Command Class. + +### 4.33.1.2 “Default” flag + +[Refer to 4.30.1.1](04.30-configuration-command-class-version-1.md#43011-default-flag) + +From version 4 and onwards, a node MUST NOT reset all Configuration Parameters when receiving a Set or Bulk Set Command with the default flag set to 1. + +### 4.33.1.3 Configuration Properties Report + +[Refer to 4.32.1.2.](04.32-configuration-command-class-version-3.md#43212-configuration-properties-report) + +The recommendation given in version 3 does not apply to version 4 supporting nodes as new fields are [appended at the end of the Configuration Properties Report Command in version 4.](04.32-configuration-command-class-version-3.md#4328-configuration-properties-report-command) + +### 4.33.1.4 “Altering capabilities” flag + +Configuration parameters modifying a node’s and/or (non-dynamic) Multi Channel End Point capabilities MUST be advertised as “Altering capabilities”. + +When such a parameter is modified: + + A Z-Wave or Z-Wave Plus node MUST NOT advertise the new and/or Multi Channel End Point capabilities before being excluded from its current network.  A Z-Wave Plus version 2 node MUST advertise its new capabilities immediately. + +### 4.33.1.5 “Advanced” flag + +The difference between normal and advanced parameters lies on the controlling node side. + +A parameter MAY be advertised as "advanced" in order to simplify the configuration of a node by normally not showing such a parameter to the end user. + +Advanced parameters SHOULD be presented to the user only when an [Advanced] option is selected in the controller user interface. + +### 4.33.1.6 Parameters value and network inclusion/exclusion + +From version 4 and onwards, a node MUST NOT modify or reset any configuration parameter when being included or excluded of a Z-Wave network. + +A node MUST reset all its configuration parameters if either: + + It is manually reset to factory default  [It receives a Configuration Default Reset Command.](04.33-configuration-command-class-version-4.md#4335-configuration-default-reset-command) + +A node MUST NOT reset all its configuration parameters in any other case. + +### 4.33.1.7 Bulk commands support + +A node supporting Configuration Command Class, version 4 MAY elect to ignore the following Commands: + + Configuration Bulk Set Command  Configuration Bulk Get Command  Configuration Bulk Report Command. + +If it is the case, the node MUST: + + Return an Application Rejected Request Command when receiving one of the ignored commands (if received without Supervision encapsulation).  Advertise that it ignores the Bulk Commands in the Configuration Properties Report. + +If Bulk Commands are supported, they MUST be supported for all parameters. If Bulk Commands are ignored, they MUST be ignored for all parameters. + +## 4.33.2 Configuration Set Command + +This command is used to set the value of a configuration parameter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION SET _ | | | | | | | | +| Parameter Number | | | | | | | | +| Default | Reserved | | | | Size | | | +| Configuration Value 1 | | | | | | | | +| … | | | | | | | | +| Configuration Value N | | | | | | | | + +A receiving node MUST ignore this command if the specified parameter is advertised as a Read-only parameter. + +All fields not specified below are unchanged from version 2 Configuration Set Command. + +Default (1 bit) + +This field is used to specify if the default value is to be restored for the specified configuration parameter. + +The value 1 MUST indicate that default factory settings must be restored for the specified Parameter Number. In this case, the Configuration value field MUST be ignored and any other parameters MUST CC:0070.04.04.11.003 NOT be reset by a receiving node. + +The value 0 MUST indicate that the specified Parameter Number MUST assume the value specified by the Configuration Value field. + +Configuration Value (N bytes) + +This field carries the value to be assigned. The size of the field MUST comply with the size advertised by the Size field. + +The configuration value MUST be encoded according to the Format field advertised in the Configuration Properties Report Command for the parameter number. + +## 4.33.3 Configuration Bulk Set Command + +This command is used to set the value of one or more configuration parameters. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION BULK SET _ _ | | | | | | | | +| Parameter Offset 1 (MSB) | | | | | | | | +| Parameter Offset 2 (LSB) | | | | | | | | +| Number of Parameters | | | | | | | | +| Defaul t | Hand- shake | Reserved | | | Size | | | +| Parameter 1 – Configuration Value 1 (MSB) | | | | | | | | +| … | | | | | | | | +| Parameter 1 – Configuration Value N (LSB) | | | | | | | | +| … | | | | | | | | +| Parameter M – Configuration Value 1 (MSB) | | | | | | | | +| … | | | | | | | | +| Parameter M – Configuration Value N (LSB) | | | | | | | | + +A receiving node MUST ignore this command for parameters that are advertised as Read-only parameters. + +All fields not specified below are unchanged from version 2 Configuration Bulk Set Command. + +Default (1 bit) + +This field is used to specify if the default value is to be restored for the specified configuration parameters. + +The value 1 MUST indicate that default factory settings must be restored for all the Parameter Numbers defined by the Parameter Offset and Number of Parameters fields. In this case, the Configuration Value field MUST be ignored and any other parameters MUST NOT be reset by a receiving node. + +The value 0 MUST indicate that the specified Parameter Numbers MUST assume the value specified by the Configuration Value field. + +Parameter –Configuration Value (M*N bytes) + +These fields carry the parameter values to be assigned. Each parameter value field MUST have the same size. The size of each field MUST comply with the size advertised by the Size field. + +The values MUST be encoded according to the Format field advertised in the Configuration Properties Report Command for each parameter number. + +## 4.33.4 Configuration Properties Report Command + +This command is used to advertise the properties of a configuration parameter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION PROPERTIES REPORT _ _ | | | | | | | | +| Parameter Number 1 (MSB) | | | | | | | | +| Parameter Number 2 (LSB) | | | | | | | | +| Altering capabilities | Read- only | Format | | | Size | | | +| Min Value 1 (MSB) | | | | | | | | +| .. | | | | | | | | +| Min Value N (LSB) | | | | | | | | +| Max Value 1 (MSB) | | | | | | | | +| .. | | | | | | | | +| Max Value N (LSB) | | | | | | | | +| Default Value 1 (MSB) | | | | | | | | +| .. | | | | | | | | +| Default Value N (LSB) | | | | | | | | +| Next Parameter Number 1 (MSB) | | | | | | | | +| Next Parameter Number 2 (LSB) | | | | | | | | +| Reserved | | | | | | No Bulk support | Advanced | + +All fields not specified below are unchanged from version 3 Configuration Properties Report Command. + +Read-only (1 bit) + +This field is used to indicate if the parameter is read-only. + +The value 1 MUST indicate that the advertised parameter is read-only. + +The value 0 MUST indicate that the advertised parameter is not read-only. Altering capabilities (1 bit) + +This field is used to indicate if the advertised parameter triggers a change in the node’s capabilities. + +The value 1 MUST indicate that the advertised parameter alters the node capabilities when being changed. + +The value 0 MUST indicate that the advertised parameter does not alter the node capabilities when being changed. + +[Refer to 4.33.1.4 “Altering capabilities” flag.](04.33-configuration-command-class-version-4.md#43314-altering-capabilities-flag) + +Advanced (1 bit) + +This field is used to indicate if the advertised parameter is to be presented in the “Advanced” parameter section in the controller GUI. + +The value 1 MUST indicate that the advertised parameter is an Advanced parameter. + +The value 0 MUST indicate that the advertised parameter is not an Advanced parameter. + +No Bulk support (1 bit) + +This field is used to advertise if the sending node supports Bulk Commands. + +The value 1 MUST indicate that the Bulk Commands will be ignored by the sending node. + +The value 0 MUST indicate that the Bulk Commands are supported by the sending node + +A sending node MUST always advertise the same value in this field, regardless of the parameter number. + +## 4.33.5 Configuration Default Reset Command + +This command is used to reset all configuration parameters to their default value. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | +| Command = CONFIGURATION DEFAULT RESET _ _ | | | | | | | | + +A node receiving this command MUST reset all its Configuration Parameters to their default value. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.34-controller-replication-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.34-controller-replication-command-class-version-1.md new file mode 100644 index 0000000..331ea68 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.34-controller-replication-command-class-version-1.md @@ -0,0 +1,115 @@ + +# 4.34 Controller Replication Command Class, version 1 + +The Controller Replication Command Class is used to copy scene and group data to another controlling node. The Command Class may be used in conjunction with a controller shift or when including a new controller to the network. It is OPTIONAL to use this command class during a controller shift or when including a new controller to the network. + +## 4.34.1 Transfer Group Command + +This command is used to replicate mappings between Group ID and Node ID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | +| Command = CTRL REPLICATION TRANSFER GROUP _ _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Group ID | | | | | | | | +| Node ID | | | | | | | | + +Sequence Number (8 bits) + +Sequence Number of this particular command. + +Group ID (8 bits) + +Group ID of the group that the node is member of. + +Node ID (8 bits) + +Node ID of slave device. + +## 4.34.2 Transfer Group Name Command + +This command is used to replicate group names. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | +| Command = CTRL REPLICATION TRANSFER GROUP NAME _ _ _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Group ID | | | | | | | | +| Group Name 1 | | | | | | | | +| … | | | | | | | | +| Group Name N | | | | | | | | + +Sequence Number (8 bits) + +Sequence Number of this particular command. + +Group ID (8 bits) + +Group ID associated with a specific group. + +Group Name (N bytes) + +The Group Name fields contain the assign group name in ASCII characters. + +## 4.34.3 Transfer Scene Command + +This command is used to replicate mappings between Scene ID and Node ID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | +| Command = CTRL REPLICATION TRANSFER SCENE _ _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Scene ID | | | | | | | | +| Node ID | | | | | | | | +| Level | | | | | | | | + +Sequence Number (8 bits) + +Sequence Number of this particular command. + +Scene ID (8 bits) + +The scene ID is the parameter used to link together the different devices that takes part of a scene. + +Node ID (8 bits) + +The Node ID for a device that is part of the scene. + +Level (8 bits) + +The level is the parameter used for the specified scene. + +## 4.34.4 Transfer Scene Name Command + +This command is used to replicate scene names. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | +| Command = CTRL REPLICATION TRANSFER SCENE NAME _ _ _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Scene ID | | | | | | | | +| Scene Name 1 | | | | | | | | +| … | | | | | | | | +| Scene Name N | | | | | | | | + +Sequence Number (8 bits) + +Sequence Number of this particular command. + +Scene ID (8 bits) + +Scene ID associated with a specific scene. + +Scene Name (N bytes) + +The Scene Name fields contain the assign scene name in ASCII characters. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.27-demand-control-plan-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.35-demand-control-plan-configuration-command-class-version-1.md similarity index 55% rename from docs/specs/command-class-specification/04-command-class-definitions/04.27-demand-control-plan-configuration-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.35-demand-control-plan-configuration-command-class-version-1.md index a68bf2b..316eadf 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.27-demand-control-plan-configuration-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.35-demand-control-plan-configuration-command-class-version-1.md @@ -1,11 +1,11 @@ -# 4.27 Demand Control Plan Configuration Command Class, version 1 +# 4.35 Demand Control Plan Configuration Command Class, version 1 The Demand Control Plan Configuration Command Class allows Utility Suppliers to issue and manage a list of Demand Control Plan (DCP) events to the end consumer. @@ -15,7 +15,7 @@ A DCP event contains information regarding criticality, products involved, reque A DCP event may also include information, which enables devices not supporting this class to use in the Demand Control Plan through the Start & Stop Association Group functionality. The installer, the end user or Utility Supplier (remote management) configures the Association groups. During the configuration process the devices are selected and the association entries are created. These associations can additionally be configured with the specific Z-Wave commands (through the Association Command Configuration Command Class). If no Z-Wave commands are specified in the Associations groups, it is the responsibility of the device to issue the relevant commands based on Utility Supplier specific algorithms. -## 4.27.1 DCP List Supported Get Command +## 4.35.1 DCP List Supported Get Command This command is used to request the total size of the DCP list along with the number of free entries in the list. @@ -23,21 +23,21 @@ The DCP List Supported Report Command MUST be returned in response to this comma This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP LIST SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | +| Command = DCP LIST SUPPORTED GET _ _ _ | | | | | | | | -## 4.27.2 DCP List Supported Report Command +## 4.35.2 DCP List Supported Report Command This command is used to provide the total size of the DCP list along with the number of free entries in the list. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP LIST SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| DCP List Size | | | | | | | | | | | | | | | | | | | | | | | | -| Free DCP List entries | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | +| Command = DCP LIST SUPPORTED REPORT _ _ _ | | | | | | | | +| DCP List Size | | | | | | | | +| Free DCP List entries | | | | | | | | DCP List Size (8 bits) @@ -47,43 +47,46 @@ Free DCP List entries (8 bits) This value specifics the number of free entries for new DCP events. The value 0x00 specifies a full list. -## 4.27.3 DCP List Set Command +## 4.35.3 DCP List Set Command This command is used to place a new DCP event in the DCP list. Each DCP event is time stamped for future reference. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP LIST SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Month | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Day | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| DCP Rate ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Number of DC | | | | | | -| | Generic Device Class 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Specific Device Class 1 | | | | | | | | | | | | | | | | | | | | | | | -| …. | | | | | | | | | | | | | | | | | | | | | | | | -| | Generic Device Class N | | | | | | | | | | | | | | | | | | | | | | | -| | Specific Device Class N | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Hour Time | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute Time | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Second Time | | | | | | | | | | | | | | | | | | | | | | | | -| Event Priority | | | | | | | | | | | | | | | | | | | | | | | | -| Load shedding | | | | | | | | | | | | | | | | | | | | | | | | -| Start Association Group | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Association Group | | | | | | | | | | | | | | | | | | | | | | | | -| Randomization interval | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | +| Command = DCP LIST SET _ _ | | | | | | | | +| Timestamp -Year 1 | | | | | | | | +| Timestamp -Year 2 | | | | | | | | +| Timestamp -Month | | | | | | | | +| Timestamp -Day | | | | | | | | +| Timestamp -Hour Local Time | | | | | | | | +| Timestamp -Minute Local Time | | | | | | | | +| Timestamp -Second Local Time | | | | | | | | +| DCP Rate ID | | | | | | | | +| Reserved | | | | | | Number of DC | | +| Generic Device Class 1 | | | | | | | | +| Specific Device Class 1 | | | | | | | | +| …. | | | | | | | | +| Generic Device Class N | | | | | | | | +| Specific Device Class N | | | | | | | | +| Start Year 1 | | | | | | | | +| Start Year 2 | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour Local Time | | | | | | | | +| Start Minute Local Time | | | | | | | | +| Start Second Local Time | | | | | | | | +| Duration Hour Time | | | | | | | | +| Duration Minute Time | | | | | | | | +| Duration Second Time | | | | | | | | +| Event Priority | | | | | | | | +| Load shedding | | | | | | | | + +Start Association Group + +Stop Association Group + +Randomization interval Timestamp -Year (16 bits) @@ -122,9 +125,8 @@ Prior to Jul14 2008 two DCP events are placed in the List by the Utility Supplie | 4 | 2 | 5 | 1 | 3 | 4 | | --- | --- | --- | --- | --- | --- | -| | | | | | | | | -| --- | --- | --- | --- | --- | --- | --- | --- | | 4 | 5 | 5 | 1 | 2 | 1 | 3 | 4 | +| --- | --- | --- | --- | --- | --- | --- | --- | Randomization interval (8 bits) @@ -138,11 +140,11 @@ Specify the number of Generic/Specific Device Classes, which are requested to pa Generic Device Class (8bits) -[Specify the Generic Device Class identifier. Refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[Specify the Generic Device Class identifier. Refer to [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Specific Device Class (8 bits) -[Specify the Specific Device Class identifier. Refer to [1] and [10].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[Specify the Specific Device Class identifier. Refer to [10] and [22].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Start Year (16 bits) @@ -182,32 +184,32 @@ Event Priority (8 bits) The parameter specifies the priority of the DCP event. The High priority is used by the utility Supplier to mandate device participation and lower priorities are used by devices to voluntary to participate in the event and to which degree. -| | Event Priority | | | Description | | | Device participation | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved | | | Voluntary | | | -| 0x01 | | | V1 - Green Energy | | | Voluntary | | | -| 0x02 | | | V2 | | | Voluntary | | | -| 0x03 | | | V3 | | | Voluntary | | | -| 0x04 | | | V4 | | | Voluntary | | | -| 0x05 | | | V5 | | | Voluntary | | | -| 0x06 | | | V6 | | | Voluntary | | | -| 0x07 | | | V7 | | | Voluntary | | | -| 0x08 | | | M1 - Emergency | | | Mandatory | | | -| 0x09 | | | M2 | | | Mandatory | | | -| 0x0A | | | M3 | | | Mandatory | | | -| 0x0B | | | M4 | | | Mandatory | | | -| 0x0C | | | Utility defined | | | Utility defined | | | -| 0x0D | | | Utility defined | | | Utility defined | | | -| 0x0E | | | Utility defined | | | Utility defined | | | -| 0x0F | | | Utility defined | | | Utility defined | | | +| Event Priority | Description | Device participation | +| --- | --- | --- | +| 0x00 | Reserved | Voluntary | +| 0x01 | V1 - Green Energy | Voluntary | +| 0x02 | V2 | Voluntary | +| 0x03 | V3 | Voluntary | +| 0x04 | V4 | Voluntary | +| 0x05 | V5 | Voluntary | +| 0x06 | V6 | Voluntary | +| 0x07 | V7 | Voluntary | +| 0x08 | M1 - Emergency | Mandatory | +| 0x09 | M2 | Mandatory | +| 0x0A | M3 | Mandatory | +| 0x0B | M4 | Mandatory | +| 0x0C | Utility defined | Utility defined | +| 0x0D | Utility defined | Utility defined | +| 0x0E | Utility defined | Utility defined | +| 0x0F | Utility defined | Utility defined | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Load shedding (8 bits) -Specify the load shedding in percentage of average consumption requested for the event. This load shedding will be applied to the devices with the device classes specified in the command. +Specify the load shedding in percentage of average consumption requested for the event. This load shedding will be applied to the devices with the device classes specified in the command. This field MUST be in the range 0x01..0x64, which represents values in the range 1%..100%. All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. -This field MUST be in the range 0x01..0x64, which represents values in the range 1%..100%. All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. Start Association group (8 bits) +Start Association group (8 bits) Specify which association group (see the Association Command Class) should be activated when the event is started. The value 0x00 specifies no group should be activated. @@ -227,26 +229,26 @@ A small energy control system consisting of a device supporting the DCP command Through the use of the Association Command Class and the Association Command Configuration Command Class the following Associations has been established in the device. -Group 1 Node1, Thermostat_Setback_SetPpermanent override,energy saving mode) o Node8, Thermostat_Setpoint_Set(Heating setpoint#1, 19,5 C) Node5, Multilevel_Switch:Set (Dimlevel =0x20) +Group 1 Node1, Thermostat_Setback_SetPpermanent override,energy saving mode) Node8, Thermostat_Setpoint_Set(Heating setpoint#1, 19,5 o C) Node5, Multilevel_Switch:Set (Dimlevel =0x20) -Group 2 o Node1, Thermostat_Setback_Set(No override,Setback = 0 C) o Node8, Thermostat_Setpoint_Set(Heating setpoint#1, 21,5 C) Node5, Multilevel_Switch:Set (Dimlevel =0x40) +Group 2 Node1, Thermostat_Setback_Set(No override,Setback = 0 C) o Node8, Thermostat_Setpoint_Set(Heating setpoint#1, 21,5 o C) Node5, Multilevel_Switch:Set (Dimlevel =0x40) A DCP event can now specifically invoke Group1 when starting the event and invoking group2 when stopping the event by specifying Start Association Group=0x01 and Stop Association Group=0x02. -## 4.27.4 DCP List Remove +## 4.35.4 DCP List Remove This command is used to remove a DCP event from the DCP list. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP LIST REMOVE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Month | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Day | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to DCP List report command class (section 4.28.2) for description of fields](04.28-demand-control-plan-monitor-command-class-version-1.md#4282-dcp-list-report-command) +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP CONFIG _ _ _ | | | | | | | | +| Command = DCP LIST REMOVE _ _ | | | | | | | | +| Timestamp -Year 1 | | | | | | | | +| Timestamp -Year 2 | | | | | | | | +| Timestamp -Month | | | | | | | | +| Timestamp -Day | | | | | | | | +| Timestamp -Hour Local Time | | | | | | | | +| Timestamp -Minute Local Time | | | | | | | | +| Timestamp -Second Local Time | | | | | | | | + +[Refer to DCP List report command class (section 4.36.2) for description of fields](04.36-demand-control-plan-monitor-command-class-version-1.md#4362-dcp-list-report-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.36-demand-control-plan-monitor-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.36-demand-control-plan-monitor-command-class-version-1.md new file mode 100644 index 0000000..da98fcc --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.36-demand-control-plan-monitor-command-class-version-1.md @@ -0,0 +1,124 @@ + +# 4.36 Demand Control Plan Monitor Command Class, version 1 + +The Demand Control Plan Monitor Command Class allows devices to monitor the list of Demand Control Plan (DCP). A DCP event contains information regarding criticality, products involved, requested reduction, time duration and if a certain rate (identified by a Demand Control Plan Rate ID, refer to the Rate Table Configuration Command Class) is associated with the event. When a DCP event is outdated, it is removed from the list. Each DCP event is uniquely identified by a timestamp issued the Utility Supplier. + +## 4.36.1 DCP List Get Command + +This command is used to request the pending DCP event in a device. + +The DCP List Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | +| Command = DCP LIST GET _ _ | | | | | | | | + +## 4.36.2 DCP List Report Command + +This command reports the pending DCP event in a device. If more than one DCP event is pending – the reports will be submitted in chronically order as to when the events was placed on the list. Newest entry will be reported first. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | +| Command = DCP LIST REPORT _ _ | | | | | | | | +| Reports to Follow | | | | | | | | +| Timestamp -Year 1 | | | | | | | | +| Timestamp -Year 2 | | | | | | | | +| Timestamp -Month | | | | | | | | +| Timestamp -Day | | | | | | | | +| Timestamp -Hour Local Time | | | | | | | | +| Timestamp -Minute Local Time | | | | | | | | +| Timestamp -Second Local Time | | | | | | | | +| DCP ID | | | | | | | | +| Reserved | | | | | | Number of DC | | +| Generic Device Class 1 | | | | | | | | +| Specific Device Class 1 | | | | | | | | +| …. | | | | | | | | +| Generic Device Class N | | | | | | | | +| Specific Device Class N | | | | | | | | +| Start Year 1 | | | | | | | | +| Start Year 2 | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour Local Time | | | | | | | | +| Start Minute Local Time | | | | | | | | +| Start Second Local Time | | | | | | | | +| Duration Hour Time | | | | | | | | +| Duration Minute Time | | | | | | | | +| Duration Second Time | | | | | | | | +| Event Priority | | | | | | | | +| Load shedding | | | | | | | | +| Start Association Group | | | | | | | | +| Stop Association Group | | | | | | | | +| Randomization interval | | | | | | | | + +Reports to Follow (8 bits) + +This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. + +[Refer to DCP List Set command class (section 4.35.3) for detailed description of the fields.](04.35-demand-control-plan-configuration-command-class-version-1.md#4353-dcp-list-set-command) + +## 4.36.3 DCP Event Status Get + +This command is used to query the status of a specific DCP event in the DCP list. + +The DCP Event Status Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | +| Command = DCP EVENT STATUS GET _ _ _ | | | | | | | | +| Timestamp -Year 1 | | | | | | | | +| Timestamp -Year 2 | | | | | | | | +| Timestamp -Month | | | | | | | | +| Timestamp -Day | | | | | | | | +| Timestamp -Hour Local Time | | | | | | | | +| Timestamp -Minute Local Time | | | | | | | | +| Timestamp -Second Local Time | | | | | | | | + +[Refer to DCP List Set command class (section 4.35.3) for detailed description of the fields.](04.35-demand-control-plan-configuration-command-class-version-1.md#4353-dcp-list-set-command) + +## 4.36.4 DCP Event Status Report + +This command is used to provide the status of a specific DCP event in the DCP list. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | +| Command = DCP EVENT STATUS GET _ _ _ | | | | | | | | +| Timestamp -Year 1 | | | | | | | | +| Timestamp -Year 2 | | | | | | | | +| Timestamp -Month | | | | | | | | +| Timestamp -Day | | | | | | | | +| Timestamp -Hour Local Time | | | | | | | | +| Timestamp -Minute Local Time | | | | | | | | +| Timestamp -Second Local Time | | | | | | | | +| Event status | | | | | | | | + +[Refer to DCP List report command class (section 4.36.2) for description of fields](04.36-demand-control-plan-monitor-command-class-version-1.md#4362-dcp-list-report-command) + +Event Status (8 bits) + +The field contains the status of the event. + +Table 35, DCP Event Status Report::Event Status encoding + +| Event status | Description | +| --- | --- | +| 0x01 | Event Started | +| 0x02 | Event Completed | +| 0x03 | Event Rejected by the user | +| 0x04 | Event not Applicable | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.37-door-lock-command-class-version-1-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.37-door-lock-command-class-version-1-2.md new file mode 100644 index 0000000..2b6be64 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.37-door-lock-command-class-version-1-2.md @@ -0,0 +1,289 @@ + +# 4.37 Door Lock Command Class, version 1-2 + +The Door Lock Command Class is used to operate and configure a door lock device. + +[The Door Lock Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 4.37.1 Compatibility considerations + +A device supporting Door Lock CC, Version 2 MUST support Door Lock CC, version 1. + +The Door Lock Command Class, version 2 adds the “unknown” state to the Door Lock Operation Report Command. + +A supporting node MAY implement a subset of the features represented by the Door Lock Mode, Door Handles Mode and Door Condition fields which are provided by the commands of this Command Class. + +## 4.37.2 Door Lock Operation Set Command + +This command is used to set the operation mode of a supporting door lock device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION SET _ _ _ | | | | | | | | +| Door Lock Mode | | | | | | | | + +Door Lock Mode (8 bits) + +The Door Lock Mode field is used to specify the operation mode of the door lock device. + +[The encoding of this field MUST be according to Table 36.](04.37-door-lock-command-class-version-1-2.md#4372-door-lock-operation-set-command) + +Table 36, Door Lock Operation Set :: Mode + +| Mode | Description | Version | +| --- | --- | --- | +| 0x00 | Door Unsecured 1) | 1 | +| 0x01 | Door Unsecured with timeout 2) | 1 | +| 0x10 | Door Unsecured for inside Door Handles 1) | 1 | +| 0x11 | Door Unsecured for inside Door Handles with timeout 2) | 1 | +| 0x20 | Door Unsecured for outside Door Handles 1) | 1 | +| 0x21 | Door Unsecured for outside Door Handles with timeout 2) | 1 | +| 0xFF | Door Secured | 1 | + +1) Constant mode. Door will be unsecured until set to secured mode by another command. 2) Timeout mode. Fallback to secured mode after timeout has expired. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A controlling node MUST NOT specify modes using timeout-based fall back if the Operation Type of the supporting device is set to Constant operation (set by Door Lock Configuration Set). A supporting node MUST ignore modes using timeout-based fall back if Operation Type is set to Constant operation. + +A supporting node MUST apply the constant modes without any timeout even if it is set to Timed Operation Type. + +[A supporting node MAY implement a subset of the Door Lock Modes defined by Table 36.](04.37-door-lock-command-class-version-1-2.md#4372-door-lock-operation-set-command) + +A supporting node MUST accept the Door Lock Mode values 0x00 and 0xFF. + +## 4.37.3 Door Lock Operation Get Command + +This command is used to request the status of a door lock device. + +The Door Lock Operation Report command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION GET _ _ _ | | | | | | | | + +## 4.37.4 Door Lock Operation Report Command + +This command is used to advertise the status of a door lock device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION REPORT _ _ _ | | | | | | | | +| Door Lock Mode | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Door Condition | | | | | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | + +Door Lock Mode (8 bits) + +The Door Lock Mode field MUST advertise the mode of the door lock device. + +[The encoding of this field MUST be according to Table 37.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) + +Table 37, Door Lock Operation Report :: Door Lock Mode + +| Mode | Description | Version | +| --- | --- | --- | +| 0x00 | Door Unsecured 1) | 1 | +| 0x01 | Door Unsecured with timeout 2) | 1 | +| 0x10 | Door Unsecured for inside Door Handles 1) | 1 | +| 0x11 | Door Unsecured for inside Door Handles with timeout 2) | 1 | +| 0x20 | Door Unsecured for outside Door Handles 1) | 1 | +| 0x21 | Door Unsecured for outside Door Handles with timeout 2) | 1 | +| 0xFE | Door/Lock State Unknown 3) | 2 | +| 0xFF | Door Secured | 1 | + +1) Constant mode. Door will be unsecured until set back to secured mode by command 2) Timeout mode. Fallback to secured mode after timeout has expired 3) Bolt is not fully retracted/engaged All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A supporing node MAY advertise a subset of the available Door Lock Mode values. + +A controlling node MUST accept all Door Lock Mode values. + +The Door Lock Mode field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. + +Outside Door Handles Mode (4 bits) + +This field MUST advertise the status of each individual outside door handle. + +[The encoding of the Outside Door Handles Mode bitmask field MUST be according to Table 38 and Table 39.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) + +Table 38, Door Handles Mode bitmask + +| Bit 3 | Bit 2 | Bit 1 | Bit 0 | +| --- | --- | --- | --- | +| Handle 4 | Handle 3 | Handle 2 | Handle 1 | + +Table 39, Door Handles Mode bit encoding + +| Bit value | Description | +| --- | --- | +| ‘0’ | Disabled | +| ‘1’ | Enabled | + +CC:0062.01.03.11.007 The value ‘0’ MUST signify that the actual handle cannot open the door locally. The value ‘1’ MUST signify that the actual handle can open the door locally. + +A supporting node MAY advertise just a subset of the available Door Handles Mode values. + +A controlling node MUST accept all Door Handles Mode values. + +Inside Door Handles Mode (4 bits) + +This field MUST advertise the status of each individual inside door handle. + +[The encoding of the Inside Door Handles Mode bitmask field MUST be according to Table 38 and Table 39.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) + +A supporting node MAY advertise just a subset of the available Door Handles Mode values. + +A controlling node MUST accept all Door Handles Mode values. + +Door Condition (8 bits) + +The Door Condition field MUST advertise the status of the door lock components. + +[The encoding of the Door Condition bitmask field MUST be according to Table 46.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +A supporting node MAY advertise just a subset of the available Door Condition values. + +A controlling node MUST accept all Door Condition values. + +Lock Timeout Minutes (8 bits) + +This field MUST advertise the remaining time before the door lock will automatically be locked again. + +[The encoding of the Lock Timeout Minutes field MUST be according to Table 40. The time the](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) supporting node stays unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. + +Table 40, Door Lock Operation Report :: Lock Timeout Minutes + +| Value | Operation | +| --- | --- | +| 0x00..0xFD | Unlocked 0 .. 253 minutes (Operation Type = Timed Operation) | +| 0xFE | No unlocked period (Operation Type = Constant Operation) | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A supporting node MAY advertise just a subset of the available Lock Timeout values. + +A controlling node MUST accept all Lock Timeout values. Lock Timeout Seconds (8 bits) + +This field MUST advertise the remaining time before the door lock will automatically be locked again. + +[The encoding of the Lock Timeout Seconds field MUST be according to Table 41. The time to stay](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. + +Table 41, Door Lock Operation Report :: Lock Timeout Seconds + +| Value | Operation | +| --- | --- | +| 0..59 (0x00..0x3B) | Unlocked 0 .. 59 seconds (Operation Type = Timed Operation) | +| 254 (0xFE) | No unlocked period (Operation Type = Constant Operation) | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A supporting node MAY advertise just a subset of the available Lock Timeout values. + +A controlling de MUST accept all Lock Timeout values. + +## 4.37.5 Door Lock Configuration Set Command + +This command is used to set the configuration of a supporting door lock device. + +A door lock device MUST be able to operate with the factory default settings. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CONFIGURATION SET _ _ _ | | | | | | | | +| Operation Type | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | + +Operation Type (1 byte) + +[The Operation Type field MUST be set according to Table 42. When timed operation is specified, the](04.37-door-lock-command-class-version-1-2.md#4375-door-lock-configuration-set-command) Lock Timeout Minutes and Lock Timeout Seconds fields MUST be set to valid values. + +Table 42, Door Lock Operation Type + +| Operation Type | Description | Valid Lock Timeout values | +| --- | --- | --- | +| 0x01 | Constant operation | Minutes = 0xFE Seconds= 0xFE | +| 0x02 | Timed operation | Minutes = 0x00..0xFD Seconds= 0x00..0x3B | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A supporting node MAY accept just a subset of the available Operation Type values. + +A supporting node MUST accept the Operation Type value 0x01. + +Outside Door Handles Mode (4 bits) + +This field is used to advertise the status of each individual outside door handle. + +[The encoding of the Outside Door Handles Mode bitmask field MUST be according to Table 38 and Table 39.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) + +A supporting node MAY ignore the Door Handles Mode value. + +Inside Door Handles Mode (4 bits) + +This field MUST advertise the status of each individual inside door handle. + +[The encoding of the Inside Door Handles Mode bitmask field MUST be according to Table 38 and Table 39.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) + +A supporting node MAY ignore the Door Handles Mode value. Lock Timeout Minutes (1 byte) + +This field MUST specify the time that a door lock must wait before automatically being locked again. + +[The encoding of the Lock Timeout Minutes field MUST be according to Table 40. The time to stay](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. + +A supporting node MAY ignore the Lock Timeout values if it implements only the Operation Type = 0x01 (Constant operation). + +Lock Timeout Seconds (1 byte) + +This field MUST specify the time that a door lock must wait before automatically being locked again. + +[The encoding of the Lock Timeout Seconds field MUST be according to Table 41. The time to stay](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. + +A supporting node MAY ignore the Lock Timeout values if it implements only the Operation Type = 0x01 (Constant operation). + +## 4.37.6 Door Lock Configuration Get Command + +This command is used to request the configuration parameters of a door lock device. + +The Door Lock Configuration Report command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CONFIGURATION GET _ _ _ | | | | | | | | + +## 4.37.7 Door Lock Configuration Report Command + +This command is used to advertise the configuration parameters of a door lock device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CONFIGURATION REPORT _ _ _ | | | | | | | | +| Operation Type | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | + +[For fields’ description, refer to 4.37.5 Door Lock Configuration Set Command.](04.37-door-lock-command-class-version-1-2.md#4375-door-lock-configuration-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.38-door-lock-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.38-door-lock-command-class-version-3.md new file mode 100644 index 0000000..fd1b74f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.38-door-lock-command-class-version-3.md @@ -0,0 +1,56 @@ + +# 4.38 Door Lock Command Class, version 3 + +The Door Lock Command Class is used to operate and configure a door lock device. + +[The Door Lock Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +Commands and fields not described in version 3 remain unchanged from version 2. + +## 4.38.1 Compatibility considerations + +A node supporting the Door Lock Command Class, version 3 MUST support the Door Lock Command Class, version 2. + +Version 3 adds duration and target value reporting to the Door Lock Operation Report Command. + +## 4.38.2 Door Lock Operation Report Command + +This command is used to advertise the status of a door lock device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION REPORT _ _ _ | | | | | | | | +| Current Door Lock Mode | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Door Condition | | | | | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | +| Target Door Lock Mode | | | | | | | | +| Duration | | | | | | | | + +Fields not described below remain unchanged from previous versions. + +Current Door Lock Mode (8 bits) + +The Current Door Lock Mode field MUST advertise the current mode of the door lock device. + +[The encoding of this field MUST be according to Table 37.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) + +An Operation Set Command may be used to initiate a transition to a new target mode. The device may be queried for its current mode while in transition to a new mode. The response to an Operation Get SHOULD be the current mode of the device hardware, e.g. Door/Lock State Unknown. (applies to Version 2 and newer). + +Target Door Lock Mode (8 bits) + +The Target Door Lock Mode field MUST advertise the target mode of an ongoing transition or the most recent transition. + +[The encoding of this field MUST be according to Table 37.](04.37-door-lock-command-class-version-1-2.md#4374-door-lock-operation-report-command) Duration (8 bits) + +The Duration field SHOULD advertise the remaining time before the target mode is reached. + +[The encoding of this field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.39-door-lock-command-class-version-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.39-door-lock-command-class-version-4.md new file mode 100644 index 0000000..624e5c6 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.39-door-lock-command-class-version-4.md @@ -0,0 +1,492 @@ + +# 4.39 Door Lock Command Class, version 4 + +## 4.39.1 Terminology + +A door lock supports at least 2 modes: secured (it cannot be opened with handles) and unsecured (it can be opened with handles). It may support more modes where the node is for example secured only for the inside handles. + +A door lock may have several components such as a latch, a bolt and handles. + +A latch, which can also be called a latch bolt or spring bolt, usually locks the door automatically when closing it. The latch bolt is disengaged (retracted) typically when the user turns the door handle, which via the lockset's mechanism, manually retracts the latch bolt, allowing the door to open. + +Handles allow to retract the door’s latch. + +A bolt, also named dead bolt and hook bolt, allows to secure the door. When the bolt is out or extended, the door lock is usually secured (locked) but there are locks that are unlocked even then the bolt is out which will withdraw the bolt when user turns the door handle (which also retract the latch). The position of the bolt is not directly related to the Door Lock Mode. + +A supporting door lock runs in constant operation by default. In constant operation, the door lock stays in the same mode until receiving a new command or being locally actuated. A door lock may support timed operation. Timed operation has its own subset of modes, which after being activated will automatically return to the secured mode after the configured Lock Timeout. + +An auto-relock functionality can be supported for returning automatically to secured mode some given time after any operation mode change, including constant operation or changes initiated physically by a user (unlocking with key, thumb turn, etc). Auto-relock should not have any effect when the lock runs in Timed Operation + +A door lock node may have a twist assist mechanism. When a user starts rotating a key or the thumb turn to unlock the door, a motor starts rotating to help the user completing the movement. It can be helpful for disabled users. + +A node may support a hold and release functionality for spring latches. This is useful for locks having a handle that cannot retract the door spring latch on one side. This functionality defines how long the spring latch must be retracted after the door mode has been changed to unsecured. + +A block-to-block functionality can be activated for locks having separate lock block on each side of the door and cannot sense local changes on one side. Enabling the block-to-block feature will make the door lock try to execute a lock or unlock command on both sides regardless of the last known lock mode (representing the side that can be sensed). When this feature is disabled, the lock will ignore a command indicating a mode if it is identical to the last known lock mode. + +## 1.1.1 Compatibility considerations + +The Door Lock Command Class, version 4 is backwards compatible with the Door Lock Command Class, version 3. Fields and commands not mentioned in this version MUST remain unchanged from the Door Lock Command Class, version 3. + +Commands for advertising node capabilities are introduced in this version: + + [Door Lock Capabilities Get Command](04.39-door-lock-command-class-version-4.md#112-door-lock-capabilities-get-command)  [Door Lock Capabilities Report Command](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +These commands are extended in order to provide the auto-relock, twist assist and block-to-block functionalities. + + [Door Lock Configuration Set Command](04.39-door-lock-command-class-version-4.md#4395-door-lock-configuration-set-command)  [Door Lock Configuration Report Command](04.39-door-lock-command-class-version-4.md#4397-door-lock-configuration-report-command) + +## 4.39.2 Door Lock Operation Set Command + +This command is used to set the mode of a supporting door lock node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION SET (0x01) _ _ _ | | | | | | | | +| Door Lock Mode | | | | | | | | + +Door Lock Mode (8 bits) + +This field is used to specify the operation mode that the supporting node MUST assume. This field [MUST be encoded according to Table 43.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +Table 43, Door Lock Operation Set::Mode encoding + +| Value | Mode Description | Operation type | Version | +| --- | --- | --- | --- | +| 0x00 | Door Unsecured | Constant | 1 | +| 0x01 | Door Unsecured with timeout | Timed | 1 | +| 0x10 | Door Unsecured for inside Door Handles | Constant | 1 | +| 0x11 | Door Unsecured for inside Door Handles with timeout | Timed | 1 | +| 0x20 | Door Unsecured for outside Door Handles | Constant | 1 | +| 0x21 | Door Unsecured for outside Door Handles with timeout | Timed | 1 | +| 0xFF | Door Secured | Constant | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A controlling node MUST NOT specify modes using timeout-based fall back if the Operation Type of the supporting device is set to Constant operation (set by Door Lock Configuration Set). + +A supporting node MUST ignore modes using timeout-based fall back if Operation Type is set to Constant operation. + +A supporting node MUST apply the constant modes without any timeout even if it is configured to run in Timed Operation. + +A supporting node MUST ignore the command if the value specified in this field is not advertised as supported in the Door Lock Capabilities Report Command. + +A supporting node MUST support the door lock mode values 0x00 and 0xFF. + +## 4.39.3 Door Lock Operation Get Command + +This command is used to request the mode of a supporting door lock node. + +[The Door Lock Operation Report Command MUST be returned in response to this command.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION GET (0x02) _ _ _ | | | | | | | | + +## 4.39.4 Door Lock Operation Report Command + +This command is used to advertise the mode of a supporting door lock node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK OPERATION REPORT (0x03) _ _ _ | | | | | | | | +| Current Door Lock Mode | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Door Condition | | | | | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | +| Target Door Lock Mode | | | | | | | | +| Duration | | | | | | | | + +Current Door Lock Mode (8 bits) + +This field MUST advertise the current door lock mode of the sending node. This field MUST be encoded [according to Table 44.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) Table 44, Door Lock Operation Report::Mode encoding + +| Value | Mode Description | Operation type | Version | +| --- | --- | --- | --- | +| 0x00 | Door Unsecured | Constant (or timed) | 1 | +| 0x01 | Door Unsecured with timeout | Timed | 1 | +| 0x10 | Door Unsecured for inside Door Handles | Constant (or timed) | 1 | +| 0x11 | Door Unsecured for inside Door Handles with timeout | Timed | 1 | +| 0x20 | Door Unsecured for outside Door Handles | Constant (or timed) | 1 | +| 0x21 | Door Unsecured for outside Door Handles with timeout | Timed | 1 | +| 0xFE | Door mode unknown (e.g. bolt not fully retracted) | N/A | 2 | +| 0xFF | Door Secured | Constant (or timed) | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A sending node SHOULD set this field to 0xFE if sending this command while performing a transition between 2 modes. + +Outside Door Handles Mode (4 bits) + +This field is used to advertise the status of each individual outside door handle. + +[This field MUST be treated as a bitmask field and MUST be encoded according to Table 45.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +Table 45, Door Lock Operation Report::Door Handles Mode bitmask encoding + +| Bit 3 | Bit 2 | Bit 1 | Bit 0 | +| --- | --- | --- | --- | +| Handle 4 | Handle 3 | Handle 2 | Handle 1 | + +The value 0 MUST indicate that the actual handle cannot open the door locally. The value 1 MUST indicate that the actual handle can open the door locally. + +Inside Door Handles Mode (4 bits) + +This field is used to advertise the status of each individual inside door handle. + +[This field MUST be treated as a bitmask field and MUST be encoded according to Table 45.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +The value 0 MUST indicate that the actual handle cannot open the door locally. The value 1 MUST indicate that the actual handle can open the door locally. + +Door Condition (8 bits) + +This field is used to advertise the state of the door lock components. + +[This field MUST be encoded according to Table 46.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) Table 46, Door Lock Operation Report::Door Condition bitmask encoding + +| Value | Bit 7..3 | Bit 2 | Bit 1 | Bit 0 | +| --- | --- | --- | --- | --- | +| bit set to ‘0’ | Reserved | Latch Open (out, engaged, extended) | Bolt Locked (out, extended) | Door Open | +| bit set to ‘1’ | Reserved | Latch Closed (in, disengaged, retracted) | Bolt Unlocked (in, retracted) | Door Closed | + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +[If a door component is not advertised as supported in the Door Lock Capabilities Report Command, the](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) corresponding bit MUST be set to 0 and MUST be ignored by a controlling node. + +Lock Timeout Minutes (8 bits) + +This field is used to advertise the remaining time before the door lock mode will automatically be changed to “secured” if operating in timed operation with a timed operation mode. + +[This field MUST be encoded according to Table 47. The remaining time that the sending node will stay](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) in the current mode MUST be determined by combining this field and the Lock Timeout Seconds field. + +Table 47, Door Lock Operation Report::Lock Timeout Minutes encoding + +| Value | Description | +| --- | --- | +| 0..253 (0x00..0xFC) | 0..253 minutes (Operation Type and Current mode = Timed Operation) | +| 254 (0xFE) | Undefined | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A node currently set in a constant operation type mode MUST set this field to 0xFE. + +Lock Timeout Seconds (8 bits) + +This field is used to advertise the remaining time before the door lock mode will automatically be changed to “secured” if operating in timed operation with a timed operation mode. + +[This field MUST be encoded according to Table 48. The remaining time that the sending node will stay](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) in the current mode MUST be determined by combining this field and the Lock Timeout Minutes field. + +Table 48, Door Lock Operation Report::Lock Timeout Seconds encoding + +| Value | Description | +| --- | --- | +| 0..59 (0x00..0x3B) | 0..59 seconds (Operation Type and mode= Timed Operation) | +| 254 (0xFE) | Undefined | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A node currently set in a constant operation type mode MUST set this field to 0xFE. Target Door Lock Mode (8 bits) + +This field is used to advertise the target mode of an ongoing transition or of the most recent transition. + +[This field MUST be encoded according to Table 44. This field MUST be set to the mode specified in the](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) [most-recent received Door Lock Operation Set Command.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +If the node is going to change mode due to the auto-relock functionality or a timed operation, this field MUST NOT advertise the future mode and MUST be set to the same value as the Current Door Lock Mode field. + +If no transition is ongoing, this field MUST be set to the same value as the Current Door Lock Mode field. + +If the Current Door Lock Mode is set to 0xFE, this field MUST indicate the mode is it going to assume when the ongoing transition has been completed. + +Duration (8 bits) + +This field SHOULD advertise the estimated remaining time before the mode indicated in the Target Door Lock Mode field is reached. + +This field MUST be set to 0 if the Target Door Lock Mode and Current Door Lock Mode fields are set to the same value. + +[The encoding of this field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) + +## 4.39.5 Door Lock Configuration Set Command + +This command is used to set the configuration of a supporting door lock node. + +A supporting node MUST be able to operate with the factory default configuration. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CONFIGURATION SET (0x04) _ _ _ | | | | | | | | +| Operation Type | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | +| Auto-relock time 1 (MSB) | | | | | | | | +| Auto-relock time 2 (LSB) | | | | | | | | +| Hold and release time 1 (MSB) | | | | | | | | +| Hold and release time 2 (LSB) | | | | | | | | +| Reserved | | | | | | BTB | TA | + +Operation Type (1 byte) + +This field is used to set the operation type at the supporting node. This field MUST be encoded [according to Table 49.](04.39-door-lock-command-class-version-4.md#4395-door-lock-configuration-set-command) + +Table 49, Door Lock Configuration Set::Operation Type encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x01 | Constant operation | 1 | +| 0x02 | Timed operation | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +If this field is set to timed operation (0x02), the Lock Timeout Minutes and Lock Timeout Seconds fields MUST be set to values different than 0xFE. + +A supporting node MUST ignore this field if it is set to an operation type that is not advertised as [supported in the Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) Outside Door Handles Mode (4 bits) + +This field is used to enable or disable each individual outside door handle at the supporting node. This [field MUST be treated as a bitmask and MUST encoded according to Table 45.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +The value 0 MUST indicate that the actual handle cannot open the door locally. The value 1 MUST indicate that the actual handle can open the door locally. + +A supporting node MUST ignore an outside door handle mode value if it advertises no support for the [corresponding handle in the Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +Inside Door Handles Mode (4 bits) + +This field is used to enable or disable each individual inside door handle at the supporting node. This [field MUST be treated as a bitmask and MUST encoded according to Table 45.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +The value 0 MUST indicate that the actual handle cannot open the door locally. The value 1 MUST indicate that the actual handle can open the door locally. + +A supporting node MUST ignore an inside door handle mode value if it advertises no support for the [corresponding handle in the Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +Lock Timeout Minutes (8 bits) + +This field is used to specify the time that the supporting node must wait before returning to the secured [mode when receiving timed operation modes in a Door Lock Operation Set Command.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +Values in the range 0x00..0xFD MUST indicate the actual number of minutes. The value 0xFE MUST indicate that this field is undefined. + +This field MUST be set to 0xFE if the Operation Type field is set to 0x01 (constant operation) This field MUST be in the range 0x00..0xFD if the Operation Type field is set to 0x02 (timed operation) + +The time to stay unlocked MUST be determined by combining this field and the Lock Timeout Seconds fields. + +A supporting node MUST ignore this field if it is set to the timed operation type is not advertised as [supported in the Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +Lock Timeout Seconds (8 bits) + +This field is used to specify the time that the supporting node must wait before returning to the secured [mode when receiving timed operation modes in a Door Lock Operation Set Command.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +Values in the range 0x00..0x3B MUST indicate the actual number of seconds. The value 0xFE MUST indicate that this field is undefined. + +This field MUST be set to 0xFE if the Operation Type field is set to 0x01 (constant operation) This field MUST be in the range 0x00..0x3B if the Operation Type field is set to 0x02 (timed operation) + +The time to stay unlocked MUST be determined by combining this field and the Lock Timeout Minutes field. + +A supporting node MUST ignore this field if it is set to the timed operation type is not advertised as [supported in the Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) Auto-relock time (16 bits) + +This field is used to specify the time setting in seconds for auto-relock functionality. + +This field MUST be ignored by a node advertising no support for the auto-relock functionality in the [Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +The value 0 MUST indicate that the auto-relock functionality is disabled and the door lock MUST NOT return to secured mode automatically. (unless using Timed Operation) + +Values in the range 1..65535 MUST indicate that the auto-relock functionality is enabled and the supporting node MUST return to secured mode after the time in seconds indicated by this field. + +Hold and release time (16 bits) + +This field is used to specify the time setting in seconds for letting the latch retracted after the supporting node’s mode has been changed to unsecured. + +This field MUST be ignored by a node advertising no support for the hold and release functionality in [the Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +The value 0 MUST indicate that the hold and release functionality is disabled and the supporting node MUST NOT keep the latch retracted when the door lock mode becomes unsecured. + +Values in the range 1..65535 MUST indicate that the hold and release functionality is enabled and the door lock latch MUST keep open according to the time in seconds indicated by this field. + +TA (Twist assist) (1 bit) + +This field MUST indicate if the twist assist functionality is enabled. + +This field MUST be ignored by a node advertising no support for the twist assist functionality in the [Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +The value 0 MUST indicate that the twist assist functionality MUST be disabled at the supporting node. The value 1 MUST indicate that the twist assist functionality MUST be enabled at the supporting node. + +BTB (Block-to-block) (1 bit) + +This field is used to indicate if the block-to-block functionality is enabled. + +This field MUST be ignored by a node advertising no support for the block-to-block functionality in the [Door Lock Capabilities Report Command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +The value 0 MUST indicate that the block-to-block functionality is disabled and the supporting node [MAY ignore Door Lock Operation Set Commands if it detects to be already in the specified mode.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +The value 1 MUST indicate that the block-to-block functionality is enabled and the supporting node [MUST activate its motors until blocked to try to reach the mode indicated by Door Lock Operation Set Commands, even if it detects to be already in the specified mode.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +## 4.39.6 Door Lock Configuration Get Command + +This command is used to request the configuration parameters of a door lock device. + +[The Door Lock Configuration Report Command MUST be returned in response to this command.](04.39-door-lock-command-class-version-4.md#4397-door-lock-configuration-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CONFIGURATION GET (0x05) _ _ _ | | | | | | | | + +## 4.39.7 Door Lock Configuration Report Command + +This command is used to advertise the configuration parameters of a door lock device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CONFIGURATION REPORT (0x06) _ _ _ | | | | | | | | +| Operation Type | | | | | | | | +| Outside Door Handles Mode | | | | Inside Door Handles Mode | | | | +| Lock Timeout Minutes | | | | | | | | +| Lock Timeout Seconds | | | | | | | | +| Auto-relock time 1 (MSB) | | | | | | | | +| Auto-relock time 2 (LSB) | | | | | | | | +| Hold and release time 1 (MSB) | | | | | | | | +| Hold and release time 2 (LSB) | | | | | | | | +| Reserved | | | | | | BTB | TA | + +[Fields in this command MUST be according to descriptions in 4.39.5 Door Lock Configuration Set Command](04.39-door-lock-command-class-version-4.md#4395-door-lock-configuration-set-command) + +## 1.1.2 Door Lock Capabilities Get Command + +This command is used to request the Door Lock capabilities of a supporting node. + +[The Door Lock Capabilities Report Command MUST be returned in response to this command.](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CAPABILITIES GET (0x07) _ _ _ | | | | | | | | + +## 1.1.3 Door Lock Capabilities Report Command + +This command is used to advertise the Door Lock capabilities supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | +| Command = DOOR LOCK CAPABILITIES REPORT (0x08) _ _ _ | | | | | | | | +| Reserved | | | Supported Operation type Bit Mask Length | | | | | +| Supported Operation Type Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Supported Operation Type Bit Mask N | | | | | | | | +| Supported Door Lock Mode List Length | | | | | | | | +| Supported Door Lock Mode 1 | | | | | | | | +| … | | | | | | | | +| Supported Door Lock Mode M | | | | | | | | +| Supported Outside Handle Modes Bitmask | | | | Supported Inside Handle Modes Bitmask | | | | +| Supported door components | | | | | | | | +| Reserved | | | | ARS | HRS | TAS | BTBS | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Supported Operation Type Bit Mask Length (5 bits) + +This field is used to advertise the length in bytes of the Supported Operation Type Bit Mask field carried in the command. This field MUST be set to the minimum value which allows to advertise all supported Operation types. + +Supported Operation Type Bit Mask (N bytes) + +This field is used to advertise the supported Door Lock Operation Types values. The length of this field in bytes MUST match the value advertised in the Supported Operation Type Bit Mask Length field. + +This field MUST be encoded as follows: + + Bit 0 in Bit Mask 1 represents Operation Type 0x00 (Reserved) + + Bit 1 in Bit Mask 1 represents Operation Type 0x01 (Constant operation) + + Bit 2 in Bit Mask 1 represents Operation Type 0x02 (Timed operation) + + … + +[Valid Operation Type values are defined in Table 49.](04.39-door-lock-command-class-version-4.md#4395-door-lock-configuration-set-command) + +If an Operation Type is supported, the corresponding bit MUST be set to ‘1’. If an Operation Type is not supported, the corresponding bit MUST be set to ‘0’. + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +A node MUST support the constant operation type 0x01. + +Supported Door Lock Mode List Length (8 bits) + +This field MUST advertise the length in bytes of the Supported Door Lock Mode field carried in the command. + +Supported Door Lock Mode (M bytes) + +This field is used to advertise the supported Door Lock Modes values. The length of this field in bytes MUST match the value advertised in the Supported Door Lock Mode List Length field. + +[Each byte MUST indicate the value of a supported Door Lock Mode that can be specified in a Door Lock Operation Set Command. Each byte MUST be encoded according to Table 43.](04.39-door-lock-command-class-version-4.md#4392-door-lock-operation-set-command) + +A sending node MUST advertise support for the Door Lock modes 0x00 and 0xFF. Supported Outside Handle Modes Bitmask (4 bits) + +[This field is used to advertise which outside handles can be enabled and disabled using the Door Lock Configuration Set Command.](04.39-door-lock-command-class-version-4.md#4395-door-lock-configuration-set-command) + +[This field MUST be treated as a bitmask and represent outside door handles as described in Table 45.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +If the corresponding handle can be enabled and disabled, the corresponding bit MUST be set to 1. If the corresponding handle cannot be enabled or disabled, the corresponding bit MUST be set to 0. + +Supported Inside Handle Modes Bitmask (4 bits) + +[This field is used to advertise which inside handles can be enabled and disabled using the Door Lock Configuration Set Command.](04.39-door-lock-command-class-version-4.md#4395-door-lock-configuration-set-command) + +[This field MUST be treated as a bitmask and represent inside door handles as described in Table 45.](04.39-door-lock-command-class-version-4.md#4394-door-lock-operation-report-command) + +If the corresponding handle can be enabled, the corresponding bit MUST be set to 1. If the corresponding handle cannot be enabled, the corresponding bit MUST be set to 0. + +Supported Door components (8 bits) + +This field MUST advertise the supported door lock component that can be reported in the Door Lock condition field of the Door Lock Operation Report Command. + +[This field MUST be treated as a bitmask and represent inside door handles as described in Table 50](04.39-door-lock-command-class-version-4.md#113-door-lock-capabilities-report-command) + +Table 50, Door Lock Capabilities Report::Supported Door components encoding + +| Bit 7..3 | Bit 2 | Bit 1 | Bit 0 | +| --- | --- | --- | --- | +| Reserved | Latch | Bolt | Door | + +If the corresponding component is supported, the corresponding bit MUST be set to ‘1’. If the corresponding component is not supported, the corresponding bit MUST be set to ‘0’. ARS (Auto-Relock support) (1 bit) + +This field is used to advertise if the sending node supports the auto-relock functionality. + +The value 1 MUST indicate that the auto-relock functionality is supported. The value 0 MUST indicate that the auto-relock functionality is not supported. + +HRS (Hold and release support) (1 bit) + +This field MUST advertise if the hold and release functionality is supported. + +The value 0 MUST indicate that the hold and release functionality is not supported The value 1 MUST indicate that the hold and release functionality is supported. + +TAS (Twist assist support) (1 bit) + +This field MUST advertise if the Twist Assist functionality is supported. + +The value 0 MUST indicate that the twist assist functionality is not supported The value 1 MUST indicate that the twist assist functionality is supported. + +BTBS (Block-to-block support) (1 bit) + +This field is used to advertise if the block-to-block functionality is supported. + +The value 0 MUST indicate that the block-to-block functionality is not supported The value 1 MUST indicate that the block-to-block functionality is supported. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.40-door-lock-logging-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.40-door-lock-logging-command-class-version-1.md new file mode 100644 index 0000000..f6ce76b --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.40-door-lock-logging-command-class-version-1.md @@ -0,0 +1,171 @@ + +# 4.40 Door Lock Logging Command Class, version 1 + +This Door Lock Logging Command Class provides an audit trail in an access control application. Each time an event takes place at the door lock, the system logs the user's ID, date, time etc. + +## 4.40.1 Door Lock Logging Records Supported Get Command + +This command is used to request the number of records that the audit trail supports. + +The Door Lock Logging Records Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | +| Command = DOOR LOCK LOGGING RECORDS SUPPORTED GET _ _ _ _ _ | | | | | | | | + +## 4.40.2 Door Lock Logging Records Supported Report Command + +This command is used to report the maximum number of reports the audit trail supports. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | +| Command = DOOR LOCK LOGGING RECORDS SUPPORTED REPORT _ _ _ _ _ | | | | | | | | +| Max records stored | | | | | | | | + +Max records stored (8 bits) + +The number of records the audit trail supports stored in a queue. + +## 4.40.3 Door Lock Logging Record Get Command + +This command is used to request the audit trail. + +The Door Lock Logging Record Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | +| Command = RECORD GET _ | | | | | | | | +| Record number | | | | | | | | + +Record number (8 bits) + +The Record number field indicates the record to be requested. + +A value 0 – Max records stored is acceptable with a value of 0 being the most recent entry. When requesting with a value of 0, the report will contain the record number so the latest record is known. + +## 4.40.4 Door Lock Logging Record Report Command + +This command returns records from the audit trail. + +To provide flexibility the user associated with the record may be identified by one of two methods: the user identifier or the user code. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | +| Command = RECORD REPORT _ | | | | | | | | +| Record number | | | | | | | | +| Timestamp - Year 1 | | | | | | | | +| Timestamp - Year 2 | | | | | | | | +| Timestamp – Month | | | | | | | | +| Timestamp – Day | | | | | | | | +| Record status | | | Timestamp - Hour Local Time | | | | | +| Timestamp - Minute Local Time | | | | | | | | +| Timestamp - Second Local Time | | | | | | | | +| Event Type | | | | | | | | +| User Identifier | | | | | | | | +| User Code Length | | | | | | | | +| USER CODE 1 _ | | | | | | | | +| .. | | | | | | | | +| USER CODE N _ | | | | | | | | + +Record number (8 bits) + +Record number requested (1- 255). + +Timestamp - Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Timestamp - Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). + +Timestamp - Day (8 bits) + +Specify the day of the month between 01 and 31. Record status (3-bits) + +The Record Status field is used to indicate if legal data is stored in the record. + +| Record State | Description | +| --- | --- | +| 0 | Requested record is empty. | +| 1 | Requested record holds legal data. | + +Timestamp - Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00-23) in local time. + +Timestamp - Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. + +Timestamp - Second Local Time (8 bits) + +Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. + +Note: If RTC (Real Time Clock) all values in Time Stamp record SHOULD be set to 0. Most recent Record MUST be stored under Record Number 1. + +User Identifier (8 bits) + +The User Identifier is used to recognize the user identity. A valid User Identifier MUST be a value starting from 1 to the maximum number of users supported by the device; refer to the User Code Command Class. A User Identifier of 0 is acceptable when the record does not need to identify a user or if the User Code is provided in this report. + +User Code Length (8 bits) + +The User Code Length field indicates the number of bytes used to hold the User Code. A length of 0 is acceptable when the record does not need to identify a User Code or when the User Identifier field is non-zero. + +USER_CODE (N bytes) + +These fields contain the user code. Minimum code length is 4 and maximum 10 ASCII digits. For further details about the user code, refer to the User Code Command Class. Event Type (8 bits) + +[This field MUST be encoded according to Table 51.](04.40-door-lock-logging-command-class-version-1.md#4404-door-lock-logging-record-report-command) + +Table 51, Door Lock Logging Record Report::Event Type encoding + +| Event type | Description | +| --- | --- | +| 1 | Lock Command: Keypad access code verified lock command | +| 2 | Unlock Command: Keypad access code verified unlock command | +| 3 | Lock Command: Keypad lock button pressed | +| 4 | Unlock command: Keypad unlock button pressed | +| 5 | Lock Command: Keypad access code out of schedule | +| 6 | Unlock Command: Keypad access code out of schedule | +| 7 | Keypad illegal access code entered | +| 8 | Key or latch operation locked (manual) | +| 9 | Key or latch operation unlocked (manual) | +| 10 | Auto lock operation | +| 11 | Auto unlock operation | +| 12 | Lock Command: Z-Wave access code verified | +| 13 | Unlock Command: Z-Wave access code verified | +| 14 | Lock Command: Z-Wave (no code) | +| 15 | Unlock Command: Z-Wave (no code) | +| 16 | Lock Command: Z-Wave access code out of schedule | +| 17 | Unlock Command Z-Wave access code out of schedule | +| 18 | Z-Wave illegal access code entered | +| 19 | Key or latch operation locked (manual) | +| 20 | Key or latch operation unlocked (manual) | +| 21 | Lock secured | +| 22 | Lock unsecured | +| 23 | User code added | +| 24 | User code deleted | +| 25 | All user codes deleted | +| 26 | Master code changed | +| 27 | User code changed | +| 28 | Lock reset | +| 29 | Configuration changed | +| 30 | Low battery | +| 31 | New Battery installed | + +Not all events types are supported and it is up to manufacturer to decide which ones are to be supported. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.41-energy-production-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.41-energy-production-command-class-version-1.md new file mode 100644 index 0000000..812f580 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.41-energy-production-command-class-version-1.md @@ -0,0 +1,79 @@ + +# 4.41 Energy Production Command Class, version 1 + +The Energy Production Command Class is used to retrieve various production data from the device. + +## 4.41.1 Energy Production Get Command + +This command is used to request various production data from the device. + +The Energy Production Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENERGY PRODUCTION _ _ _ | | | | | | | | +| Command = ENERGY PRODUCTION GET _ _ | | | | | | | | +| Parameter Number | | | | | | | | + +Parameter Number (8 bits) + +The parameter number specifies the kind of production data to retrieve. Currently the following parameter numbers are defined: + +| Parameter Number | Description | +| --- | --- | +| 0x00 | Instant energy production | +| 0x01 | Total energy production | +| 0x02 | Energy production today | +| 0x03 | Total production time | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.41.2 Energy Production Report Command + +This command is used to retrieve various production data from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENERGY PRODUCTION _ _ _ | | | | | | | | +| Command = ENERGY PRODUCTION REPORT _ _ | | | | | | | | +| Parameter Number | | | | | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| … | | | | | | | | +| Value N | | | | | | | | + +Parameter Number (8 bits) + +Refer to description under the Energy Production Get Command. + +Precision (3 bits) + +The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Scale (2 bits) + +The Scale field indicates the scale used for the specified parameter number: + +| Parameter Number | Scale | Description | +| --- | --- | --- | +| 0x00 | 0x00 | W | +| 0x01 | 0x00 | Wh | +| 0x02 | 0x00 | Wh | +| 0x03 | 0x00 | Seconds | +| | 0x01 | Hours | + +Size (3 bits) + +The size field indicates the number of bytes used for the value. This field can take values from 1 (001b), 2 (010b) or 4 (100b). + +Value (N bytes) + +[The value is MUST be treated as a signed field (Table 10). The field MAY be 1, 2 or 4 bytes in size. The](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) first byte is the most significant byte. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.33-entry-control-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.42-entry-control-command-class-version-1.md similarity index 55% rename from docs/specs/command-class-specification/04-command-class-definitions/04.33-entry-control-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.42-entry-control-command-class-version-1.md index 5dbbf79..6282bd7 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.33-entry-control-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.42-entry-control-command-class-version-1.md @@ -1,11 +1,11 @@ -# 4.33 Entry Control Command Class, version 1 +# 4.42 Entry Control Command Class, version 1 The Entry Control Command Class defines a method for advertising user input to a central Entry Control application and for the discovery of capabilities. User input may be button presses, RFID tags or other means. @@ -13,13 +13,15 @@ It is RECOMMENDED that this command class is only supported via secure communica The Entry Control Command Class provides the following commands: - Key Supported Get/Report – Used by the controller to request which ASCII keys are present on the Entry Control device.  Event Supported Get/Report – Used by the controller to request which Event Types are supported by the Entry Control device.  Configuration Set/Get/Report – Used by the controller to configure the Entry Control device  Notification Command – Used by the Entry Control device to notify the controller of inputs. +Key Supported Get/Report – Used by the controller to request which ASCII keys are present on  the Entry Control device. Event Supported Get/Report – Used by the controller to request which Event Types are  supported by the Entry Control device. Configuration Set/Get/Report – Used by the controller to configure the Entry Control device   Notification Command – Used by the Entry Control device to notify the controller of inputs. -## 4.33.1 Interoperability Considerations +## 4.42.1 Interoperability Considerations It is RECOMMENDED that an Entry Control input device that implements the Entry Control Command Class also implements the Indicator Command Class, version 2. -If implementing the Indicator Command Class, version 2, it is RECOMMENDED that all indicator resources are addressable via the Indicator Command Class, version 2. The input device MAY implement local control of indicator resources. If the Indicator Command Class, version 2 is supported, the first received Indicator Set command MUST disable all local control of indicator resources – except for interface feedback functionality like a short beep on each button press. +If implementing the Indicator Command Class, version 2, it is RECOMMENDED that all indicator resources are addressable via the Indicator Command Class, version 2. + +The input device MAY implement local control of indicator resources. If the Indicator Command Class, version 2 is supported, the first received Indicator Set command MUST disable all local control of indicator resources – except for interface feedback functionality like a short beep on each button press. Transmissions may fail due to central control application fault or due to RF jamming. It is RECOMMENDED that an Entry Control input device provides local user feedback if the transmission of notifications to the central control application fails. @@ -29,11 +31,11 @@ If the device features a buzzer, it is RECOMMENDED that the buzzer generates sou If implementing the indicator Command Class, version 2, in devices based on Role Type RSS (using Wakeup Command Class), the control of indicators must be synchronized with the Wakeup Notification. The controller must therefore wait for the Wakeup Notification, before it can control the indictors. The device implementing the indicator Command Class must therefore send the Wakeup Notification after sending the Entry Control Notification Command, in case the device expects to be controlled. -## 4.33.2 Security Considerations +## 4.42.2 Security Considerations An attacker could theoretically determine the length of manually entered user credentials even if they are transmitted via encryption. It is therefore MANDATORY to add padding bytes to ASCII strings so that all transferred ASCII strings are structured as one or more blocks of 16 characters. The ASCII code 0xFF MUST be reserved for padding purposes and it MUST NOT be used for any other purposes. -## 4.33.3 Handling user supplied data +## 4.42.3 Handling user supplied data The Entry Control device must cache the user input before sending the full entry in one Notification Frame. A user input MUST therefore have a termination, which MAY be determined by: @@ -61,29 +63,27 @@ When presenting an RFID tag, the ID will be read from the tag, and this terminat Presenting an RFID tag may also terminate an ongoing user input. For instance, a user may enter four characters and subsequently present an RFID tag. In that case, the four entries must first be sent in one Notification Frame, and subsequently the ID ‘s from the RFID tag data is sent in a second Notification Frame. -## 4.33.4 Handling Incorrect Entry - -A user may do an incorrect entry e.g. the credential is 1234 but the user enters 1734. In this case the terminal may provide a “delete” option, to allow the user to fix or re-enter the credential. If a “delete” option is not provided, the invalid code must first be send, followed by a new (correct) entry. +## 4.42.4 Handling Incorrect Entry -The terminal must not assume that the receiving controller does error handling like 1+7+Delete+2+3+4 = 1234. +A user may do an incorrect entry e.g. the credential is 1234 but the user enters 1734. In this case the terminal may provide a “delete” option, to allow the user to fix or re-enter the credential. If a “delete” option is not provided, the invalid code must first be send, followed by a new (correct) entry. The terminal must not assume that the receiving controller does error handling like 1+7+Delete+2+3+4 = 1234. -## 4.33.5 Entry Control Notification Command +## 4.42.5 Entry Control Notification Command This command is used to advertise user input. Depending on the Event Type, this command MAY carry manually entered user credentials. -| | 7 | | | 6 | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | Data Type | | | | | | -| Event Type | | | | | | | | | | | | | | | | | | | | | | -| Event Data Length | | | | | | | | | | | | | | | | | | | | | | -| Event Data 1 (optional) | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | -| Event Data N (optional) | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL NOTIFICATION _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Reserved | | | | | | Data Type | | +| Event Type | | | | | | | | +| Event Data Length | | | | | | | | +| Event Data 1 (optional) | | | | | | | | +| ... | | | | | | | | +| Event Data N (optional) | | | | | | | | Sequence Number (8 bit) @@ -93,26 +93,26 @@ The value MUST be in the range 0..255. The initial value MAY be any value in the Reserved -This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. - -Data Type (2 bits) +This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. Data Type (2 bits) This field is used to advertise the type of data (if any) that is appended to this command. -Table 41, Entry Control Notification :: Event Data Type +Table 52, Entry Control Notification :: Event Data Type -| | Data Type | | Description | | -| --- | --- | --- | --- | --- | -| 0x00 | | NA | No data included | | -| 0x01 | | RAW | 1 to 32 bytes of arbitrary binary data | | -| 0x02 | | ASCII | 1 to 32 ASCII encoded characters. ASCII codes MUST be in the value range 0x00- 0xF7. The string MUST be padded with the value 0xFF to fit 16 byte blocks when sent in a notification. | | -| 0x03 | | MD5 | 16 byte binary data encoded as a MD5 hash value. | | +| Data Type | | Description | +| --- | --- | --- | +| 0x00 | NA | No data included | +| 0x01 | RAW | 1 to 32 bytes of arbitrary binary data | +| 0x02 | ASCII | 1 to 32 ASCII encoded characters. ASCII codes MUST be in the value range 0x00- 0xF7. The string MUST be padded with the value 0xFF to fit 16 byte blocks when sent in a notification. | +| 0x03 | MD5 | 16 byte binary data encoded as a MD5 hash value. | + +All other values are reserved and MUST NOT be used by a sending device. Reserved values MUST be ignored by a receiving device. -All other values are reserved and MUST NOT be used by a sending device. Reserved values MUST be ignored by a receiving device. Event Type (4 bit) +Event Type (4 bit) This field is used to advertise the actual Event Type. -[The field MUST be encoded according to section 4.33.13](04.33-entry-control-command-class-version-1.md#43313-event-types) +[The field MUST be encoded according to section 4.42.13](04.42-entry-control-command-class-version-1.md#44213-event-types) Event Data Length (8 bit) @@ -126,7 +126,7 @@ This field is used to carry data related to the event, e.g. received from an RFI The length of this field MUST comply with the length advertised by the Event Data Length field. The format of this field MUST comply with the data format advertised by the Data Type field. -## 4.33.6 Entry Control Key Supported Get Command +## 4.42.6 Entry Control Key Supported Get Command This command is used to query the keys that a device implements for entry of user credentials. @@ -134,25 +134,25 @@ The Entry Control Key Supported Report command MUST be returned in response to t This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL KEY SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL KEY SUPPORTED GET _ _ _ _ | | | | | | | | -## 4.33.7 Entry Control Key Supported Report Command +## 4.42.7 Entry Control Key Supported Report Command This command is used to advertise the keys that a device implements for entry of user credentials. A management interface may determine the available keys for credential entry from this command. The range of available Command Keys may be determined via the Entry Control Event Supported Report Command. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL KEY SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Key Supported Bit Mask Length | | | | | | | | | | | | | | | | | | | | | | | | -| Key Supported Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Key Supported Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL KEY SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Key Supported Bit Mask Length | | | | | | | | +| Key Supported Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Key Supported Bit Mask N | | | | | | | | Key Supported Bit Mask Length @@ -166,11 +166,9 @@ This field is used to advertise the keys that a device implements for entry of u The Key Supported Bit Mask field MUST advertise ASCII codes that represent the supported keys. - Bit 0 in Bit Mask 1 indicates that the supporting device may issue ASCII code 0  Bit 1 in Bit Mask 1 indicates that the supporting device may issue ASCII code 1  … + Bit 0 in Bit Mask 1 indicates that the supporting device may issue ASCII code 0  Bit 1 in Bit Mask 1 indicates that the supporting device may issue ASCII code 1  …  Bit 7 in Bit Mask 16 indicates that the supporting device may issue ASCII code 127 - Bit 7 in Bit Mask 16 indicates that the supporting device may issue ASCII code 127 - -## 4.33.8 Entry Control Event Supported Get Command +## 4.42.8 Entry Control Event Supported Get Command This command is used to request the supported Events of a device. @@ -178,31 +176,31 @@ The Entry Control Event Supported Report command MUST be returned in response to This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL EVENT SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL EVENT SUPPORTED GET _ _ _ _ | | | | | | | | -## 4.33.9 Entry Control Event Supported Report Command +## 4.42.9 Entry Control Event Supported Report Command This command is used to advertise the supported Event Types. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL EVENT SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Data Type Supported Bit Mask Length | | | | | | -| Data Type Supported Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Data Type Supported Bit Mask M | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Event Supported Bit Mask Length | | | | | | | | | | | | | | | -| Event Type Supported Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Event Type Supported Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cached Size supported Minimum | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cached Size supported Maximum | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cached Timeout supported Minimum | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cached Timeout supported Maximum | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL EVENT SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Reserved | | | | | | Data Type Supported Bit Mask Length | | +| Data Type Supported Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Data Type Supported Bit Mask M | | | | | | | | +| Reserved | | | Event Supported Bit Mask Length | | | | | +| Event Type Supported Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Event Type Supported Bit Mask N | | | | | | | | +| Key Cached Size supported Minimum | | | | | | | | +| Key Cached Size supported Maximum | | | | | | | | +| Key Cached Timeout supported Minimum | | | | | | | | +| Key Cached Timeout supported Maximum | | | | | | | | Data Type Supported Bit Mask Length (2 bits) @@ -218,7 +216,7 @@ This field is used to advertise the supported Data Types.  Bit 0 in Bit Mask 1 indicates if Data Type 0 is supported  Bit 1 in Bit Mask 1 indicates if Data Type 1 is supported  … -[For the definition of Data Type IDs, refer to Table 41.](04.33-entry-control-command-class-version-1.md#4335-entry-control-notification-command) Event Type Supported Bit Mask Length (1 byte) +[For the definition of Data Type IDs, refer to Table 52.](04.42-entry-control-command-class-version-1.md#4425-entry-control-notification-command) Event Type Supported Bit Mask Length (1 byte) This field is used to advertise the number of Event Type Supported Bit Mask Bytes to follow. @@ -228,34 +226,34 @@ This field is used to advertise the supported Event Type.  Bit 0 in Bit Mask 1 indicates if Event Type 0 is supported  Bit 1 in Bit Mask 1 indicates if Event Type 1 is supported  … -[For the definition of Event Type IDs, refer to Table 42.](04.33-entry-control-command-class-version-1.md#43313-event-types) +[For the definition of Event Type IDs, refer to Table 53.](04.42-entry-control-command-class-version-1.md#44213-event-types) Key Cached Size Supported Minimum -The minimum configurable number of key entries before the CACHED_KEYS notification is sent. [Refer to 4.33.10](04.33-entry-control-command-class-version-1.md#43310-entry-control-configuration-set-command) +The minimum configurable number of key entries before the CACHED_KEYS notification is sent. [Refer to 4.42.10](04.42-entry-control-command-class-version-1.md#44210-entry-control-configuration-set-command) Key Cached Size Supported Maximum -The maximum configurable number of key entries before the CACHED_KEYS notification is sent. [Refer to 4.33.10](04.33-entry-control-command-class-version-1.md#43310-entry-control-configuration-set-command) +The maximum configurable number of key entries before the CACHED_KEYS notification is sent. [Refer to 4.42.10](04.42-entry-control-command-class-version-1.md#44210-entry-control-configuration-set-command) Key Cached Timeout Supported Minimum -The minimum configurable timeout before the CACHED_KEYS notification is sent. [Refer to 4.33.10](04.33-entry-control-command-class-version-1.md#43310-entry-control-configuration-set-command) +The minimum configurable timeout before the CACHED_KEYS notification is sent. [Refer to 4.42.10](04.42-entry-control-command-class-version-1.md#44210-entry-control-configuration-set-command) Key Cached Timeout Supported Maximum -The maximum configurable timeout before the CACHED_KEYS notification is sent. [Refer to 4.33.10](04.33-entry-control-command-class-version-1.md#43310-entry-control-configuration-set-command) +The maximum configurable timeout before the CACHED_KEYS notification is sent. [Refer to 4.42.10](04.42-entry-control-command-class-version-1.md#44210-entry-control-configuration-set-command) -## 4.33.10 Entry Control Configuration Set Command +## 4.42.10 Entry Control Configuration Set Command This command is used to configure Event Type specific parameters. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL CONFIGURATION SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cache Size | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cache Timeout | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL CONFIGURATION SET _ _ _ | | | | | | | | +| Key Cache Size | | | | | | | | +| Key Cache Timeout | | | | | | | | Key Cache Size (1 byte) @@ -273,7 +271,7 @@ The Key Cache Timeout MUST be measured from the most recent reception of a chara The value SHOULD be in the range 1..10 seconds. The default value SHOULD be 2 seconds. -## 4.33.11 Entry Control Configuration Get Command +## 4.42.11 Entry Control Configuration Get Command This command is used to request the operational mode of a device. @@ -281,65 +279,66 @@ The Entry Control Configuration Report command MUST be returned in response to t This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL CONFIGURATION GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL CONFIGURATION GET _ _ _ | | | | | | | | -## 4.33.12 Entry Control Configuration Report Command +## 4.42.12 Entry Control Configuration Report Command This command is used to advertise the current operational mode of a device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENTRY CONTROL CONFIGURATION REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cache Size | | | | | | | | | | | | | | | | | | | | | | | | -| Key Cache Timeout | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ENTRY CONTROL _ _ _ | | | | | | | | +| Command = ENTRY CONTROL CONFIGURATION REPORT _ _ _ | | | | | | | | +| Key Cache Size | | | | | | | | +| Key Cache Timeout | | | | | | | | Key Cache Size (1 byte) -[Refer to 4.33.10 Entry Control Configuration Set Command.](04.33-entry-control-command-class-version-1.md#43310-entry-control-configuration-set-command) +[Refer to 4.42.10 Entry Control Configuration Set Command.](04.42-entry-control-command-class-version-1.md#44210-entry-control-configuration-set-command) Key Cache Timeout (1 byte) -[Refer to 4.33.10 Entry Control Configuration Set Command.](04.33-entry-control-command-class-version-1.md#43310-entry-control-configuration-set-command) - -## 4.33.13 Event Types - -[The Event Types MUST be encoded according to Table 42.](04.33-entry-control-command-class-version-1.md#43313-event-types) - -Table 42, Event Type and Event identifiers - -| Event Type | | | | Recommended | | | Event Data | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | | | | Button Label | | | (optional) | | -| 0x00 | CACHING | | - | | | - | | | -| 0x01 | CACHED KEYS _ | | - | | | ASCII bytes | | | -| 0x02 | ENTER | | Enter | | | ASCII bytes | | | -| 0x03 | DISARM ALL _ | | Disarm | | | ASCII bytes | | | -| 0x04 | ARM ALL _ | | Arm | | | ASCII bytes | | | -| 0x05 | ARM AWAY _ | | Away | | | ASCII bytes | | | -| 0x06 | ARM HOME _ | | Home | | | ASCII bytes | | | -| 0x07 | EXIT DELAY _ | | Arm Delay _ | | | ASCII bytes | | | -| 0x08 | ARM 1 _ | | Arm zone 1 | | | ASCII bytes | | | -| 0x09 | ARM 2 _ | | Arm zone 2 | | | ASCII bytes | | | -| 0x0A | ARM 3 _ | | Arm zone 3 | | | ASCII bytes | | | -| 0x0B | ARM 4 _ | | Arm zone 4 | | | ASCII bytes | | | -| 0x0C | ARM 5 _ | | Arm zone 5 | | | ASCII bytes | | | -| 0x0D | ARM 6 _ | | Arm zone 6 | | | ASCII bytes | | | -| 0x0E | RFID | | - | | | As advertised by the Data Type field | | | -| 0x0F | BELL | |  | | | - | | | -| 0x10 | FIRE | | Fire | | | - | | | -| 0x11 | POLICE | | Police | | | - | | | -| 0x12 | ALERT PANIC _ | | | | | - | | | -| 0x13 | ALERT MEDICAL _ | | | | | - | | | -| 0x14 | GATE OPEN _ | | Open, Up. ’O’ or similar | | | ASCII bytes | | | -| 0x15 | GATE CLOSE _ | | Close, Down, ’C’ or similar | | | ASCII bytes | | | -| 0x16 | LOCK | | | | | ASCII bytes | | | -| 0x17 | UNLOCK | | | | | ASCII bytes | | | -| 0x18 | TEST | | Test | | | ASCII bytes | | | -| 0x19 | CANCEL | | Cancel | | | ASCII bytes | | | +[Refer to 4.42.10 Entry Control Configuration Set Command.](04.42-entry-control-command-class-version-1.md#44210-entry-control-configuration-set-command) + +## 4.42.13 Event Types + +[The Event Types MUST be encoded according to Table 53.](04.42-entry-control-command-class-version-1.md#44213-event-types) + +Table 53, Event Type and Event identifiers + +| Event Type | | | Recommended Button Label | Event Data (optional) | +| --- | --- | --- | --- | --- | +| 0x00 | CACHING | | - | - | +| 0x01 | CACHED KEYS _ | | - | ASCII bytes | +| 0x02 | ENTER | | Enter | ASCII bytes | +| 0x03 | DISARM ALL _ | | Disarm | ASCII bytes | +| 0x04 | ARM ALL _ | | Arm | ASCII bytes | +| 0x05 | ARM AWAY _ | | Away | ASCII bytes | +| 0x06 | ARM HOME _ | | Home | ASCII bytes | +| 0x07 | EXIT DELAY _ | | Arm Delay _ | ASCII bytes | +| 0x08 | ARM 1 _ | | Arm zone 1 | ASCII bytes | +| 0x09 | ARM 2 _ | | Arm zone 2 | ASCII bytes | +| 0x0A | ARM 3 _ | | Arm zone 3 | ASCII bytes | +| 0x0B | ARM 4 _ | | Arm zone 4 | ASCII bytes | +| 0x0C | ARM 5 _ | | Arm zone 5 | ASCII bytes | +| 0x0D | ARM 6 _ | | Arm zone 6 | ASCII bytes | +| 0x0E | RFID | | - | As advertised by the Data Type field | +| 0x0F | BELL | |  | - | +| 0x10 | FIRE | | Fire | - | +| 0x11 | POLICE | | Police | - | +| 0x12 | ALERT PANIC _ | | | - | +| 0x13 | ALERT MEDICAL _ | | | - | +| 0x14 | GATE OPEN _ | | Open, Up. ’O’ or similar | ASCII bytes | +| 0x15 | GATE CLOSE _ | | Close, Down, ’C’ or similar | ASCII bytes | +| 0x16 | LOCK | | | ASCII bytes | +| 0x17 | UNLOCK | | | ASCII bytes | +| 0x18 | TEST | | Test | ASCII bytes | + +| 0x19 | CANCEL | Cancel | ASCII bytes | +| --- | --- | --- | --- | All other values are reserved and MUST NOT be used by a sending device. Reserved values MUST be ignored by a receiving device. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.01-generic-schedule-capabilities-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.01-generic-schedule-capabilities-get-command.md new file mode 100644 index 0000000..4b141ea --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.01-generic-schedule-capabilities-get-command.md @@ -0,0 +1,19 @@ + +# 1.1.1 Generic Schedule Capabilities Get Command + +This command is used to request the scheduling capabilities of a supporting node. + +[The Generic Schedule Capabilities Report Command MUST be returned in response to this command.](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE CAPABILITIES GET _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.02-generic-schedule-capabilities-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.02-generic-schedule-capabilities-report-command.md new file mode 100644 index 0000000..68d1486 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.02-generic-schedule-capabilities-report-command.md @@ -0,0 +1,59 @@ + +# 1.1.2 Generic Schedule Capabilities Report Command + +This command is used to advertise the number of supported Schedule Slot IDs for each Schedule Type/User Identifier by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE CAPABILITIES REPORT _ _ _ | | | | | | | | +| Number of supported Schedule IDs (MSB) | | | | | | | | +| Number of supported Schedule IDs (LSB) | | | | | | | | +| Res | Number of supported Time Range IDs (MSB) | | | | | | | +| Number of supported Time Range IDs (LSB) | | | | | | | | +| Number of supported Time Ranges per Schedule | | | | | | | | +| Reserved | | | | | Week- days | Date | Hour & Minute | + +Number of supported Schedule IDs (16 bits) + +This field is used to indicate how many Schedule IDs are supported by a supporting node. + +This field MUST be in the range 1..65535. + +Number of supported Time Range IDs (15 bits) + +This field is used to indicate how many Time Ranges IDs are supported by a supporting node. + +This field MUST be in the range 1.. 32767. + +The number of supported Time Ranges IDs should be equal or greater than the (Number of supported Schedule IDs) x (Number of supported Time Ranges per Schedule) + +Number of supported Time Ranges per Schedule (8 bits) + +This field is used to indicate how many time ranges can be used as part of 1 schedule. + +This field MUST be in the range 1..255. + +Weekdays (1 bit) + +This field is used to indicate if the supporting node can accept weekdays in the time ranges. + +The value 0 MUST indicate that weekdays are not supported in time ranges and will be ignored. The value 1 MUST indicate that weekdays are supported in time ranges. Date (1 bit) + +This field is used to indicate if the supporting node can accept years, month and day parameters in the time ranges. + +The value 0 MUST indicate that start/stop dates are not supported in time ranges and will be ignored. The value 1 MUST indicate that start/stop dates are supported in time ranges. + +Hour & Minute (1 bit) + +This field is used to indicate if the supporting node can accept start and stop hours/minutes in the time ranges. + +The value 0 MUST indicate that start/stop hours/minutes are not supported in time ranges and will be ignored. The value 1 MUST indicate that start/stop hours/minutes are supported in time ranges. + +A supporting node MUST advertise support for at least 1 scheduling parameter (Weekdays, Date, Hour & Minute). diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.03-generic-schedule-time-range-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.03-generic-schedule-time-range-set-command.md new file mode 100644 index 0000000..faf4b23 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.03-generic-schedule-time-range-set-command.md @@ -0,0 +1,196 @@ + +# 1.1.3 Generic Schedule Time Range Set Command + +This command is used to configure a Time Range for a supporting node. + +A Time Range MUST be active when all the conditions indicated in its configuration are fulfilled. Some [examples are provided in 4.43.2.1.](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE TIME RANGE SET _ _ _ _ | | | | | | | | +| Res | Time Range ID 1 (MSB) | | | | | | | +| Time Range ID 2 (LSB) | | | | | | | | +| In use | Weekday bitmask | | | | | | | +| In use | Start Year (MSB) | | | | | | | +| Start Year (LSB) | | | | | | | | +| In use | Stop Year (MSB) | | | | | | | +| Stop Year (LSB) | | | | | | | | +| In use | Reserved | | | Start Month | | | | +| In use | Reserved | | | Stop Month | | | | +| In use | Reserved | | Start Day | | | | | +| In use | Reserved | | Stop Day | | | | | +| In use | Reserved | | Start Hour | | | | | +| In use | Reserved | | Stop Hour | | | | | +| In use | Res | Start Minute | | | | | | +| In use | Res | Stop Minute | | | | | | +| In use | Reserved | | Daily Start Hour | | | | | +| In use | Reserved | | Daily Stop Hour | | | | | +| In use | Res | Daily Start Minute | | | | | | +| In use | Res | Daily Stop Minute | | | | | | + +Res / Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Time Range ID (15 bits) + +This field is used to indicate which Time Range ID to use for the Time Range being set. + +This field MUST be in the range 0..[Number of supported Time Range IDs]. + +The value 0 MUST indicate that the supporting node MUST erase all configured Time Ranges. In this case, all other fields MUST be set to 0 and ignored by a receiving node. Values in the range 1..[Number of supported Time Range IDs] MUST indicate the actual Time Range ID to configure. + +If a non-supported Time Range ID is specified in this command, a receiving node MUST ignore the command. + +In use (15 x 1 bit) + +This field is used to indicate if the corresponding scheduling parameter must be used in the Time Range being set. + +This field MUST apply to the scheduling parameter being part of the same byte. E.g. the “in use” field part of the byte comprising the Weekday bitmask field MUST indicate if the Weekday bitmask parameter MUST be used and applied to the current Time Range. + +The value 0 MUST indicate that the corresponding field is set to 0 and MUST be ignored. The value 1 MUST indicate that the corresponding field is set to a valid value and MUST be applied for the actual Time Range ID. + +All “in use” fields set to 0 MUST indicate to erase a Time Range configuration. Weekday bitmask (7 bits) + +This field is used to indicate on which days the actual Time Range ID MUST be active. + +[This field MUST be treated as a bitmask and encoded according to Table 54.](01.01.03-generic-schedule-time-range-set-command.md#113-generic-schedule-time-range-set-command) + +Table 54, Generic Schedule Set::Weekday bitmask encoding + +| Bit # | Weekday | +| --- | --- | +| Bit 0 | Sunday | +| Bit 1 | Monday | +| Bit 2 | Tuesday | +| Bit 3 | Wednesday | +| Bit 4 | Thursday | +| Bit 5 | Friday | +| Bit 6 | Saturday | + +If the corresponding In use field is set to 1: + + The value 0 MUST indicate that the Time Range MUST NOT be active during the corresponding weekday.  The value 1 MUST indicate that the Time Range MUST be active during the corresponding weekday. + +If the corresponding In use field is set to 0, the Time Range MUST be active regardless of the current weekday. + +A supporting node MUST ignore this field if it advertises no support for the weekday scheduling [parameter in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +Start Year (15 bits) + +This field is used to indicate the start year for the actual Time Range ID. + +If the corresponding In use field is set to 1, the fields MUST indicate that the Time Range ID MUST be [use this field as parameter. Refer to 4.43.2.1 for details. This field MUST be encoded using unsigned](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) representation. + +If the corresponding In use field is set to 0, the Time Range MUST ignore this parameter. + +A supporting node MUST ignore this field if it advertises no support for the Date scheduling parameters [in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) Stop Year (15 bits) + +This field is used to indicate the stop year for the actual Time Range ID. + +If the corresponding In use field is set to 1, the fields MUST indicate that the Time Range ID MUST be [use this field as parameter. Refer to 4.43.2.1 for details. This field MUST be encoded using unsigned](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) representation. + +If the corresponding In use field is set to 0, the Time Range MUST ignore this parameter. + +A supporting node MUST ignore this field if it advertises no support for the Date scheduling parameters [in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +Start Month (4 bits) + +This field is used to indicate the start month for the actual Time Range ID. + +If the corresponding In use field is set to 1, the fields MUST indicate that the Time Range ID MUST be [use this field as parameter. Refer to 4.43.2.1 for details. The values 1..12 MUST represent respectively](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) January..December. + +If the corresponding In use field is set to 0, the Time Range MUST ignore this parameter. + +A supporting node MUST ignore this field if it advertises no support for the Date scheduling parameters [in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +Stop Month (4 bits) + +This field is used to indicate the stop month for the actual Time Range ID. + +If the corresponding In use field is set to 1, the fields MUST indicate that the Time Range ID MUST be [use this field as parameter. Refer to 4.43.2.1 for details. The values 1..12 MUST represent respectively](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) January..December. + +If the corresponding In use field is set to 0, the Time Range MUST ignore this parameter. + +A supporting node MUST ignore this field if it advertises no support for the Date scheduling parameters [in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +Start Day (5 bits) + +This field is used to indicate the start day of the month for the actual Time Range ID. + +If the corresponding In use field is set to 1, the fields MUST indicate that the Time Range ID MUST be [use this field as parameter. Refer to 4.43.2.1 for details. The field MUST be in the range 1..31.](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) + +If the corresponding In use field is set to 0, the Time Range MUST ignore this parameter. + +A supporting node MUST ignore this field if it advertises no support for the Date scheduling parameters [in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) Stop Day (5 bits) + +This field is used to indicate the stop day of the month for the actual Time Range ID. + +If the corresponding In use field is set to 1, the fields MUST indicate that the Time Range ID MUST be [use this field as parameter. Refer to 4.43.2.1 for details. The field MUST be in the range 1..31.](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) + +If the corresponding In use field is set to 0, the Time Range MUST ignore this parameter. + +A supporting node MUST ignore this field if it advertises no support for the Date scheduling parameters [in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +Start Hour /Stop Hour (5 bits) & Start Minute / Stop Minute (6 bits) + +These fields are used to indicate from and until which times the actual Time Range ID MUST be active. + +If the corresponding In use field is set to 1: + + The Start Hour / Stop Hour fields MUST be in the range 0..23.  The Start Minute / Stop Minute fields MUST be in the range 0..59. + +If the corresponding In use field is set to 0, the corresponding field MUST be ignored by the Time Range. + +A supporting node MUST ignore this field if it advertises no support for the Hour & Minute scheduling [parameter in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +Daily Start Hour /Stop Hour (5 bits) & Daily Start Minute / Stop Minute (6 bits) + +These fields are used to indicate in which time range the actual Time Range ID MUST be active. + +If the corresponding In use field is set to 1: + + The fields MUST indicate that the Time Range ID MUST be active daily between the 2 specified hour and minutes times. (e.g. from the 08:00 to 16:30)  The Start Hour / Stop Hour fields MUST be in the range 0..23.  The Start Minute / Stop Minute fields MUST be in the range 0..59. + +If the corresponding In use field is set to 0, the corresponding field MUST be ignored by the Time Range. + +A supporting node MUST ignore this field if it advertises no support for the Hour & Minute scheduling [parameter in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +## 4.43.2.1 Time Range parameters and rules + +Time Ranges MUST be active when all their scheduling parameters are matching the conditions. We [define the parameter groups shown in Table 55.](01.01.03-generic-schedule-time-range-set-command.md#44321-time-range-parameters-and-rules) + +Table 55, Generic Schedule Set Command::Parameter groups + +| Parameter group | Fields | +| --- | --- | +| Daily Start time | Daily Start Hour Daily Start Minute | +| Daily Stop time | Daily Stop Hour Daily Stop Minute | +| Start Datetime | Start Year Start Month Start Day Start Hour Start Minute | +| Stop Datetime | Stop Year Stop Month Stop Day Stop Hour Stop Minute | +| Weekday | Weekday bitmask | + +4.43.2.1.1 All parameters specified + +If all Scheduling parameters are specified in a TimeRange, the Time Range MUST be active when the following condition is fulfilled: + + Daily Start Time <= Current time < Daily Stop Time Start Datetime <= Current datetime <= Stop Datetime  Current weekday in (weekday bitmask)  + +For example, if Daily Start Time is set to 08:30, Daily Stop Time is set to 17:00, Start Datetime is set to 10 th of January 2019 at 12:00, Stop Datetime is set to 5 th of February 2019 at 12:00, Weekday bitmask is set to Monday to Friday, then the Time Range will be active: + + On the 10 th of January 2019 from 12:00 to 17:00 On subsequent weekdays until the 4 of February 2019, between 08:30 and 17:00  th On the 5 th of February 2019 from 08:30 to 12:00  4.43.2.1.2 Some parameters undefined in parameter groups + +If some of the parameters within a group are undefined, they are to be interpreted as wildcard and excluded from the comparison for the parameter group. For example, if Start Datetime has no Start Year and Start Month defined, but only Start Day set to 15, the time range MUST start on the 15 of th every month also regardless of the year. + +If Start Day is set to 15 and Stop Minute is set to 30, then the Time Range MUST be active every hour during 30 minutes from the 15 th until the end of each month. + +4.43.2.1.3 All parameters missing from a parameter group + +If all fields are undefined (not in use) for a parameter group, the corresponding parameter group MUST NOT be used for the Time Range activation. For example, if none of the Stop Datetime parameters are defined, then the Time Range MUST be active when: + +Daily Start Time <= Current time < Daily Stop Time   Start Datetime <= Current datetime Current weekday in (weekday bitmask)  diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.04-generic-schedule-time-range-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.04-generic-schedule-time-range-get-command.md new file mode 100644 index 0000000..98f16ee --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.04-generic-schedule-time-range-get-command.md @@ -0,0 +1,29 @@ + +# 1.1.4 Generic Schedule Time Range Get Command + +This command is used to request the configuration of a Time Range ID for a supporting node. + +[The Generic Schedule Time Range Report Command MUST be returned in response to this command.](01.01.05-generic-schedule-time-range-report-command.md#115-generic-schedule-time-range-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE TIME RANGE GET _ _ _ _ | | | | | | | | +| Res | Time Range ID 1 (MSB) | | | | | | | +| Time Range ID 2 (LSB) | | | | | | | | + +Time Range ID (16 bits) + +This field is used to specify the requested Time Range ID. + +The first byte MUST carry the most significant byte of the 15 bits. + +A supporting node MUST return this value in the Time Range ID [field in the returned Generic Schedule Report Command.](01.01.08-generic-schedule-report-command.md#118-generic-schedule-report-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.05-generic-schedule-time-range-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.05-generic-schedule-time-range-report-command.md new file mode 100644 index 0000000..685c92c --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.05-generic-schedule-time-range-report-command.md @@ -0,0 +1,54 @@ + +# 1.1.5 Generic Schedule Time Range Report Command + +This command is used to advertise the configuration of a Time Range ID for a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE TIME RANGE REPORT _ _ _ _ | | | | | | | | +| Res | Time Range ID 1 (MSB) | | | | | | | +| Time Range ID 2 (LSB) | | | | | | | | +| In use | Weekday bitmask | | | | | | | +| In use | Start Year (MSB) | | | | | | | +| Start Year (LSB) | | | | | | | | +| In use | Stop Year (MSB) | | | | | | | +| Stop Year (LSB) | | | | | | | | +| In use | Reserved | | | Start Month | | | | +| In use | Reserved | | | Stop Month | | | | +| In use | Reserved | | Start Day | | | | | +| In use | Reserved | | Stop Day | | | | | +| In use | Reserved | | Start Hour | | | | | +| In use | Reserved | | Stop Hour | | | | | +| In use | Res | Start Minute | | | | | | +| In use | Res | Stop Minute | | | | | | +| In use | Reserved | | Daily Start Hour | | | | | +| In use | Reserved | | Daily Stop Hour | | | | | +| In use | Res | Daily Start Minute | | | | | | +| In use | Res | Daily Stop Minute | | | | | | +| Res | Next Time Range ID | | | | | | | +| Next Time Range ID | | | | | | | | + +[Fields not described below MUST remain identical to the description in 1.1.3 Generic Schedule Time Range Set Command.](01.01.03-generic-schedule-time-range-set-command.md#113-generic-schedule-time-range-set-command) + +Res / Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Time Range ID (15 bits) + +This field is used to indicate which Time Range ID configuration is being advertised. + +If this field is set to a non-supported or non-configured Time Range ID, all scheduling parameters fields MUST be set to 0. + +Next Time Range ID (15 bits) + +This field is used to indicate the next non-empty Time Range ID. + +This field MUST indicate the next non-empty Time Range ID. The value 0 MUST indicate that there is no following Time Range ID configured at the receiving node. + +Non-empty Time Range slot ID means that at least 1 In use flag is set to 1. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.06-generic-schedule-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.06-generic-schedule-set-command.md new file mode 100644 index 0000000..b146317 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.06-generic-schedule-set-command.md @@ -0,0 +1,109 @@ + +# 1.1.6 Generic Schedule Set Command + +This command is used to configure a Schedule for a supporting node. + +A schedule MUST be active when: + + At least one of the included Time Ranges is active None of the excluded Time Ranges are active.  + +[Refer to 4.43.2.2 for details.](01.01.06-generic-schedule-set-command.md#44322-schedules-and-time-ranges-examples) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE SET _ _ | | | | | | | | +| Schedule ID 1 (MSB) | | | | | | | | +| Schedule ID 2 (LSB) | | | | | | | | +| Number of Time Range IDs | | | | | | | | +| Include/ exclude | Time Range ID 1 (MSB) | | | | | | | +| Time Range ID 1 (LSB) | | | | | | | | +| … | | | | | | | | +| Include/ exclude | Time Range ID N (MSB) | | | | | | | +| Time Range ID N (LSB) | | | | | | | | + +Res / Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Schedule ID (16 bits) + +This field is used to indicate which Schedule slot ID to use for the schedule being set. + +This field MUST be in the range 0..[Number of supported Schedule IDs]. + +The value 0 MUST indicate that the supporting node MUST erase all configured schedules. In this case, the Number of Time Range IDs field MUST be set to 0 by a sending node. Values in the range 1..[Number of supported Schedule IDs] MUST indicate the actual Schedule ID to configure. + +If a non-supported Schedule ID is specified in this command, a receiving node MUST ignore the command. + +Number of Time Range IDs (8 bits) + +This field is used to indicate the number of Time Range IDs included as part of the Schedule. + +This field MUST be in the range 0..[Number of supported Time Range IDs per Schedule]. + +A supporting node MUST ignore this command if it is set to a value higher than the reported Number of supported Time Ranges per Schedule [field in the Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md#112-generic-schedule-capabilities-report-command) + +The number of Include/exclude and Time Range ID field blocks in this command MUST be according to this field. + +Include/exclude (N x 1 bit) + +This field is used to indicate if the Schedule ID must include or exclude the corresponding Time Range ID. + +The value 0 MUST indicate that the corresponding Time Range is excluded and the schedule MUST be active outside of the Time Range. The value 1 MUST indicate that the corresponding Time Range is included and the schedule MUST be active during the defined Time Range. + +Time Range ID (N x 15 bits) + +This field is used to indicate which Time Range ID MUST be part of the Schedule ID. + +Undefined Time Range IDs (all zeroed out) may be part of Schedules. + +## 4.43.2.2 Schedules and Time Ranges examples + +4.43.2.2.1 Example 1 + + Time Range 1 is from 24 th to 26 th of December Time Range 2 is from 17:00 to 08:00 every day  Time Range 3 is weekend days.  + +If a schedule is set to: + + Include Time Range 1  Exclude Time Range 2  Include Time Range 3 + +Then it MUST be active: + + every week-end from 08:00 to 17:00  on the 24 th,25 th and 26 th of December from 08:00 to 17:00 regardless of the current weekday. + +4.43.2.2.2 Example 2 + +Time Range 3 is undefined (all unused value).  + +If a schedule is set to: + + Include Time Range 1 Include Time Range 2  Include Time Range 3  + +Then the schedule MUST be active at all times. + +4.43.2.2.3 Example 3 + +Time Range 3 is undefined (all unused value).  + +If a schedule is set to: + +Include Time Range 1   Exclude Time Range 2 Exclude Time Range 3  + +Then the schedule MUST never be active. + +4.43.2.2.4 Example 4 + + Time Range 1 has no start time and finishes on the 30 th of June Time Range 2 is from 08:00 to 17:00 on week days  Time Range 3 is 10:00 to 15:00 on weekend days  + +If a schedule is set to: + + Include Time Range 1 Include Time Range 2  Include Time Range 3  + +Then the schedule MUST be active: + + All the time from the 1 st of January until the 30 th of June From 08:00 to 17:00 on weekdays between the 1 of July and the 31 of December every year  st st From 10:00 to 15:00 on weekends between the 1 st of July and the 31 st of December every year  diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.07-generic-schedule-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.07-generic-schedule-get-command.md new file mode 100644 index 0000000..5c2c453 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.07-generic-schedule-get-command.md @@ -0,0 +1,29 @@ + +# 1.1.7 Generic Schedule Get Command + +This command is used to request the configuration of a Schedule ID for a supporting node. + +[The Generic Schedule Report Command MUST be returned in response to this command.](01.01.08-generic-schedule-report-command.md#118-generic-schedule-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE GET _ _ | | | | | | | | +| Schedule ID 1 (MSB) | | | | | | | | +| Schedule ID 2 (LSB) | | | | | | | | + +Schedule ID (16 bits) + +This field is used to specify the requested Schedule ID. + +The first byte MUST carry the most significant byte of the 16 bits. + +A supporting node MUST return this value in the Schedule ID [field in the returned Generic Schedule Report Command.](01.01.08-generic-schedule-report-command.md#118-generic-schedule-report-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.08-generic-schedule-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.08-generic-schedule-report-command.md new file mode 100644 index 0000000..943235e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/01.01.08-generic-schedule-report-command.md @@ -0,0 +1,61 @@ + +# 1.1.8 Generic Schedule Report Command + +This command is used to advertise the contents of a Schedule for a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GENERIC SCHEDULE _ _ _ | | | | | | | | +| Command = GENERIC SCHEDULE REPORT _ _ | | | | | | | | +| Schedule ID 1 (MSB) | | | | | | | | +| Schedule ID 2 (LSB) | | | | | | | | +| Number of Time Range IDs | | | | | | | | +| Include/ exclude | Time Range ID 1 (MSB) | | | | | | | +| Time Range ID 1 (LSB) | | | | | | | | +| … | | | | | | | | +| Include/ exclude | Time Range ID N (MSB) | | | | | | | +| Time Range ID N (LSB) | | | | | | | | +| Next Schedule ID 1 (MSB) | | | | | | | | +| Next Schedule ID 2 (LSB) | | | | | | | | + +[Fields not described below MUST remain identical to the description in 1.1.8 Generic Schedule Report Command.](01.01.08-generic-schedule-report-command.md#118-generic-schedule-report-command) + +Res / Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Schedule ID (16 bits) + +This field is used to indicate which Schedule ID configuration is being advertised. + +If this field is set to a non-supported or non-configured Schedule ID, all the Number of Time Range IDs field MUST be set to 0. + +Number of Time Range IDs (8 bits) + +This field is used to indicate the number of Time Range IDs included as part of the Schedule. + +This field MUST be in the range 0..[Number of supported Time Range IDs per Schedule]. + +The number of Include/exclude and Time Range ID field blocks in this command MUST be according to this field. + +Include/exclude (N x 1 bit) + +This field is used to indicate if the Schedule ID must include or exclude the corresponding Time Range ID. + +The value 0 MUST indicate that the corresponding Time Range is excluded and the schedule MUST be active outside of the Time Range. The value 1 MUST indicate that the corresponding Time Range is included and the schedule MUST be active during the defined Time Range. + +Time Range ID (N x 15 bits) + +This field is used to indicate which Time Range ID MUST be part of the Schedule ID. + +Undefined Time Range IDs (all zeroed out) may be part of Schedules. + +Next Schedule ID (16 bits) + +This field is used to indicate the next non-empty Schedule ID. + +This field MUST indicate the next non-empty Schedule slot ID. The value 0 MUST indicate that there is no following Schedule Slot ID configured at the supporting node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.01-terminology.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.01-terminology.md new file mode 100644 index 0000000..6696c71 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.01-terminology.md @@ -0,0 +1,16 @@ + +# 4.43.1 Terminology + +Schedules are composed by one or more Time Range(s). A time range is a composed of one or several scheduling parameters, such as weekdays, day of the month, hour of the day, etc. + +Time ranges are defined individually with scheduling parameters. For example, it could be Time Range 1 representing weekdays during work hours and Time Range 2 representing public holidays at fixed dates. (e.g. 25 of December and 31 of October) th st + +A schedule can then be set including or excluding each of its composing time ranges. Schedule ID 1 could include weekdays work hours (Time Range 1) and exclude public holidays (Time Range 2). It means that Schedule 1 must be active only on weekdays work hours when it is not a public holiday. + +At least one of the included Time Ranges conditions must be fulfilled and none of the excluded Time Ranges must be fulfilled for a Schedule to be active. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.02-interoperability-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.02-interoperability-considerations.md new file mode 100644 index 0000000..0734b74 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/04.43.02-interoperability-considerations.md @@ -0,0 +1,12 @@ + +# 4.43.2 Interoperability considerations + +This Command Class relies on time and date synchronization between controlling and supporting nodes. + +Nodes supporting this command class should also have correct time or date settings depending on their capabilities. Supporting nodes may support the Clock Command Class for this purpose. The Time Command Class may also be used for reading the current date and time at the supporting node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/index.md new file mode 100644 index 0000000..dfb0a50 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.43-generic-schedule-command-class-version-1/index.md @@ -0,0 +1,27 @@ + +# 4.43 Generic Schedule Command Class, version 1 + +The Generic Schedule Command Class is used to define schedules. + +Schedules defined in this command class are essentially time ranges or intervals. Each schedule is associated to a Schedule ID. + +The Schedules defined in this Command Class can be used in other Command Classes, e.g. to schedule when user credentials are valid or when to apply a particular configuration. + +## Contents + +- [4.43.1 Terminology](04.43.01-terminology.md) +- [4.43.2 Interoperability considerations](04.43.02-interoperability-considerations.md) +- [1.1.1 Generic Schedule Capabilities Get Command](01.01.01-generic-schedule-capabilities-get-command.md) +- [1.1.2 Generic Schedule Capabilities Report Command](01.01.02-generic-schedule-capabilities-report-command.md) +- [1.1.3 Generic Schedule Time Range Set Command](01.01.03-generic-schedule-time-range-set-command.md) +- [1.1.4 Generic Schedule Time Range Get Command](01.01.04-generic-schedule-time-range-get-command.md) +- [1.1.5 Generic Schedule Time Range Report Command](01.01.05-generic-schedule-time-range-report-command.md) +- [1.1.6 Generic Schedule Set Command](01.01.06-generic-schedule-set-command.md) +- [1.1.7 Generic Schedule Get Command](01.01.07-generic-schedule-get-command.md) +- [1.1.8 Generic Schedule Report Command](01.01.08-generic-schedule-report-command.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.44-geographic-location-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.44-geographic-location-command-class-version-1.md new file mode 100644 index 0000000..a500cd7 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.44-geographic-location-command-class-version-1.md @@ -0,0 +1,63 @@ + +# 4.44 Geographic Location Command Class, version 1 + +The Geographic Location Command Class is used to read latitude and longitude from another device. The latitude and longitude may also be set according to the geographic location in question. Date and geographic location may be used to calculate sunrise and sunset for e.g. automatic lighting control. + +## 4.44.1 Multi Channel Considerations + +Multi Channel End Points SHOULD NOT support the Geographic Location Command Class. + +## 4.44.2 Geographic Location Set Command + +This command is used to set latitude and longitude. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GEOGRAPHIC LOCATION _ _ _ | | | | | | | | +| Command = GEOGRAPHIC LOCATION SET _ _ | | | | | | | | +| Longitude Degrees | | | | | | | | +| Long. Sign | Longitude Minutes | | | | | | | +| Latitude Degrees | | | | | | | | +| Lat. Sign | Latitude Minutes | | | | | | | + +Longitude (16 bits) + +The longitude determines one's location on the earth's surface, East or West of the Greenwich Meridian. The Greenwich Meridian is located at the Greenwich observatory, in Greenwich, England to be the geographic point for where East and West meet. Therefore, Greenwich Meridian is indicated as 0° longitude. Longitude values for points East of the Meridian are always positive, while points West of the Meridian are always negative. Valid ranges are for degrees (from -180 to 180) and minutes (0-59). Other values will be interpreted as 0. + +Latitude (16 bits) + +The latitude determines one's location on the earth's surface, North or South of the Equator. Latitude is measured between -90° South, and +90° North of the Equator point (0°). Valid ranges are for degrees (from -90 to 90) and minutes (0-59). Other values will be interpreted as 0. + +## 4.44.3 Geographic Location Get Command + +This command is used to request latitude and longitude from a device. + +The Geographic Location Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GEOGRAPHIC LOCATION _ _ _ | | | | | | | | +| Command = GEOGRAPHIC LOCATION GET _ _ | | | | | | | | + +## 4.44.4 Geographic Location Report Command + +This command returns latitude and longitude from a device in a Z-Wave network. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GEOGRAPHIC LOCATION _ _ _ | | | | | | | | +| Command = GEOGRAPHIC LOCATION REPORT _ _ | | | | | | | | +| Longitude Degrees | | | | | | | | +| Long. Sign | Longitude Minutes | | | | | | | +| Latitude Degrees | | | | | | | | +| Lat. Sign | Latitude Minutes | | | | | | | + +Refer to description under the Geographic Location Set Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.45-hrv-status-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.45-hrv-status-command-class-version-1.md new file mode 100644 index 0000000..f3a81f5 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.45-hrv-status-command-class-version-1.md @@ -0,0 +1,118 @@ + +# 4.45 HRV Status Command Class, version 1 + +The residential Heat Recovery Ventilation (HRV) Status Command Class is used to read out a number of parameters in the ventilation system. + +## 4.45.1 HRV Status Get Command + +This command is used to request specific parameters from the ventilation system. + +The HRV Status Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | +| Command = HRV STATUS GET _ _ | | | | | | | | +| Status Parameter | | | | | | | | + +Status Parameter (8 bits) + +The status parameter used to indicate which status parameter that is requested. + +| Value | Status Parameter | +| --- | --- | +| 0x00 | Outdoor Air temperature | +| 0x01 | Supply Air (to room) temperature | +| 0x02 | Exhaust Air (from room) temperature | +| 0x03 | Discharge Air temperature | +| 0x04 | Room temperature | +| 0x05 | Relative Humidity in room | +| 0x06 | Remaining filter life | + +## 4.45.2 HRV Status Report Command + +This command is used to report a specific status parameter in response to a HRV Status Get. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | +| Command = HRV STATUS REPORT _ _ | | | | | | | | +| Status Parameter | | | | | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| …. | | | | | | | | +| Value N | | | | | | | | + +Status Parameter (8 bits) + +[The status parameter used to indicate which status parameter that is reported. Refer to 4.45.1 HRV Status Get for possible values.](04.45-hrv-status-command-class-version-1.md#4451-hrv-status-get-command) + +Precision (3 bits) + +The precision field describes what the precision of the setpoint value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Scale (2 bits) + +The scale field indicates the scale used the list of possible scales are given below: + +| Status Parameter | Scale | Value | +| --- | --- | --- | +| Outdoor Air temperature | Celsius (C) | 0 | +| | Fahrenheit (F) | 1 | +| Supply Air (to room) temperature | Celsius (C) | 0 | +| | Fahrenheit (F) | 1 | +| Exhaust Air (from room) temperature | Celsius (C) | 0 | +| | Fahrenheit (F) | 1 | +| Discharge Air temperature | Celsius (C) | 0 | +| | Fahrenheit (F) | 1 | +| Room temperature | Celsius (C) | 0 | +| | Fahrenheit (F) | 1 | +| Relative Humidity in room | Percentage (%) | 0 | +| Remaining filter life | Percentage (%) | 0 | + +Size (3 bits) + +The size field indicates the number of bytes used for the sensor value. This field can take values from 1 (001b), 2 (010b) or 4 (100b). + +Value (N bytes) + +[The value MUST be treated as a signed field (Table 10). The value MAY be 1, 2 or 4 bytes in size. This](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) first byte is the most significant byte. + +## 4.45.3 HRV Status Supported Get Command + +This command is used to request a bitmap of the supported status parameters. + +The HRV Status Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | +| Command = HRV STATUS SUPPORTED GET _ _ _ | | | | | | | | + +## 4.45.4 HRV Status Supported Report Command + +This command is used to report a bitmap indicating the supported status parameters. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | +| Command = HRV STATUS SUPPORTED REPORT _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +The Bit Mask fields describe the supported status parameters from the ventilation system. Bit 0 in the Bit Mask 1 field used to indicate if the status parameter “Outdoor Air Temperature” is supported, 0 indicating not supported and 1 indicating supported. Bit 1 in the Bit Mask 1 field used to indicate if the status parameter “Supply Air Temperature” is supported and so forth. All available status parameters [are given in Section 4.45.1 HRV Status Get.](04.45-hrv-status-command-class-version-1.md#4451-hrv-status-get-command) + +It is only necessary to send the Bit Mask fields 1 and up to the one indicating the last support status parameter. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.46-hrv-control-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.46-hrv-control-command-class-version-1.md new file mode 100644 index 0000000..2367e12 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.46-hrv-control-command-class-version-1.md @@ -0,0 +1,218 @@ + +# 4.46 HRV Control Command Class, version 1 + +The Heat Recovery Ventilation (HRV) Control Command Class is introducing control of Heat Recovery Ventilation systems via the Z-Wave interface. + +## 4.46.1 HRV Mode Set + +This command is used to set the desired mode in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL MODE SET _ _ _ | | | | | | | | +| Reserved | | | Mode | | | | | + +Mode (5 bits) + +The mode identifier MAY be set to the following values: + +| Mode | Name | Description | +| --- | --- | --- | +| 0 | Off | The HRV system is in the off state, frost protection can occur. | +| 1 | Demand / Automatic | The HRV system is controlled based on sensor input. | +| 2 | Schedule | The HRV system is controlled based on predefined input from the factory and/or user/installer. | +| 3 | Energy Savings Mode | The HRV system will be put into a reduced heat / ventilation mode. | +| 4 | Manual | The HRV system is in manual mode. The command HRV Manual Control Set may be used to manually control the device. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.46.2 HRV Mode Get Command + +This command is used to request the current mode from the device. + +The HRV Mode Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL MODE GET _ _ _ | | | | | | | | + +## 4.46.3 HRV Mode Report Command + +The HRV Mode Report Command is used to report the mode from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL MODE REPORT _ _ _ | | | | | | | | +| Reserved | | | Mode | | | | | + +Mode (8 bits) + +Refer to description under the HRV Mode Set command. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.46.4 HRV Bypass Set Command + +This command is used to set the bypass mode when the ventilation system is set to manual mode. If the system is not in manual mode while receiving this command it MUST be ignored. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL BYPASS SET _ _ _ | | | | | | | | +| Bypass | | | | | | | | + +Bypass (8 bits) + +The value MAY be 0x00 (close) or 0xFF (open). + +Furthermore, the field MAY carry a percentage value between 1 to 99 (0x01 - 0x63). If the ventilation system supports modulated bypass, the percentage value will represent the aperture of the bypass. If the system does not support the full range of aperture steps, the values SHOULD be mapped linearly over the entire scale. + +If ventilation system does support modulated bypass the values from 1 to 99 MUST be interpreted as fully open. + +The value 254 (0xFE) MAY be used to set the bypass into automatic mode. + +## 4.46.5 HRV Bypass Get Command + +This command is used to request the current bypass setting. + +The HRV Bypass Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL BYPASS GET _ _ _ | | | | | | | | + +## 4.46.6 HRV Bypass Report Command + +This command is used to report the current bypass parameters. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL BYPASS REPORT _ _ _ | | | | | | | | +| Bypass | | | | | | | | + +Bypass (8 bits) + +[See description in 4.46.4 HRV Bypass Set.](04.46-hrv-control-command-class-version-1.md#4464-hrv-bypass-set-command) + +## 4.46.7 HRV Ventilation Rate Set Command + +This command is used to set the ventilation rate when the ventilation system is set to manual mode. If the system is not in manual mode while receiving this command it MUST be ignored. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL VENTILATION RATE SET _ _ _ _ | | | | | | | | +| Ventilation Rate | | | | | | | | + +Ventilation Rate (8 bits) + +The value MAY be 0x00 (off) or 0xFF (on). + +The field MAY carry a percentage value between 1 to 99 (0x01 - 0x63). A ventilation system MAY map the values 1..99 to less than 99 steps. + +## 4.46.8 HRV Ventilation Rate Get Command + +This command is used to request the current ventilation rate setting. + +The HRV Ventilation Rate Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL VENTILATION RATE GET _ _ _ _ | | | | | | | | + +## 4.46.9 HRV Ventilation Rate Report Command + +This command is used to report the current ventilation rate setting. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL VENTILATION RATE REPORT _ _ _ _ | | | | | | | | +| Ventilation Rate | | | | | | | | + +Ventilation Rate (8 bits) + +[See description under Section 4.46.7 HRV Ventilation Rate Set Command.](04.46-hrv-control-command-class-version-1.md#4467-hrv-ventilation-rate-set-command) + +## 4.46.10 HRV Mode Supported Get Command + +This command is used to request the supported modes from the device. + +The HRV Mode Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL MODE SUPPORTED GET _ _ _ _ | | | | | | | | + +## 4.46.11 HRV Mode Supported Report Command + +This command is used to report the supported modes from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | +| Command = HRV CONTROL MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Reserved | | | | Manual Control Supported | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Manual Control Supported (3 bits) + +The manual control supported bits describes the supported manual control modes of the ventilation system. The mode is supported if the bit is 1. If the bit is 0, the mode is not supported. + +The bits are mapped to the following controls: + +| Bit | Name | +| --- | --- | +| 0 | Bypass Open / Close | +| 1 | Bypass Auto | +| 2 | Modulated Bypass | +| 3 | Ventilation Rate | + +E.g. a ventilation system supporting only open and close would report Manual Control Supported = 0x01. + +Bit Mask (N bytes) + +The Bit Mask fields describe the supported modes by the device. + + Bit 0 in Bit Mask 1 field indicates if Mode = 0 (Off) is supported. + + Bit 1 in Bit Mask 1 field indicates if Mode = 1 (Demand / Automatic) is supported. + + … + +If the Mode is supported the bit MUST be set to 1. If the Mode is not supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported mode. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. + +[All available modes are given in Section 4.46.1 HRV Mode Set.](04.46-hrv-control-command-class-version-1.md#4461-hrv-mode-set) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.47-humidity-control-mode-command-class-version-1-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.47-humidity-control-mode-command-class-version-1-2.md new file mode 100644 index 0000000..ef6504f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.47-humidity-control-mode-command-class-version-1-2.md @@ -0,0 +1,114 @@ + +# 4.47 Humidity Control Mode Command Class, version 1-2 + +The Humidity Control Mode Command Class is used to control a humidity control device. + +## 4.47.1 Humidity Control Mode Set Command + +This command is used to set the humidity control mode in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL MODE SET _ _ _ | | | | | | | | +| Reserved | | | | Mode | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Mode (4 bits) + +[The encoding of the humidity control mode field MUST be according to Table 56.](04.47-humidity-control-mode-command-class-version-1-2.md#4471-humidity-control-mode-set-command) + +Table 56, Mode + +| Mode | Description | Version | +| --- | --- | --- | +| 0 | Off – Humidity control system is off. | 1 | +| 1 | Humidify – The system will attempt to raise humidity to the humidifier setpoint. | 1 | +| 2 | De-humidify – The system will attempt to lower the humidity to the de- humidifier setpoint. | 1 | +| 3 | Auto - The system will automatically switch between humidifying and de- humidifying in order to satisfy the humidify and de-humidify setpoints | 2 | + +All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. + +## 4.47.2 Humidity Control Mode Get Command + +This command is used to request the supported humidity control modes from the device. + +The Humidity Control Mode Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL MODE GET _ _ _ | | | | | | | | + +## 4.47.3 Humidity Control Mode Report Command + +This command is used to report the humidity control mode from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL MODE REPORT _ _ _ | | | | | | | | +| Reserved | | | | Mode | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Mode (4 bits) + +[The encoding of the humidity control mode field MUST be according to Table 56.](04.47-humidity-control-mode-command-class-version-1-2.md#4471-humidity-control-mode-set-command) + +## 4.47.4 Humidity Control Mode Supported Get Command + +This command is used to request the supported modes from the device. + +The Humidity Control Mode Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL MODE SUPPORTED GET _ _ _ _ | | | | | | | | + +## 4.47.5 Humidity Control Mode Supported Report Command + +This command is used to report the supported humidity control modes from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +The Bit Mask fields MUST advertise the supported humidity control modes by the device. The encoding [of the Size field MUST be according to Table 57.](04.47-humidity-control-mode-command-class-version-1-2.md#4475-humidity-control-mode-supported-report-command) + +Table 57, Supported Humidity Control Mode + +| Field | Bit | Support for Control Mode | Version | +| --- | --- | --- | --- | +| Bit Mask 1 | 0 | Reserved | 1 | +| Bit Mask 1 | 1 | 1 (Humidifier) | 1 | +| Bit Mask 1 | 2 | 2 (De-humidifer) | 1 | +| Bit Mask 1 | 3 | 3 (Auto) | 2 | + +All Bit Mask fields and bits not specified above are reserved. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +For each individual bit, The value ‘0’ MUST signify that the actual Mode is not supported. The value ‘1’ MUST signify that the actual Mode is supported. + +A sending node MAY omit trailing Bit Mask fields if they are not needed. The number of Bit Mask fields MUST be determined from the length field in the frame. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.48-humidity-control-operating-state-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.48-humidity-control-operating-state-command-class-version-1.md new file mode 100644 index 0000000..cf808bd --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.48-humidity-control-operating-state-command-class-version-1.md @@ -0,0 +1,51 @@ + +# 4.48 Humidity Control Operating State Command Class, version 1 + +The Humidity Control Operating State Command Class is used to obtain the operating state of the humidity control device. + +## 4.48.1 Humidity Control Operating State Get Command + +This command is used to request the operating state of the humidity control device. + +The Humidity Control Operating State Report Command MUST be returned in response to thiscommand. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL OPERATING STATE _ _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL OPERATING STATE GET _ _ _ _ | | | | | | | | + +## 4.48.2 Humidity Control Operating State Report Command + +This command is used to report the operating state of the humidity control device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL OPERATING STATE _ _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL OPERATING STATE REPORT _ _ _ _ | | | | | | | | +| Reserved | | | | Operating State | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Operating State (4 bits) + +The Operating State field MUST advertise the current operating state. + +[The encoding of the Operating State field MUST be according to Table 58.](04.48-humidity-control-operating-state-command-class-version-1.md#4482-humidity-control-operating-state-report-command) Table 58, Operating State + +| Operating State | Description | Version | +| --- | --- | --- | +| 0 | Idle | 1 | +| 1 | Humidifying | 1 | +| 2 | De-humidifying | 1 | + +All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.49-humidity-control-setpoint-command-class-version-1-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.49-humidity-control-setpoint-command-class-version-1-2.md new file mode 100644 index 0000000..d9e20f8 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.49-humidity-control-setpoint-command-class-version-1-2.md @@ -0,0 +1,239 @@ + +# 4.49 Humidity Control Setpoint Command Class, version 1-2 + +The Humidity Control Setpoint Command Class is used for humidity control setpoint handling. + +## 4.49.1 Humidity Control Setpoint Set Command + +This command is used to set the humidity control setpoint in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT SET _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| … | | | | | | | | +| Value N | | | | | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +The Setpoint Type field MUST specify the humidity control setpoint to be set in the humidity control [device. The encoding of the Setpoint Type field MUST be according to Table 59.](04.49-humidity-control-setpoint-command-class-version-1-2.md#4491-humidity-control-setpoint-set-command) + +Table 59, Setpoint Type + +| Setpoint Type | Description | Version | +| --- | --- | --- | +| 1 | Humidifier | 1 | +| 2 | De-humidifier | 1 | +| 3 | Auto | 2 | + +All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. + +Precision (3 bits) + +The precision field MUST specify the precision of the setpoint value. The number indicates the number of decimals. As an example, the decimal value 1025 with precision two (2) is equal to 10.25. Scale (2 bits) + +The Scale field MUST specify the humidity scale used. The encoding of the Scale field MUST be [according to Table 60.](04.49-humidity-control-setpoint-command-class-version-1-2.md#4491-humidity-control-setpoint-set-command) + +Table 60, Scale values + +| Scale | Description | Version | +| --- | --- | --- | +| 0 | Percentage value | 1 | +| 1 | Absolute humidity (g/m3) | 1 | + +All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. + +Size (3 bits) + +The Size field MUST specify the number of bytes used for the Value field. The encoding of the Size field [MUST be according to Table 61.](04.49-humidity-control-setpoint-command-class-version-1-2.md#4491-humidity-control-setpoint-set-command) + +Table 61, Size values + +| Size | Description | Version | +| --- | --- | --- | +| 1 | Value field is 1 byte long | 1 | +| 2 | Value field is 2 bytes long | 1 | +| 4 | Value field is 4 bytes long | 1 | + +All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. + +Value (N bytes) + +The value is a signed field. The field MAY be one, two, or four bytes in size as specified by the Size field. Value 1 is the most significant byte. + +## 4.49.2 Humidity Control Setpoint Get Command + +This command is used to request the given humidity control setpoint type in a device. + +The Humidity Control Setpoint Report MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT GET _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +This field MUST indicate which humidity control setpoint MUST be returned by the supporting node. [The encoding of the Setpoint Type field MUST be according to Table 59.](04.49-humidity-control-setpoint-command-class-version-1-2.md#4491-humidity-control-setpoint-set-command) + +## 4.49.3 Humidity Control Setpoint Report Command + +This command is used to report the value of the humidity control setpoint type in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT REPORT _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Precision | | | Scale | | Size | | | +| Value 1 | | | | | | | | +| … | | | | | | | | +| Value N | | | | | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. [For fields’ description, refer to 4.49.1 Humidity Control Setpoint Set Command](04.49-humidity-control-setpoint-command-class-version-1-2.md#4491-humidity-control-setpoint-set-command) + +## 4.49.4 Humidity Control Setpoint Supported Get Command + +This command is used to request the humidity control setpoint types supported by the device. + +The Humidity Control Setpoint Supported Report Command MUST be returned in response to a this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT SUPPORTED GET _ _ _ _ | | | | | | | | + +## 4.49.5 Humidity Control Setpoint Supported Report Command + +This command is used to report the humidity control setpoint types supported by the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +The Bit Mask fields MUST advertise the humidity control setpoint types supported by the device.The [encoding of the Size field MUST be according to Table 62.](04.49-humidity-control-setpoint-command-class-version-1-2.md#4495-humidity-control-setpoint-supported-report-command) + +Table 62, Humidity Control Setpoint Supported Report values + +| Field | Bit | Support for Setpoint Type | Version | +| --- | --- | --- | --- | +| Bit Mask 1 | 0 | Reserved | 1 | +| Bit Mask 1 | 1 | 1 (Humidifier) | 1 | +| Bit Mask 1 | 2 | 2 (De-humidifer) | 1 | +| Bit Mask 1 | 3 | 3 (Auto) | 2 | + +All Bit Mask fields and bits not specified above are reserved. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +For each individual bit, The value ‘0’ MUST signify that the actual Setpoint Type is not supported. The value ‘1’ MUST signify that the actual Setpoint Type is supported. + +A sending node MAY omit trailing Bit Mask fields if they are not needed. The number of Bit Mask fields MUST be determined from the length field in the frame. + +## 4.49.6 Humidity Control Setpoint Scale Supported Get Command + +This command is used to retrieve the supported scales of the humidity control setpoints in the device. + +The Humidity Control Scale Supported Report Command MUST be returned in response to this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT SCALE SUPPORTED GET _ _ _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +Refer to the description under the Humidity Control Setpoint Set Command. + +## 4.49.7 Humidity Control Setpoint Scale Supported Report Command + +This command indicates the supported scales of the humidity control setpoint in a bit mask format. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT SCALE SUPPORTED REPORT _ _ _ _ _ | | | | | | | | +| Reserved | | | | Scale Bit Mask | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Scale Bit Mask (4 bits) + +Refer to the description under the Humidity Control Setpoint Set Command. + +## 4.49.8 Humidity Control Setpoint Capabilities Get Command + +This command is used to request the minimum and maximum setpoint values for a given humidity control Setpoint Type. + +The Humidity Control Setpoint Capabilities Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT CAPABILITIES GET _ _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | + +Reserved + +The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Setpoint Type (4 bits) + +Refer to the description under the Humidity Control Setpoint Set Command. + +## 4.49.9 Humidity Control Setpoint Capabilities Report Command + +This command is used to report the minimum and maximum values of the requested humidity control setpoint type. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | +| Command = HUMIDITY CONTROL SETPOINT CAPABILITIES REPORT _ _ _ _ | | | | | | | | +| Reserved | | | | Setpoint Type | | | | +| Precision | | | Scale | | Size | | | +| Minimum Value 1 | | | | | | | | +| … | | | | | | | | +| Minimum Value N | | | | | | | | +| Precision | | | Scale | | Size | | | +| Maximum Value 1 | | | | | | | | +| … | | | | | | | | +| Maximum Value N | | | | | | | | + +Refer to the description under the Humidity Control Setpoint Set Command for other parameter/field descriptions. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.01-ir-repeater-capabilities-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.01-ir-repeater-capabilities-get-command.md new file mode 100644 index 0000000..33a0e00 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.01-ir-repeater-capabilities-get-command.md @@ -0,0 +1,19 @@ + +# 1.1.1 IR Repeater Capabilities Get Command + +This command is used to request the IR Repeater capabilities of a node. + +[The IR Repeater Capabilities Report Command MUST be returned in response to this command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER CAPABILITIES GET (0x01) _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.02-ir-repeater-capabilities-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.02-ir-repeater-capabilities-report-command.md new file mode 100644 index 0000000..4e533dc --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.02-ir-repeater-capabilities-report-command.md @@ -0,0 +1,123 @@ + +# 1.1.2 IR Repeater Capabilities Report Command + +This command is used to advertise the IR Repeater capabilities of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER CAPABILITIES REPORT (0x02) _ _ _ | | | | | | | | +| Number of IR Code identifiers for learning | | | | | | | | +| IRR | LCR | RLC | PES | BES | Duty Cycle bitmask | | | +| Carrier | | | | | | | | +| Minimum Sub Carrier | | | | | | | | +| Maxium Sub Carrier | | | | | | | | +| Minimum Pulse time unit (MSB) | | | | | | | | +| Minimum Pulse time unit (LSB) | | | | Maximum Pulse time unit (MSB) | | | | +| Maximum Pulse time unit (LSB) | | | | | | | | + +Reserved / Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Number of IR Code identifiers for learning (8 bits) + +This field indicates how many slots the sending node supports for learning and repeating IR Codes. + +The value 0 MUST indicate that the no code can be learned and repeated. Values in the range 1..255 MUST indicate the number of codes that can be learnt and repeated. + +A node advertising a value greater than 0 MUST support the following commands: + +[IR Repeater IR Code Learning Start Command](01.01.03-ir-repeater-ir-code-learning-start-command.md#113-ir-repeater-ir-code-learning-start-command) - [IR Repeater IR Code Learning Stop Command](01.01.04-ir-repeater-ir-code-learning-stop-command.md#114-ir-repeater-ir-code-learning-stop-command) - [IR Repeater IR Code Learning Status Command](01.01.05-ir-repeater-ir-code-learning-status-command.md#115-ir-repeater-ir-code-learning-status-command) - - [IR Repeater Learnt IR Code Remove Command](01.01.06-ir-repeater-learnt-ir-code-remove-command.md#116-ir-repeater-learnt-ir-code-remove-command) [IR Repeater Learnt IR Code Get Command](01.01.07-ir-repeater-learnt-ir-code-get-command.md#117-ir-repeater-learnt-ir-code-get-command) - [IR Repeater Learnt IR Code Report Command](01.01.08-ir-repeater-learnt-ir-code-report-command.md#118-ir-repeater-learnt-ir-code-report-command) - + +A node advertising a value greater than 0 MUST set the LCR field and/or RLC field to 1. + +IRR (IR Repeater Repeat Command) (1 bit) + +This field indicates if the nodes supports the following commands: + + [IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +The value 0 MUST indicate that the commands above are not supported. The value 1 MUST indicate that the commands above are supported. + +LCR (Learnt Code Readback) (1 bit) + +This field indicates if the supporting node can be read back learnt codes, so that a controlling node can read back current learnt codes. This field indicates if the nodes supports the following commands: + + [IR Repeater Learnt IR Code Readback Get Command](01.01.09-ir-repeater-learnt-ir-code-readback-get-command.md#119-ir-repeater-learnt-ir-code-readback-get-command)  [IR Repeater Learnt IR Code Readback Report Command](01.01.10-ir-repeater-learnt-ir-code-readback-report-command.md#1110-ir-repeater-learnt-ir-code-readback-report-command) + +The value 0 MUST indicate that the commands above are not supported. The value 1 MUST indicate that the commands above are supported. + +If this field is set to 1, the Number of IR Code Identifiers for learning field MUST be set to a value greater than 0. + +If this field is set to 1, the IRR field MUST also be set to 1. RLC (Repeat Learnt Code) (1 bit) + +This field indicates if the supporting node can be repeat learnt codes. This field indicates if the nodes supports the following commands: + + [IR Repeater Repeat Learnt Code Command](01.01.14-ir-repeater-repeat-learnt-code-command.md#1114-ir-repeater-repeat-learnt-code-command) + +The value 0 MUST indicate that the command above is not supported. The value 1 MUST indicate that the command above is supported. + +If this field is set to 1, the Number of IR Code Identifiers for learning field MUST be set to a value greater than 0. + +If this field is set to 1, the IRR field MUST also be set to 1. + +PES (Pulse Encoding Support) (1 bit) + +This field indicates if the supporting node supports Pulse Encoding of the repeat and/or learn codes. + +The value 0 MUST indicate that Pulse Encoding of IR signals is not supported. The value 1 MUST indicate that Pulse Encoding of IR signals is supported. + +If this field is set to 0, the BES field MUST be set to 1. + +BES (Bit Encoding Support) (1 bit) + +This field indicates if the supporting node supports Bit Encoding of the repeat and/or learn codes. + +The value 0 MUST indicate that Bit Encoding of IR signals is not supported. The value 1 MUST indicate that Bit Encoding of IR signals is supported. + +If this field is set to 0, the PES field MUST be set to 1. + +If this field is set to 1, the sending node MUST support the following commands: + + [IR Repeater Configuration Set Command](01.01.11-ir-repeater-configuration-set-command.md#1111-ir-repeater-configuration-set-command)  [IR Repeater Configuration Get Command](01.01.12-ir-repeater-configuration-get-command.md#1112-ir-repeater-configuration-get-command)  [IR Repeater Configuration Report Command.](01.01.13-ir-repeater-configuration-report-command.md#1113-ir-repeater-configuration-report-command) + +Duty Cycle bitmask (3 bits) + +This field is used to advertise the supported Duty Cycles. + +This field MUST be treated as a bitmask and encoded as follows: + + Bit 0 in Duty Cycle field MUST represent ‘1/2 Duty Cycle’.  Bit 1 in Duty Cycle field MUST represent ‘1/3 Duty Cycle’.  Bit 2 in Duty Cycle field MUST represents ‘1/4 Duty Cycle’. + +If a Duty Cycle is supported, the corresponding bit MUST be set to ‘1’. If a Duty Cycle is not supported, the corresponding bit MUST be set to ‘0’. + +Carrier (8 bits) + +This field is used to indicate the IR Carrier that the supporting node will use for repeating IR Codes [indicated when receiving the IR Repeater Repeat Command.](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) This field MUST be expressed as 820 + x nm (nanometers). The values 0x00..0xFF MUST represents 820nm..1075nm. + +Minimum Sub Carrier (8 bits) + +[This field MUST indicates the lower limit value that can be set at the supporting node in the IR Repeater Repeat Command for the](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) Sub Carrier field. + +This field MUST be expressed in kHz (kilo Hertz). + +Maximum Sub Carrier (8 bits) + +[This field MUST indicates the upper limit value that can be set at the supporting node in the IR Repeater Repeat Command for the](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) Sub Carrie r field. + +This field MUST be expressed in kHz (kilo Hertz). Minimum Pulse time Unit (12 bits) + +[This field MUST indicates the lower limit value that can be set at the supporting node in the IR Repeater IR Code Learning Start Command and IR Repeater Repeat Command for the](01.01.03-ir-repeater-ir-code-learning-start-command.md#113-ir-repeater-ir-code-learning-start-command) Pulse time unit field. + +If the PES field is set to 0, this field MUST set to 0. + +Maximum Pulse time Unit (12 bits) + +[This field MUST indicates the upper limit value that can be set at the supporting node in the IR Repeater IR Code Learning Start Command and IR Repeater Repeat Command for the](01.01.03-ir-repeater-ir-code-learning-start-command.md#113-ir-repeater-ir-code-learning-start-command) Pulse time unit field. + +If the PES field is set to 0, this field MUST set to 0. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.03-ir-repeater-ir-code-learning-start-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.03-ir-repeater-ir-code-learning-start-command.md new file mode 100644 index 0000000..9fbf5e1 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.03-ir-repeater-ir-code-learning-start-command.md @@ -0,0 +1,45 @@ + +# 1.1.3 IR Repeater IR Code Learning Start Command + +This command is used to instruct a supporting node to start learning an IR Code. + +This command MUST be ignored by a receiving node if it advertises 0 Number of IR Code identifiers for learning [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +[A supporting node MUST stop learning IR Code and return a IR Repeater IR Code Learning Status Command a when a code has been received/learnt.](01.01.05-ir-repeater-ir-code-learning-status-command.md#115-ir-repeater-ir-code-learning-status-command) + +This command MUST be ignored if the supporting node is already learning an IR code. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER IR CODE LEARNING START (0x03) _ _ _ _ _ | | | | | | | | +| IR Code identifier | | | | | | | | +| Timeout | | | | | | | | +| Reserved | | | | Pulse time unit (MSB) | | | | +| Pulse time unit (LSB) | | | | | | | | + +IR Code identifier (8 bits) + +This field indicates which IR Code identifier to use for storing the IR Code that will be learnt. Values in the range 1..255 MUST indicate the actual IR Code identifier to use for learning a new code. + +This command MUST be ignored if this field is set to 0 or a larger value than the Number of IR Code identifiers for learning [field advertised in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +Timeout (8 bits) + +This field is used to indicate how long the supporting node MUST wait for an IR code to learn. + +If no IR code is learnt within the time in seconds indicated by this field, a supporting node MUST stop [learning codes and return a IR Repeater IR Code Learning Status Command with the](01.01.05-ir-repeater-ir-code-learning-status-command.md#115-ir-repeater-ir-code-learning-status-command) status field set to 0x02 (Failed:timeout). Pulse time unit (12 bits) + +This field is used to configure the IR Code learning Pulse Encoding time unit. + +This field MUST be expressed in (µs) and be in the range 1..4096. + +Values lower than the Minimum Pulse time unit [advertised by the supporting node in the IR Repeater Capabilities Report Command MUST be ignored by a supporting node.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +Values higher than the Maximum Pulse time unit [advertised by the supporting node in the IR Repeater Capabilities Report Command MUST be ignored by a supporting node.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.04-ir-repeater-ir-code-learning-stop-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.04-ir-repeater-ir-code-learning-stop-command.md new file mode 100644 index 0000000..da18aed --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.04-ir-repeater-ir-code-learning-stop-command.md @@ -0,0 +1,21 @@ + +# 1.1.4 IR Repeater IR Code Learning Stop Command + +This command is used to instruct a supporting node to stop learning an IR Code. + +This command MUST be ignored by a receiving node if it advertises 0 Number of IR Code identifiers for learning [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +A supporting node MUST stop learning IR Code if a learning process was ongoing when this command is received. + +[A supporting node MUST return a IR Repeater IR Code Learning Status Command in response to this](01.01.05-ir-repeater-ir-code-learning-status-command.md#115-ir-repeater-ir-code-learning-status-command) command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | | +| Command = IR REPEATER IR CODE LEARNING STOP (0x04) _ _ _ _ _ | | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.05-ir-repeater-ir-code-learning-status-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.05-ir-repeater-ir-code-learning-status-command.md new file mode 100644 index 0000000..8fea63e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.05-ir-repeater-ir-code-learning-status-command.md @@ -0,0 +1,38 @@ + +# 1.1.5 IR Repeater IR Code Learning Status Command + +This command is used to report the status of the last IR Code learning operation. It MUST be issued by a supporting node when it stops learning IR Codes. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER IR CODE LEARNING STATUS (0x05) _ _ _ _ _ | | | | | | | | +| IR Code identifier | | | | | | | | +| Status | | | | | | | | + +IR Code identifier (8 bits) + +This field indicates which IR Code identifier has been used for storing the IR Code during IR Code learning. + +If a learning process was completed, interrupted or timed out, this field MUST be in the range 1..255 and MUST be set to the same value as the IR Code identifier [field of the IR Repeater IR Code Learning Start Command that initiated IR Code learning.](01.01.03-ir-repeater-ir-code-learning-start-command.md#113-ir-repeater-ir-code-learning-start-command) + +[If a no learning process was ongoing and a IR Repeater IR Code Learning Stop Command was received,](01.01.04-ir-repeater-ir-code-learning-stop-command.md#114-ir-repeater-ir-code-learning-stop-command) this field MUST be set to 0. + +Status(8 bit) + +This field is used to indicate the status of the IR Code learning operation. This field MUST encoded [according to Table 63.](01.01.05-ir-repeater-ir-code-learning-status-command.md#115-ir-repeater-ir-code-learning-status-command) + +Table 63,IR Code Learning Status::Status encoding + +| Value | Description | +| --- | --- | +| 0x00 | Failed: Learning buffer overflow The node learning buffer is too small to learnt the entire IR Code. | +| 0x01 | Failed: Forced learning stop The node has received an IR Repeater IR Code Learning Stop Command before any code was learnt | +| 0x02 | Failed: timeout The node has timed out and did not learn any code | +| 0xFF | Success A new code was learnt. | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.06-ir-repeater-learnt-ir-code-remove-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.06-ir-repeater-learnt-ir-code-remove-command.md new file mode 100644 index 0000000..9ac11d5 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.06-ir-repeater-learnt-ir-code-remove-command.md @@ -0,0 +1,26 @@ + +# 1.1.6 IR Repeater Learnt IR Code Remove Command + +This command is used to instruct a supporting node to erase a previously learnt an IR Code. + +This command MUST be ignored by a receiving node if it advertises 0 Number of IR Code identifiers for learning [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER LEARNT IR CODE REMOVE (0x06) _ _ _ _ _ | | | | | | | | +| IR Code identifier | | | | | | | | + +IR Code identifier (2 bytes) + +This field indicates which IR Code identifier to erase. Values in the range 1..255 MUST indicate the actual IR Code identifier that MUST be erased by the supporting node. + +The value 0 MUST indicate to erase all IR codes. + +This command MUST be ignored if this field is set to a larger value than the Number of IR Code identifiers for learning [field advertised in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.07-ir-repeater-learnt-ir-code-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.07-ir-repeater-learnt-ir-code-get-command.md new file mode 100644 index 0000000..d42c64b --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.07-ir-repeater-learnt-ir-code-get-command.md @@ -0,0 +1,23 @@ + +# 1.1.7 IR Repeater Learnt IR Code Get Command + +This command is used to request a supporting node which IR Code identifiers have a valid IR Code learnt. + +This command MUST be ignored by a receiving node if it advertises 0 Number of IR Code identifiers for learning [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +[The IR Repeater Learnt IR Code Report Command MUST be returned in response to this command if it](01.01.08-ir-repeater-learnt-ir-code-report-command.md#118-ir-repeater-learnt-ir-code-report-command) was not ignored. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER LEARNT IR CODE GET (0x07) _ _ _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.08-ir-repeater-learnt-ir-code-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.08-ir-repeater-learnt-ir-code-report-command.md new file mode 100644 index 0000000..c7bad57 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.08-ir-repeater-learnt-ir-code-report-command.md @@ -0,0 +1,37 @@ + +# 1.1.8 IR Repeater Learnt IR Code Report Command + +This command is used to advertise the current IR learnt code stored at the supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER LEARNT IR CODE REPORT (0x08) _ _ _ _ _ | | | | | | | | +| Reserved | | | IR Code idenfier status length | | | | | +| IR Code identifier status bitmask 1 | | | | | | | | +| ... | | | | | | | | +| IR Code identifier status bitmask N | | | | | | | | + +IR Code idenfier status length (5 bits) + +This field is used to indicate the length in bytes of the IR Code identifier status bitmask field. + +This field MUST be set to the minimum value which allows advertising all IR Code currently set at the supporting node. + +IR Code identifier status bitmask (N bytes) + +This field advertises the supported IR Code identifier status values. The length of this field in bytes MUST match the value advertised in the IR Code Identifier Status Length field. + +This field MUST be encoded as a bitmask: + +• Bit 0 in Bit Mask 1 represents IR Code Identifier 0x01. • Bit 1 in Bit Mask 1 represents IR Code Identifier 0x02. • … + +If an IR Code is stored for the IR Code Identifier, the corresponding bit MUST be set to ‘1’. If no IR Code is stored for the IR Code Identifier, the corresponding bit MUST be set to ‘0’. + +[Only IR Codes with their bit set to ‘1’ can be repeated with the IR Repeater Repeat Learnt Code Command](01.01.14-ir-repeater-repeat-learnt-code-command.md#1114-ir-repeater-repeat-learnt-code-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.09-ir-repeater-learnt-ir-code-readback-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.09-ir-repeater-learnt-ir-code-readback-get-command.md new file mode 100644 index 0000000..6316484 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.09-ir-repeater-learnt-ir-code-readback-get-command.md @@ -0,0 +1,38 @@ + +# 1.1.9 IR Repeater Learnt IR Code Readback Get Command + +This command is used to request a supporting node has learnt an IR Code to return the code details to a controlling node. + +This command MUST be ignored by a receiving node if it advertises no support for LCR (Learnt Code Readback) [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +[The IR Repeater Learnt IR Code Report Command MUST be returned in response to this command if it](01.01.08-ir-repeater-learnt-ir-code-report-command.md#118-ir-repeater-learnt-ir-code-report-command) was not ignored. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER LEARNT IR CODE READBACK GET (0x09) _ _ _ _ _ _ | | | | | | | | +| IR Code identifier | | | | | | | | +| Res | Report Number (MSB) | | | | | | | +| Report Number (LSB) | | | | | | | | + +IR Code identifier (8 bits) + +This field is used to indicate the IR Code identifier that the supporting node MUST return in response to this command. + +A supporting node receiving a not supported IR Code Identifier or current unset/empty IR Code Identifier MUST return a report with Report Number set to 0, Last set to 1 and no Data block field. + +Report Number (15 bits) + +This field indicates the data block sequence number of the requested Learnt IR Code. The first data block MUST be identified by the Report Number value 1. + +If this field is set to 0 or a value higher than the total number of reports (indicated with the last field in the report), a supporting node MUST return a report with no Data block field. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.10-ir-repeater-learnt-ir-code-readback-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.10-ir-repeater-learnt-ir-code-readback-report-command.md new file mode 100644 index 0000000..2077be5 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.10-ir-repeater-learnt-ir-code-readback-report-command.md @@ -0,0 +1,64 @@ + +# 1.1.10 IR Repeater Learnt IR Code Readback Report Command + +This command is used to advertise the “contents” of a Learn IR Code. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER LEARNT IR CODE READBACK REPORT (0x0A) _ _ _ _ _ _ | | | | | | | | +| IR Code identifier | | | | | | | | +| Sub Carrier | | | | | | | | +| Reserved | | Duty Cycle | | Pulse time unit (MSB) | | | | +| Pulse time unit (LSB) | | | | | | | | +| Last | Report Number (MSB) | | | | | | | +| Report Number (LSB) | | | | | | | | +| Data block type 1 | | Data block length 1 | | | | | | +| Data block value 1, 1 | | | | | | | | +| ... | | | | | | | | +| Data block value 1, N | | | | | | | | +| ... | | | | | | | | +| Data block type M | | Data block length M | | | | | | +| Data block value M, 1 | | | | | | | | +| ... | | | | | | | | +| Data block value M, N | | | | | | | | + +IR Code identifier (8 bits) + +This field is used to indicate the IR Code identifier that the supporting node is currently sending. + +Sub Carrier (8 bits) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Duty Cycle (2 bits) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Pulse time unit (12 bits) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Report Number(15 bits) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) Last (1 bit) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Data block type (2 bits) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Data Block Length (5 bits) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Data Block value (N bytes) + +[For field description, refer to 1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.11-ir-repeater-configuration-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.11-ir-repeater-configuration-set-command.md new file mode 100644 index 0000000..6f4a7a3 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.11-ir-repeater-configuration-set-command.md @@ -0,0 +1,81 @@ + +# 1.1.11 IR Repeater Configuration Set Command + +This command is used to configure the IR signal properties before the supporting node would repeat IR Codes. + +This command MUST be ignored by a receiving node if it advertises no support for Bit Encoding Support (BES) [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +A supporting node MUST have a default bit 1, bit 0 and period configured after reset. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER CONFIGURATION SET (0x0B) _ _ _ | | | | | | | | +| Period (MSB) | | | | | | | | +| Reserved | | | | Period (LSB) | | | | +| Data bit 0 encoding length (MSB) | | | | | | | | +| Data bit 0 encoding length (LSB) | | | | | | | | +| Data bit 0 encoding 1 | | | | | | | | +| ... | | | | | | | | +| Data bit 0 encoding N | | | | | | | | +| Data bit 1 encoding length (MSB) | | | | | | | | +| Data bit 1 encoding length (LSB) | | | | | | | | +| Data bit 1 encoding 1 | | | | | | | | +| ... | | | | | | | | +| Data bit 1 encoding M | | | | | | | | + +Period (12 bits) + +This field is used to indicate the time period used for data bit encoding. + +This field MUST be expressed in micro seconds (µs). This field MUST be in the range 1..4096 + +Data bit ’0’ encoding length (2 bytes) + +This field is used to indicate the length in bits of the Data bit ’0’ encoding field. + +This field MUST be set to the exact number of bits to be interpreted from the Data bit ’0’ encoding field. + +This field MUST be ignored by a supporting node if the BES [field is set to 0 in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +Data bit ’0’ encoding (N bytes) + +[This field advertisesthe Hi/Low polarization encoding to apply to encode a 0 in an IR Code using the IR Repeater Repeat Command and IR Repeater Learnt IR Code Readback Report Command.](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +This field MUST be ignored by a supporting node if the BES [field is set to 0 in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +The length of this field MUST be the minimum amount of full bytes allowing to have the number of bits indicated in the the Data bit ’0’ encoding Length field. .e.g if the Data bit ’0’ encoding field is set to 13, this field MUST be 2 bytes long. + +Bits MUST be encoded as follows: + + The value 0 MUST indicate a Low polarization + + The value 1 MUST indicate a High polarization. + +[The whole sequence indicated in this field MUST be repeated by a supporting node when receiving a IR Repeater Repeat Command indicating to repeat a bit 0.](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Data bit ’1’ encoding length (2 bytes) + +This field is used to indicate the length in bits of the Data bit ’1’ encoding field. + +This field MUST be set to the exact number of bits to be interpreted from the Data bit ’1’ encoding field. + +This field MUST be ignored by a supporting node if the BES [field is set to 0 in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) Data bit ’1’ encoding (N bytes) + +[This field advertisesthe Hi/Low polarization encoding to apply to encode a 1 in an IR Code using the IR Repeater Repeat Command and IR Repeater Learnt IR Code Readback Report Command.](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +This field MUST be ignored by a supporting node if the BES [field is set to 0 in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +The length of this field MUST be the minimum amount of full bytes allowing to have the number of bits indicated in the the Data bit ’1’ encoding Length field. .e.g if the Data bit ’1’ encoding field is set to 13, this field MUST be 2 bytes long. + +Bits MUST be encoded as follows: + + The value 0 MUST indicate a Low polarization  The value 1 MUST indicate a High polarization. + +[The whole sequence indicated in this field MUST be repeated by a supporting node when receiving a IR Repeater Repeat Command indicating to repeat a bit 1.](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.12-ir-repeater-configuration-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.12-ir-repeater-configuration-get-command.md new file mode 100644 index 0000000..5356f78 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.12-ir-repeater-configuration-get-command.md @@ -0,0 +1,23 @@ + +# 1.1.12 IR Repeater Configuration Get Command + +This command is used to request the IR signal configuration at the supporting node. + +[The IR Repeater Configuration Report Command MUST be returned in response to this command.](01.01.13-ir-repeater-configuration-report-command.md#1113-ir-repeater-configuration-report-command) + +This command MUST be ignored by a receiving node if it advertises no support for Bit Encoding Support (BES) [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER _ _ _ | | | | | | | | +| Command = IR REPEATER CONFIGURATION GET (0x0C) _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.13-ir-repeater-configuration-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.13-ir-repeater-configuration-report-command.md new file mode 100644 index 0000000..e57a11d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.13-ir-repeater-configuration-report-command.md @@ -0,0 +1,29 @@ + +# 1.1.13 IR Repeater Configuration Report Command + +This command is used to advertise the current IR signal repeating configuration at the supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER CONFIGURATION REPORT (0x0D) _ _ _ | | | | | | | | +| Period (MSB) | | | | | | | | +| Reserved | | | | Period (LSB) | | | | +| Data bit 0 encoding length (MSB) | | | | | | | | +| Data bit 0 encoding length (LSB) | | | | | | | | +| Data bit 0 encoding 1 | | | | | | | | +| ... | | | | | | | | +| Data bit 0 encoding N | | | | | | | | +| Data bit 1 encoding length (MSB) | | | | | | | | +| Data bit 1 encoding length (LSB) | | | | | | | | +| Data bit 1 encoding 1 | | | | | | | | +| ... | | | | | | | | +| Data bit 1 encoding M | | | | | | | | + +[For fields’ description, refer to 1.1.11 IR Repeater Configuration Set Command](01.01.11-ir-repeater-configuration-set-command.md#1111-ir-repeater-configuration-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.14-ir-repeater-repeat-learnt-code-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.14-ir-repeater-repeat-learnt-code-command.md new file mode 100644 index 0000000..b5b761c --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.14-ir-repeater-repeat-learnt-code-command.md @@ -0,0 +1,24 @@ + +# 1.1.14 IR Repeater Repeat Learnt Code Command + +This command is used to request the receiving node to send an IR Code. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER REPEAT LEARNT CODE (0x0E) _ _ _ _ | | | | | | | | +| IR Code identifier | | | | | | | | + +IR Code identifier (8 bits) + +This field indicates which learnt IR Code identifier to repeat. Values in the range 1..255 MUST indicate the actual IR Code identifier to use for repeating the learnt code. + +This command MUST be ignored if this field is set to 0, if no IR Code is learnt for the received Identifier or if this field is set to a larger value than the Number of IR Code identifiers for learning field advertised [in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +A supporting node MUST repeat the IR code if a code has been learnt for the actual IR Code identifier. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.15-ir-repeater-repeat-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.15-ir-repeater-repeat-command.md new file mode 100644 index 0000000..107362d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/01.01.15-ir-repeater-repeat-command.md @@ -0,0 +1,135 @@ + +# 1.1.15 IR Repeater Repeat Command + +This command is used to request the receiving node to send/repeat an IR Code. + +This command MUST be ignored if the supporting node advertises no support for IR Code Repeating (IRR [) in the IR Repeater Capabilities Report Command.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IR REPEATER (0xA0) _ _ _ | | | | | | | | +| Command = IR REPEATER REPEAT (0x0F) _ _ | | | | | | | | +| Sequence number | | | | | | | | +| Sub carrier | | | | | | | | +| Reserved | | Duty Cycle | | Pulse time unit (MSB) | | | | +| Pulse time unit (LSB) | | | | | | | | +| Last | Report number (MSB) | | | | | | | +| Report number (LSB) | | | | | | | | +| Data block type 1 | | Data block length 1 | | | | | | +| Data block value 1, 1 | | | | | | | | +| ... | | | | | | | | +| Data block value 1, N | | | | | | | | +| ... | | | | | | | | +| Data block type M | | Data block length M | | | | | | +| Data block value M, 1 | | | | | | | | +| ... | | | | | | | | +| Data block value M, N | | | | | | | | + +Sequence number (8 bits) + +This field is used to keep track of the command that initiated the IR Repeat Command. Sub carrier (8 bits) + +This field is used to indicate the IR Sub carrier that the supporting node MUST use for repeating IR Codes. + +This field MUST be expressed in kHz (kiloHertz). + +Duty cycle (2 bits) + +This field is used to indicate the IR Carrier that the supporting node MUST use for repeating IR Codes. + +[This field MUST be encoded according to Table 64.](01.01.15-ir-repeater-repeat-command.md#1115-ir-repeater-repeat-command) + +Table 64,IR Repeater Repeat::Duty Cycle encoding + +| Value | Description | +| --- | --- | +| 0x00 | 1/2 Duty Cycle | +| 0x01 | 1/3 Duty Cycle | +| 0x02 | 1/4 Duty Cycle | +| 0x03 | Reserved. | + +[Values not advertised as supported in the IR Repeater Capabilities Report Command MUST be ignored](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) by a supporting node. + +Pulse time unit (12 bits) + +This field is used to interpret the data blocks using Pulse Encoding type. + +This field MUST be expressed in (µs) and be in the range 1..4096. + +Values lower than the Minimum Pulse Time Unit [advertised by the supporting node in the IR Repeater Capabilities Report Command MUST be ignored by a supporting node.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +Values higher than the Maximum Pulse Time Unit [advertised by the supporting node in the IR Repeater Capabilities Report Command MUST be ignored by a supporting node.](01.01.02-ir-repeater-capabilities-report-command.md#112-ir-repeater-capabilities-report-command) + +Report number (15 bits) + +A sending node typically needs several report commands to describe or encode an entire IR Code. This field is used to indicate the current report number being issued. The first report MUST have this field set to 1 and incremented at every new unique report Command. + +A receiving node MUST reassemble the IR Code by concatenating the data blocks of each repeat command. + +Data block 1,1 of the first report MUST represent the beginning of the IR Code signal and data block M,N of the last report MUST represent the end of the IR Code signal. + +Last (1 bit) + +This field is used to indicate that this is the Last report. The value 0 MUST indicate that this is not the last report and more are to follow. The value 1 MUST indicate that this is the last report and the supporting node MUST start repeating the IR Code. + +Data block type (2 bits) + +This field indicates how to interpret the corresponding Data block Value field. + + 0 : bit encoding (0/1)  1 : pulse encoding + +Data block length (6 bits) + +This field indicates the length in bytes of the corresponding Data block Value field. + +Data block value (6 bits) + +This field MUST interpreted according to the corresponding Data Block Type field. + +If the corresponding Data Block Type field is set to 0, this field MUST be interpreted as follow: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Number of bits 1 | | | | | | | | +| Number of bits 2 | | | | | | | | +| Data bits 1 | | | | | | | | +| ... | | | | | | | | +| Data bits L | | | | | | | | + +Number of bits (2 bytes) + +This subfield indicates how many bits to take from the Data bits subfield, starting from the LSB. For example, if this subfield is set to 12, a receiving node MUST interpret the first byte and the bits 0..3 of the second byte as data bits. + +Data bits (L bytes) + +This subfield is used to describe successive bits to be transmitted as part of the IR Code. Each data bit (bit 0 or bit 1) MUST be repeated/interpreted according to the IR Configuration set at the supporting [node. (IR Repeater Configuration Set Command)](01.01.11-ir-repeater-configuration-set-command.md#1111-ir-repeater-configuration-set-command) If the corresponding Data Block Type is set to 1, this field MUST be interpreted as follow: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Number of time units 1 | | | | | | | | +| ... | | | | | | | | +| Number of time units P | | | | | | | | + +Number of time units (8 bits) + +This subfield MUST represent the amount of time to use for an IR code pulse. The time unit is set in the Pulse time unit field. + +This field MUST be interpreted byte-by-byte. The first byte is the first to be interpreted. It represents how long to transmit a Hi or Lo polarity. + +The first byte (1) MUST represents a Hi Polarity. + +If a byte of this field is in the range 0..255, it MUST be intrepreted as a multiplier of the time unit. + +If a byte of this field is in the range 0..254, the polarity MUST be toggled for the next byte (from Hi to Lo or Lo to Hi) + +If a byte of this field is set to 255, the polarity MUST be the same for the next byte (Hi stays Hi and Lo stays Lo)If a byte of this field is set to 0, it must ignored. The value 0 can be used for example at the first byte to start an IR Code with a Lo polarity. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/index.md new file mode 100644 index 0000000..5220d18 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.50-ir-repeater-command-class-version-1/index.md @@ -0,0 +1,30 @@ + +# 4.50 IR Repeater Command Class, version 1 + +The IR Repeater Command Class is used to get supporting nodes to learn and/or repeat IR signals used to control appliances. + +A supporting node MUST have the capability to issue or receive IR signals. + +## Contents + +- [1.1.1 IR Repeater Capabilities Get Command](01.01.01-ir-repeater-capabilities-get-command.md) +- [1.1.2 IR Repeater Capabilities Report Command](01.01.02-ir-repeater-capabilities-report-command.md) +- [1.1.3 IR Repeater IR Code Learning Start Command](01.01.03-ir-repeater-ir-code-learning-start-command.md) +- [1.1.4 IR Repeater IR Code Learning Stop Command](01.01.04-ir-repeater-ir-code-learning-stop-command.md) +- [1.1.5 IR Repeater IR Code Learning Status Command](01.01.05-ir-repeater-ir-code-learning-status-command.md) +- [1.1.6 IR Repeater Learnt IR Code Remove Command](01.01.06-ir-repeater-learnt-ir-code-remove-command.md) +- [1.1.7 IR Repeater Learnt IR Code Get Command](01.01.07-ir-repeater-learnt-ir-code-get-command.md) +- [1.1.8 IR Repeater Learnt IR Code Report Command](01.01.08-ir-repeater-learnt-ir-code-report-command.md) +- [1.1.9 IR Repeater Learnt IR Code Readback Get Command](01.01.09-ir-repeater-learnt-ir-code-readback-get-command.md) +- [1.1.10 IR Repeater Learnt IR Code Readback Report Command](01.01.10-ir-repeater-learnt-ir-code-readback-report-command.md) +- [1.1.11 IR Repeater Configuration Set Command](01.01.11-ir-repeater-configuration-set-command.md) +- [1.1.12 IR Repeater Configuration Get Command](01.01.12-ir-repeater-configuration-get-command.md) +- [1.1.13 IR Repeater Configuration Report Command](01.01.13-ir-repeater-configuration-report-command.md) +- [1.1.14 IR Repeater Repeat Learnt Code Command](01.01.14-ir-repeater-repeat-learnt-code-command.md) +- [1.1.15 IR Repeater Repeat Command](01.01.15-ir-repeater-repeat-command.md) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.01-terminology.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.01-terminology.md similarity index 87% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.01-terminology.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.01-terminology.md index 67053c5..5135e41 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.01-terminology.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.01-terminology.md @@ -1,11 +1,11 @@ -# 4.42.1 Terminology +# 4.51.1 Terminology In an irrigation system, a zone valve is turned on to allow a certain group of sprinklers to water an area (or zone) for a specified duration. The terms zone valve and valve are used synonymously, whereas a master valve is always identified as such. @@ -19,7 +19,7 @@ In some cases a master valve switch may drive a pump relay rather than an actual A valve can be physically connected or disconnected. Attach points where valves can be connected always keep the same valve ID. A disconnected valve cannot be operated and the water does not run through a disconnected valve. -In an irrigation system, a scheduled run or run is when a set of zone valves are open and closed sequentially, one after another. Each zone valve will be turned on for a specified duration and once complete, that valve will be turned off and the next zone valve will be turned on. In a (scheduled) run, each zone valve has its own specified run duration, which is unique to that zone valve and that specific [(scheduled) run. At the end of a scheduled run, the Irrigation System Shutoff Command can also be used](04.42.21-irrigation-system-shutoff-command.md#44221-irrigation-system-shutoff-command) to turn everything off. +In an irrigation system, a scheduled run or run is when a set of zone valves are open and closed sequentially, one after another. Each zone valve will be turned on for a specified duration and once complete, that valve will be turned off and the next zone valve will be turned on. In a (scheduled) run, each zone valve has its own specified run duration, which is unique to that zone valve and that specific [(scheduled) run. At the end of a scheduled run, the Irrigation System Shutoff Command can also be](04.51.21-irrigation-system-shutoff-command.md#45121-irrigation-system-shutoff-command) used to turn everything off. A master valve remains on/open for the entire duration of any run, so that all zone valves will be able to provide water to their associated sprinklers. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.02-compatibility-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.02-compatibility-considerations.md new file mode 100644 index 0000000..825deb2 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.02-compatibility-considerations.md @@ -0,0 +1,12 @@ + +# 4.51.2 Compatibility considerations + +## 4.51.2.1 Multi Channel considerations + +Multi Channel End Points SHOULD NOT support the Irrigation Command Class. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.03-interoperability-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.03-interoperability-considerations.md similarity index 56% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.03-interoperability-considerations.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.03-interoperability-considerations.md index f7f3180..4f3440d 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.03-interoperability-considerations.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.03-interoperability-considerations.md @@ -1,15 +1,13 @@ -# 4.42.3 Interoperability considerations +# 4.51.3 Interoperability considerations -A node supporting the Irrigation Command Class SHOULD be implemented as a Multi Channel Device with the master valve and each zone valve implemented as a separate Multi Channel End Point. - -The Root Device SHOULD support the following Command Classes: +A node supporting the Irrigation Command Class SHOULD be implemented as a Multi Channel Device with the master valve and each zone valve implemented as a separate Multi Channel End Point. The Root Device SHOULD support the following Command Classes:  Irrigation Command Class  Schedule Command Class @@ -21,14 +19,16 @@ A node supporting optional sensors SHOULD implement each sensor as a separate Mu The Notification Command Class, version 7 or newer can be used for reporting Irrigation events/states, using the Irrigation Notification Type. -Scheduling can be done using the Schedule Command Class. If supported, the Schedule Command Class SHOULD support alternating days and odd/even date processing. +Scheduling can be done using the Schedule Command Class. If supported, the Schedule Command Class CC:006B.01.00.32.005 SHOULD support alternating days and odd/even date processing. + +Some supporting nodes MAY support having only 1 zone valve open at a time. A controlling node SHOULD be aware that opening a zone valve may cause another currently open zone valve to close. CC:006B.01.00.32.006 -Some supporting nodes MAY support having only 1 zone valve open at a time. A controlling node SHOULD be aware that opening a zone valve may cause another currently open zone valve to close. +## 4.51.3.1 Controlling methods -## 4.42.3.1 Controlling methods +A system integrator should be aware that if an irrigation control device is controlled using both End Point Binary Switch Command Class and Root Device Irrigation Command Class at the same time, this may cause unpredictable behavior. This applies whether commands are issued instantly or scheduled. -A system integrator should be aware that if an irrigation control device is controlled using both End Point Binary Switch Command Class and Root Device Irrigation Command Class at the same time, this may cause unpredictable behavior. This applies whether commands are issued instantly or scheduled. It is RECOMMENDED that an irrigation controlling system is managed either via direct End Point control or via the Irrigation Command Class. +It is RECOMMENDED that an irrigation controlling system is managed either via direct End Point control or via the Irrigation Command Class. An irrigation device can be driven directly from a Z-Wave controlling node, turning on the master valve and sequentially turning on each zone valve for a specified duration. -The controlling node can also use the concept of a valve table to turn on a set of valves sequentially. A [valve table allows a single command, the Irrigation Valve Table Run Command, to trigger a run. The](04.42.20-irrigation-valve-table-run-command.md#44220-irrigation-valve-table-run-command) [controlling node must first create the valve tables, using the Irrigation Valve Table Set Command. The](04.42.17-irrigation-valve-table-set-command.md#44217-irrigation-valve-table-set-command) [run can triggered by sending the Irrigation Valve Table Run Command at the desired time. The irrigation](04.42.20-irrigation-valve-table-run-command.md#44220-irrigation-valve-table-run-command) device will sequentially run the valves in each of the specified valve tables for their associated runtimes. Depending on the irrigation system, the controlling node may need to turn on the master valve manually [using the Irrigation Valve Run Command.](04.42.16-irrigation-valve-run-command.md#44216-irrigation-valve-run-command) +The controlling node can also use the concept of a valve table to turn on a set of valves sequentially. A [valve table allows a single command, the Irrigation Valve Table Run Command, to trigger a run. The](04.51.20-irrigation-valve-table-run-command.md#45120-irrigation-valve-table-run-command) [controlling node must first create the valve tables, using the Irrigation Valve Table Set Command. The](04.51.17-irrigation-valve-table-set-command.md#45117-irrigation-valve-table-set-command) [run can triggered by sending the Irrigation Valve Table Run Command at the desired time. The irrigation](04.51.20-irrigation-valve-table-run-command.md#45120-irrigation-valve-table-run-command) device will sequentially run the valves in each of the specified valve tables for their associated runtimes. Depending on the irrigation system, the controlling node may need to turn on the master valve [manually using the Irrigation Valve Run Command.](04.51.16-irrigation-valve-run-command.md#45116-irrigation-valve-run-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.04-irrigation-system-info-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.04-irrigation-system-info-get-command.md new file mode 100644 index 0000000..3474e72 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.04-irrigation-system-info-get-command.md @@ -0,0 +1,21 @@ + +# 4.51.4 Irrigation System Info Get Command + +This command is used to request a receiving node about its irrigation system information. + +[The Irrigation System Info Report Command MUST be returned in response to this command.](04.51.05-irrigation-system-info-report-command.md#4515-irrigation-system-info-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM INFO GET _ _ _ | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.05-irrigation-system-info-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.05-irrigation-system-info-report-command.md similarity index 59% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.05-irrigation-system-info-report-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.05-irrigation-system-info-report-command.md index e1c4682..fcadfa6 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.05-irrigation-system-info-report-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.05-irrigation-system-info-report-command.md @@ -1,22 +1,22 @@ -# 4.42.5 Irrigation System Info Report Command +# 4.51.5 Irrigation System Info Report Command This command is used to advertise irrigation system information. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM INFO REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Total Number of Valves | | | | | | | | | | | | | | | | | | | | | | | | -| Total Number of Valve Tables | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Valve Table Max Size | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM INFO REPORT _ _ _ | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Total Number of Valves | | | | | | | | +| Total Number of Valve Tables | | | | | | | | +| Reserved | | | | Valve Table Max Size | | | | Reserved diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.06-irrigation-system-status-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.06-irrigation-system-status-get-command.md new file mode 100644 index 0000000..bb78c1a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.06-irrigation-system-status-get-command.md @@ -0,0 +1,21 @@ + +# 4.51.6 Irrigation System Status Get Command + +This command is used to request a receiving node about its irrigation system status. + +The Irrigation System Status Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM STATUS GET _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.07-irrigation-system-status-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.07-irrigation-system-status-report-command.md new file mode 100644 index 0000000..4a9c5c4 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.07-irrigation-system-status-report-command.md @@ -0,0 +1,142 @@ + +# 4.51.7 Irrigation System Status Report Command + +This command is used to advertise irrigation system status. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM STATUS REPORT _ _ _ | | | | | | | | +| System Voltage | | | | | | | | +| Sensor Status | | | | | | | | +| Flow Precision | | | Flow Scale=l/h | | Flow Size | | | +| Flow Value 1 | | | | | | | | +| … | | | | | | | | +| Flow Value N | | | | | | | | +| Pressure Precision | | | Pressure Scale=kPa | | Pressure Size | | | +| Pressure Value 1 | | | | | | | | +| … | | | | | | | | +| Pressure Value N | | | | | | | | +| Shutoff Duration | | | | | | | | +| System Error Status | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Valve ID | | | | | | | | + +System Voltage (8 bits) + +This field advertises the voltage level applied at the sending node. + +The advertised value MUST be expressed in Volt. This field does not indicate the voltage type (AC or DC). + +If the node does not have a voltage sensor measuring the voltage, this field MUST be set to 0. + +Sensor Status (8 bits) + +This field is used to advertise if optional sensors are currently reporting values or detecting events at the sending node. + +[This field MUST be treated as a bit mask and MUST comply with Table 65](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) Table 65, Irrigation System Status Report::Sensor Status encoding + +| Bit | Sensor Status | +| --- | --- | +| 0 | Flow Sensor currently active If this bit is set to 1, the Flow Value field value MUST advertise a valid sensor reading. | +| 1 | Pressure Sensor currently active If this bit is set to 1, the Pressure Value field value MUST advertise a valid sensor reading. | +| 2 | Rain Sensor attached and active If a rain sensor is currently attached to the device and detecting rain, this bit MUST be set to 1. | +| 3 | Moisture Sensor attached and active If a moisture sensor is currently attached to the device and detecting moisture, this bit MUST be set to 1. | +| 4..7 | Reserved | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Flow Precision (3 bits) + +This field MUST indicate how many decimals are contained in the “Flow Value” field value. For example, if the “Flow Value” field is set to 1025 and the “Flow Precision” field is set to 2, the Flow Value MUST be interpreted as 10.25. + +If the Sensor Status field’s bit 0 is set to 0, this field MUST be set to 0. + +Flow Scale (2 bits) + +This field MUST indicate which unit is used for the “Flow Value” field. This field MUST be set to 0. + +The value 0 MUST indicate that the unit is l/h (liter/hour) + +Flow Size (3 bits) + +This field is used to advertise the length in bytes of the “Flow Value” field. This field MUST be set to 1, 2 or 4. All other values are reserved and MUST NOT be used by a sending node. + +If the Sensor Status field’s bit 0 is set to 0, this field MUST be set to 1. + +Flow Value (N bytes) + +This field is used to advertise the Flow value measured by the flow sensor. + +The length of this field in byte MUST comply with the value advertised in the Flow Size field. + +If the Sensor Status field’s bit 0 is set to 0, this field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Pressure Precision (3 bits) + +This field MUST indicate how many decimals are contained in the “Pressure Value” field value. For example, if the “Pressure Value” field is set to 1025 and the “Pressure Precision” field is set to 2, the Pressure Value MUST be interpreted as 10.25. + +If the Sensor Status field’s bit 1 is set to 0, this field MUST be set to 0. + +Pressure Scale (2 bits) + +This field MUST indicate which unit is used for the “Pressure Value” field. This field MUST be set to 0. + +The value 0 MUST indicate that the unit is kPa (kilopascal) + +Pressure Size (3 bits) + +This field is used to advertise the length in bytes of the “Pressure Value” field. This field MUST be set to 1, 2 or 4. All other values are reserved and MUST NOT be used by a sending node. + +If the Sensor Status field’s bit 1 is set to 0, this field MUST be set to 1. + +Pressure Value (N bytes) + +This field is used to advertise the Pressure value measured by the pressure sensor. + +The length of this field in bytes MUST comply with the value advertised in the Pressure Size field. + +If the Sensor Status field’s bit 1 is set to 0, this field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Shutoff Duration (8 bits) + +This field is used to indicate how many hours are left in the “shut off” mode. + +[For description, refer to 4.51.21 Irrigation System Shutoff Command.](04.51.21-irrigation-system-shutoff-command.md#45121-irrigation-system-shutoff-command) + +System Error Status (8 bits) + +This field is used to advertise if any system error is being active at the sending node. + +[This field MUST be treated as a bit mask and MUST comply with Table 66.](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) Table 66, System Status Report::System Error Status encoding + +| Bit | Description | +| --- | --- | +| 0 | The device has not been programmed | +| 1 | The device has experienced an emergency shutdown. | +| 2 | The device’s pressure high threshold has been triggered. | +| 3 | The device’s pressure low threshold has been triggered. | +| 4 | A valve or the master valve is reporting error. Valves can be individually checked using the Irrigation Valve Info Get Command | +| 5..7 | Reserved | + +In some cases, errors are no longer active. Any inactive errors (except valve errors) can be cleared by [sending an Irrigation System Config Set Command. Refer to the Irrigation Valve Info Report Command](04.51.08-irrigation-system-config-set-command.md#4518-irrigation-system-config-set-command) for more details on valve specific errors. + +Master Valve (1 bit) + +This field is used to indicate if a master valve is currently open or closed. + +The value 1 MUST indicate that the master valve is On / Open. + +The value 0 MUST indicate that the master valve is Off / Closed. + +Valve ID (8 bits) + +This field is used to indicate the Valve ID of the first open zone valve currently On / Open. + +If no zone valve is On / Open, this field MUST be set to 0. + +Else, this field MUST be to a value in the range 1..{Total number of supported zone valves} by a sending node diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.08-irrigation-system-config-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.08-irrigation-system-config-set-command.md new file mode 100644 index 0000000..51941cf --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.08-irrigation-system-config-set-command.md @@ -0,0 +1,68 @@ + +# 4.51.8 Irrigation System Config Set Command + +This command allows the irrigation system to be configured accordingly. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM CONFIG SET _ _ _ | | | | | | | | +| Master Valve Delay | | | | | | | | +| High Pressure Threshold Precision | | | High Pressure Threshold Scale=kPa | | High Pressure Threshold Size | | | +| High Pressure Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| High Pressure Threshold Value N | | | | | | | | +| Low Pressure Threshold Precision | | | Low Pressure Threshold Scale=kPa | | Low Pressure Threshold Size | | | +| Low Pressure Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| Low Pressure Threshold Value N | | | | | | | | +| Sensor Polarity | | | | | | | | + +Master Valve Delay (8 bits) + +This field is used to configure a delay in seconds between turning on the master valve and turning on any “zone” valve. + +This field MUST ignored by a receiving node if it does not implement a master valve. + +The value MUST be expressed in seconds and the value 0 MUST indicate that no delay is applied when turning master and zone valves on. + +Pressure High Threshold + +These fields are used to configure the pressure high threshold at the receiving node. + +A receiving node having no support for pressure sensor MAY ignore this field. + +[If the receiving node supports a Pressure Sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating high pressure when the pressure crosses](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) above this threshold. The format of the Pressure High Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in kPa. + +Pressure Low Threshold + +These fields are used to configure the pressure low threshold at the receiving node. + +A receiving node having no support for pressure sensor MAY ignore this field. + +[If the receiving node supports a Pressure Sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating low pressure when the pressure crosses](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) below this threshold. + +The format of the Pressure Low Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in kPa. + +Sensor Polarity (8 bits) + +This field is used to configure optional sensors’ polarity at the receiving node. + +[This field MUST be treated as a bit mask and MUST comply with Table 67. This field MUST be ignored if](04.51.08-irrigation-system-config-set-command.md#4518-irrigation-system-config-set-command) the ‘valid’ bit (bit 7) is set to 0. + +Table 67, Irrigation System Config Set::Sensor Polarity encoding + +| Bit | Description | +| --- | --- | +| 0 | Rain Sensor Polarity (0 LOW, 1 HIGH) A receiving node having no support for rain sensor MAY ignore this field. | +| 1 | Moisture Sensor Polarity (0 LOW, 1 HIGH) A receiving node having no support for moisture sensor MAY ignore this field | +| 2..6 | Reserved | +| 7 | Valid This bit MUST be set to 1 to indicate that the other bits in the bitmask contain valid data. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be CC:006B.01.05.11.008 ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.09-irrigation-system-config-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.09-irrigation-system-config-get-command.md new file mode 100644 index 0000000..c9fb0b2 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.09-irrigation-system-config-get-command.md @@ -0,0 +1,21 @@ + +# 4.51.9 Irrigation System Config Get Command + +This command is used to request a receiving node about its current irrigation system configuration. + +[The Irrigation System Config Report Command MUST be returned in response to this command.](04.51.10-irrigation-system-config-report-command.md#45110-irrigation-system-config-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM CONFIG GET _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.10-irrigation-system-config-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.10-irrigation-system-config-report-command.md new file mode 100644 index 0000000..fa6d587 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.10-irrigation-system-config-report-command.md @@ -0,0 +1,27 @@ + +# 4.51.10 Irrigation System Config Report Command + +This command is used to advertise the current irrigation system configuration. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM CONFIG REPORT _ _ _ | | | | | | | | +| Master Valve Delay | | | | | | | | +| High Pressure Threshold Precision | | | High Pressure Threshold Scale=kPa | | High Pressure Threshold Size | | | +| High Pressure Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| High Pressure Threshold Value N | | | | | | | | +| Low Pressure Threshold Precision | | | Low Pressure Threshold Scale=kPa | | Low Pressure Threshold Size | | | +| Low Pressure Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| Low Pressure Threshold Value N | | | | | | | | +| Sensor Polarity | | | | | | | | + +[For fields’ description, refer to 4.51.8 Irrigation System Config Set Command. A sending node MUST comply with field descriptions in 4.51.8 Irrigation System Config Set Command.](04.51.08-irrigation-system-config-set-command.md#4518-irrigation-system-config-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.11-irrigation-valve-info-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.11-irrigation-valve-info-get-command.md similarity index 56% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.11-irrigation-valve-info-get-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.11-irrigation-valve-info-get-command.md index 4323390..107b46f 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.11-irrigation-valve-info-get-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.11-irrigation-valve-info-get-command.md @@ -1,11 +1,11 @@ -# 4.42.11 Irrigation Valve Info Get Command +# 4.51.11 Irrigation Valve Info Get Command This command is used to request general information about the specified valve. @@ -13,12 +13,12 @@ The Irrigation Valve Info Report Command MUST be returned in response to this co This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE INFO GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE INFO GET _ _ _ | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Valve ID | | | | | | | | Reserved @@ -28,12 +28,16 @@ Master Valve (1 bit) This field is used to indicate whether the sending node requests the information of the master valve or of a zone valve. -The value 1 MUST indicate that the sending node requests the master valve information. The value 0 MUST indicate that the sending node requests information related to the zone valve corresponding to Valve ID field. +The value 1 MUST indicate that the sending node requests the master valve information. + +The value 0 MUST indicate that the sending node requests information related to the zone valve corresponding to Valve ID field. Valve ID (8 bits) This field is used to indicate the Valve ID if the sending node requests the information about a zone valve. -This field MUST be set to a Valve ID supported by the receiving node. A node receiving this command for an unsupported zone valve ID SHOULD return a report for the first supported zone valve. +This field MUST be set to a Valve ID supported by the receiving node. + +A node receiving this command for an unsupported zone valve ID SHOULD return a report for the first supported zone valve. If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.12-irrigation-valve-info-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.12-irrigation-valve-info-report-command.md similarity index 63% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.12-irrigation-valve-info-report-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.12-irrigation-valve-info-report-command.md index 584b040..35b928f 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.12-irrigation-valve-info-report-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.12-irrigation-valve-info-report-command.md @@ -1,22 +1,22 @@ -# 4.42.12 Irrigation Valve Info Report Command +# 4.51.12 Irrigation Valve Info Report Command This command is used to advertise general information about a given valve. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE INFO REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Conn- ected | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | -| Nominal Current | | | | | | | | | | | | | | | | | | | | | | | | -| Valve Error Status | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE INFO REPORT _ _ _ | | | | | | | | +| Reserved | | | | | | Conn- ected | Master Valve | +| Valve ID | | | | | | | | +| Nominal Current | | | | | | | | +| Valve Error Status | | | | | | | | Reserved @@ -40,13 +40,17 @@ This field is used to indicate the Valve ID if the sending node requests the inf This field MUST be set to a Valve ID supported by the receiving node. -If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. - -Nominal Current (8 bits) +If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. Nominal Current (8 bits) This field is used to advertise the valve’s nominal electric current when the valve is On / Open. -This field MUST be expressed as a multiple of 10mA. E.g. the value 23 represents 230 mA. This field MUST be set to 0 if the Connected field is set to 0. This field MUST advertise the last measured current (measured when the valve was on) when the valve is Off / Closed. Valve Error Status (8 bits) +This field MUST be expressed as a multiple of 10mA. E.g. the value 23 represents 230 mA. + +This field MUST be set to 0 if the Connected field is set to 0. + +This field MUST advertise the last measured current (measured when the valve was on) when the valve is Off / Closed. + +Valve Error Status (8 bits) This bit mask provides valve error status fields. The field MUST be encoded according the following: diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.13-irrigation-valve-config-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.13-irrigation-valve-config-set-command.md new file mode 100644 index 0000000..5508d3f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.13-irrigation-valve-config-set-command.md @@ -0,0 +1,116 @@ + +# 4.51.13 Irrigation Valve Config Set Command + +This command allows an irrigation valve to be configured accordingly. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE CONFIG SET _ _ _ | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Valve ID | | | | | | | | +| Nominal Current High Threshold | | | | | | | | +| Nominal Current Low Threshold | | | | | | | | +| Maximum Flow Precision | | | Maximum Flow Scale=l/h | | Maximum Flow Size | | | +| Maximum Flow Value 1 | | | | | | | | +| … | | | | | | | | +| Maximum Flow Value N | | | | | | | | +| Flow High Threshold Precision | | | Flow High Threshold Scale=l/h | | Flow High Threshold Size | | | +| Flow High Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| Flow High Threshold Value N | | | | | | | | +| Flow Low Threshold Precision | | | Flow Low Threshold Scale=l/h | | Flow Low Threshold Size | | | +| Flow Low Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| Flow Low Threshold Value N | | | | | | | | +| Sensor Usage | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Master Valve (1 bit) + +This field is used to indicate whether the valve to configure is the master valve or a zone valve. + +The value 1 MUST indicate that the valve to configure is the master valve. The value 0 MUST indicate that the valve to configure is the zone valve corresponding to Valve ID field. + +Valve ID (8 bits) + +This field is used to indicate the Valve ID to configure. + +This field MUST be set to a Valve ID supported by the receiving node. + +If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. + +Nominal Current High Threshold (8 bits) + +This field is used to configure the nominal current high threshold for the actual valve. + +[The receiving node MUST issue an Irrigation System Status Report Command with the System Error](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) Status indicating that a valve is reporting errors when the current crosses above this threshold. + +This field MUST be expressed as a multiple of 10mA. E.g. the value 23 represents 230 mA. + +Nominal Current Low Threshold (8 bits) + +This field is used to configure the nominal current low threshold for the actual valve at the receiving node. + +[The receiving node MUST issue an Irrigation System Status Report Command with the System Error](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) Status indicating that a valve is reporting errors when the current crosses below this threshold. + +This field MUST be expressed as a multiple of 10mA. E.g. the value 23 represents 230 mA. + +Maximum Flow + +These fields are used to configure the maximum allowed water flow for the specified valve. + +These fields MUST be ignored if the Master Valve field is set to 1. + +A receiving node having no support for flow sensor MAY ignore these fields. + +[If the receiving node supports a flow sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating that a valve is reporting errors when the water flow](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) crosses above this threshold. + +This field MUST be expressed in l/h (liter/hour). + +Flow High Threshold + +These fields are used to configure the flow high threshold for the specified valve. + +These fields MUST be ignored if the Master Valve field is set to 1. + +A receiving node having no support for flow sensor MAY ignore these fields. [If the receiving node supports a flow sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating that a valve is reporting errors when the water flow](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) crosses above this threshold. + +The format of the Flow High Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in l/h (liter/hour). + +Flow Low Threshold + +These fields are used to configure the flow low threshold for the specified valve. + +These fields MUST be ignored if the Master Valve field is set to 1. + +A receiving node having no support for flow sensor MAY ignore these fields. + +[If the receiving node supports a flow sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating that a valve is reporting errors when the water flow](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) crosses below this threshold. + +The format of the Flow Low Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in l/h (liter/hour). + +Sensor Usage (8 bits) + +This field is used to configure if the actual valve must turn off / close when the specified sensors are active. + +This field MUST be ignored if the Master Valve field is set to 1. + +[This field MUST be treated as a bit mask and MUST comply with Table 68, Irrigation Valve Config Set::Sensor Usage.](04.51.13-irrigation-valve-config-set-command.md#45113-irrigation-valve-config-set-command) + +Table 68, Irrigation Valve Config Set::Sensor Usage encoding + +| Bit | Description | +| --- | --- | +| 0 | Use Rain Sensor The valve MUST turn off / close if rain is detected A receiving node having no support for rain sensor MAY ignore this field. | +| 1 | Use Moisture Sensor The valve MUST turn off / close if moisture is detected A receiving node having no support for moisture sensor MAY ignore this field. | +| 2..7 | Reserved | + +CC:006B.01.0A.11.015 All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.14-irrigation-valve-config-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.14-irrigation-valve-config-get-command.md similarity index 69% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.14-irrigation-valve-config-get-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.14-irrigation-valve-config-get-command.md index 29ef5bd..5e05335 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.14-irrigation-valve-config-get-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.14-irrigation-valve-config-get-command.md @@ -1,11 +1,11 @@ -# 4.42.14 Irrigation Valve Config Get Command +# 4.51.14 Irrigation Valve Config Get Command This command is used to request the current configuration of an irrigation valve. @@ -13,12 +13,12 @@ The Irrigation Valve Config Report Command MUST be returned in response to this This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE CONFIG GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE CONFIG GET _ _ _ | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Valve ID | | | | | | | | Reserved diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.15-irrigation-valve-config-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.15-irrigation-valve-config-report-command.md new file mode 100644 index 0000000..a6db772 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.15-irrigation-valve-config-report-command.md @@ -0,0 +1,36 @@ + +# 4.51.15 Irrigation Valve Config Report Command + +This command is used to advertise the configuration of a valve. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE CONFIG REPORT _ _ _ | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Valve ID | | | | | | | | +| Nominal Current High Threshold | | | | | | | | +| Nominal Current Low Threshold | | | | | | | | +| Maximum Flow Precision | | | Maximum Flow Scale=l/h | | Maximum Flow Size | | | +| Maximum Flow Value 1 | | | | | | | | +| … | | | | | | | | +| Maximum Flow Value N | | | | | | | | +| Flow High Threshold Precision | | | Flow High Threshold Scale=l/h | | Flow High Threshold Size | | | +| Flow High Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| Flow High Threshold Value N | | | | | | | | +| Flow Low Threshold Precision | | | Flow Low Threshold Scale=l/h | | Flow Low Threshold Size | | | +| Flow Low Threshold Value 1 | | | | | | | | +| … | | | | | | | | +| Flow Low Threshold Value N | | | | | | | | +| Sensor Usage | | | | | | | | + +[For fields’ description, refer to 4.51.13 Irrigation Valve Config Set Command.](04.51.13-irrigation-valve-config-set-command.md#45113-irrigation-valve-config-set-command) + +[A sending node MUST comply with field descriptions in 4.51.13 Irrigation Valve Config Set Command.](04.51.13-irrigation-valve-config-set-command.md#45113-irrigation-valve-config-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.16-irrigation-valve-run-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.16-irrigation-valve-run-command.md new file mode 100644 index 0000000..d51cb0d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.16-irrigation-valve-run-command.md @@ -0,0 +1,41 @@ + +# 4.51.16 Irrigation Valve Run Command + +The Irrigation Valve Run Command will run the specified valve for a specified duration. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE RUN _ _ | | | | | | | | +| Reserved | | | | | | | Master Valve | +| Valve ID | | | | | | | | +| Duration MSB | | | | | | | | +| Duration LSB | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Master Valve (1 bit) + +This field is used to indicate if the specified valve is the master valve or a zone valve. + +The value 1 MUST indicate that the specified valve is the master valve. The value 0 MUST indicate that the specified valve is the zone valve corresponding to Valve ID field. + +Valve ID (8 bits) + +This field is used to specify the actual Valve ID. + +This field MUST be set to a Valve ID supported by the receiving node. If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. + +Duration (16 bits) + +This field is used to specify the duration of the run in seconds. + +The value 0 MUST indicate that the valve MUST be turned off / Closed immediately. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.17-irrigation-valve-table-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.17-irrigation-valve-table-set-command.md new file mode 100644 index 0000000..2d7d258 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.17-irrigation-valve-table-set-command.md @@ -0,0 +1,39 @@ + +# 4.51.17 Irrigation Valve Table Set Command + +This command is used to set a valve table with a list of valves and durations. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE TABLE SET _ _ _ | | | | | | | | +| Valve Table ID | | | | | | | | +| Valve ID 1 | | | | | | | | +| Duration MSB 1 | | | | | | | | +| Duration LSB 1 | | | | | | | | +| … | | | | | | | | +| Valve ID N | | | | | | | | +| Duration MSB N | | | | | | | | +| Duration LSB N | | | | | | | | + +Valve Table ID (8 bits) + +This field is used to specify the valve table ID. + +This field MUST be set to a Valve Table ID supported by the receiving node. + +Valve ID and Duration (N * 3 bytes) + +These fields are used to specify valve IDs and their associated run duration. + +A sending node MUST NOT specify more Valve IDs than the “Valve Table Max Size” advertised by a [receiving node in the Irrigation System Info Report Command](04.51.05-irrigation-system-info-report-command.md#4515-irrigation-system-info-report-command) + +The duration MUST be expressed in seconds. + +This field MAY be omitted in order to erase/empty the specified valve table. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.18-irrigation-valve-table-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.18-irrigation-valve-table-get-command.md similarity index 57% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.18-irrigation-valve-table-get-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.18-irrigation-valve-table-get-command.md index 8bf2ecd..4321b1e 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.18-irrigation-valve-table-get-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.18-irrigation-valve-table-get-command.md @@ -1,11 +1,11 @@ -# 4.42.18 Irrigation Valve Table Get Command +# 4.51.18 Irrigation Valve Table Get Command This command is used to request the contents of the specified Valve Table ID. @@ -13,11 +13,11 @@ The Irrigation Valve Table Report Command MUST be returned in response to this c This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE TABLE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Valve Table ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE TABLE GET _ _ _ | | | | | | | | +| Valve Table ID | | | | | | | | Valve Table ID (8 bits) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.19-irrigation-valve-table-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.19-irrigation-valve-table-report-command.md new file mode 100644 index 0000000..f4d4986 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.19-irrigation-valve-table-report-command.md @@ -0,0 +1,27 @@ + +# 4.51.19 Irrigation Valve Table Report Command + +This command provides the contents of the specified Valve Table ID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE TABLE REPORT _ _ _ | | | | | | | | +| Valve Table ID | | | | | | | | +| Valve ID 1 | | | | | | | | +| Duration MSB 1 | | | | | | | | +| Duration LSB 1 | | | | | | | | +| … | | | | | | | | +| Valve ID N | | | | | | | | +| Duration MSB N | | | | | | | | +| Duration LSB N | | | | | | | | + +[For fields’ description, refer to 4.51.17 Irrigation Valve Table Set Command.](04.51.17-irrigation-valve-table-set-command.md#45117-irrigation-valve-table-set-command) + +[A sending node MUST comply with field descriptions in 4.51.17 Irrigation Valve Table Set Command.](04.51.17-irrigation-valve-table-set-command.md#45117-irrigation-valve-table-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.20-irrigation-valve-table-run-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.20-irrigation-valve-table-run-command.md new file mode 100644 index 0000000..b89c87e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.20-irrigation-valve-table-run-command.md @@ -0,0 +1,24 @@ + +# 4.51.20 Irrigation Valve Table Run Command + +This command is used to run the specified valve tables sequentially. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION VALVE TABLE RUN _ _ _ | | | | | | | | +| Valve Table ID 1 | | | | | | | | +| … | | | | | | | | +| Valve Table ID N | | | | | | | | + +Valve Table ID (N bytes) + +This field is used to specify the list of Valve Tables to run sequentially. + +A receiving node MUST run the indicated Valve Table ID starting by the entry 1. These fields contain a variable list of valve table IDs that will be run sequentially in the order they are listed. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.21-irrigation-system-shutoff-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.21-irrigation-system-shutoff-command.md similarity index 53% rename from docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.21-irrigation-system-shutoff-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.21-irrigation-system-shutoff-command.md index 9c138f9..df6d8dc 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.21-irrigation-system-shutoff-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/04.51.21-irrigation-system-shutoff-command.md @@ -1,19 +1,19 @@ -# 4.42.21 Irrigation System Shutoff Command +# 4.51.21 Irrigation System Shutoff Command This command is used to prevent any irrigation activity triggered by the Schedule CC for a specified duration. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM SHUTOFF _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | +| Command = IRRIGATION SYSTEM SHUTOFF _ _ | | | | | | | | +| Duration | | | | | | | | Duration (8 bits) @@ -21,14 +21,14 @@ This field is used to indicate the duration of the system shutoff. Values in the range 1..254 MUST indicate how many hours the irrigation system MUST stay shut off after reception of this command. While active, the shutoff duration MUST prevent all enabled schedules (including the back-up schedule) from running. After the shutoff duration is over, any enabled schedule MUST run as configured. -The value 0 MUST indicate to turn off any running valve (including the master valve) as well as cancel any active Irrigation Valve Table Run or Schedule. Any subsequent schedule MUST run as configured. +The value 0 MUST indicate to turn off any running valve (including the master valve) as well as cancel any active Irrigation Valve Table Run or Schedule. Any subsequent schedule MUST run as configured. CC:006B.01.12.11.005 The value 255 MUST indicate that the irrigation system MUST stay permanently shut off until the node receives one of the following commands: - [Irrigation System Shutoff Command with a Duration different than 255.](04.42.21-irrigation-system-shutoff-command.md#44221-irrigation-system-shutoff-command)  [Irrigation Valve Run Command](04.42.16-irrigation-valve-run-command.md#44216-irrigation-valve-run-command)  [Irrigation Valve Table Run Command](04.42.20-irrigation-valve-table-run-command.md#44220-irrigation-valve-table-run-command) + [Irrigation System Shutoff Command with a Duration different than 255.](04.51.21-irrigation-system-shutoff-command.md#45121-irrigation-system-shutoff-command)  [Irrigation Valve Run Command](04.51.16-irrigation-valve-run-command.md#45116-irrigation-valve-run-command)  [Irrigation Valve Table Run Command](04.51.20-irrigation-valve-table-run-command.md#45120-irrigation-valve-table-run-command) When permanently shut off, the node MUST NOT run any schedule -[A receiving node MUST cancel the current shutoff and advertise a shutoff duration of 0 in the Irrigation System Status Report Command after receiving one of the following commands:](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) +[A receiving node MUST cancel the current shutoff and advertise a shutoff duration of 0 in the Irrigation System Status Report Command after receiving one of the following commands:](04.51.07-irrigation-system-status-report-command.md#4517-irrigation-system-status-report-command) - [Irrigation Valve Run Command](04.42.16-irrigation-valve-run-command.md#44216-irrigation-valve-run-command)  [Irrigation Valve Table Run Command](04.42.20-irrigation-valve-table-run-command.md#44220-irrigation-valve-table-run-command) + [Irrigation Valve Run Command](04.51.16-irrigation-valve-run-command.md#45116-irrigation-valve-run-command)  [Irrigation Valve Table Run Command](04.51.20-irrigation-valve-table-run-command.md#45120-irrigation-valve-table-run-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/index.md new file mode 100644 index 0000000..2bb9d05 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.51-irrigation-command-class-version-1/index.md @@ -0,0 +1,34 @@ + +# 4.51 Irrigation Command Class, version 1 + +The Irrigation Command Class provides commands to manage irrigation systems. + +## Contents + +- [4.51.1 Terminology](04.51.01-terminology.md) +- [4.51.2 Compatibility considerations](04.51.02-compatibility-considerations.md) +- [4.51.3 Interoperability considerations](04.51.03-interoperability-considerations.md) +- [4.51.4 Irrigation System Info Get Command](04.51.04-irrigation-system-info-get-command.md) +- [4.51.5 Irrigation System Info Report Command](04.51.05-irrigation-system-info-report-command.md) +- [4.51.6 Irrigation System Status Get Command](04.51.06-irrigation-system-status-get-command.md) +- [4.51.7 Irrigation System Status Report Command](04.51.07-irrigation-system-status-report-command.md) +- [4.51.8 Irrigation System Config Set Command](04.51.08-irrigation-system-config-set-command.md) +- [4.51.9 Irrigation System Config Get Command](04.51.09-irrigation-system-config-get-command.md) +- [4.51.10 Irrigation System Config Report Command](04.51.10-irrigation-system-config-report-command.md) +- [4.51.11 Irrigation Valve Info Get Command](04.51.11-irrigation-valve-info-get-command.md) +- [4.51.12 Irrigation Valve Info Report Command](04.51.12-irrigation-valve-info-report-command.md) +- [4.51.13 Irrigation Valve Config Set Command](04.51.13-irrigation-valve-config-set-command.md) +- [4.51.14 Irrigation Valve Config Get Command](04.51.14-irrigation-valve-config-get-command.md) +- [4.51.15 Irrigation Valve Config Report Command](04.51.15-irrigation-valve-config-report-command.md) +- [4.51.16 Irrigation Valve Run Command](04.51.16-irrigation-valve-run-command.md) +- [4.51.17 Irrigation Valve Table Set Command](04.51.17-irrigation-valve-table-set-command.md) +- [4.51.18 Irrigation Valve Table Get Command](04.51.18-irrigation-valve-table-get-command.md) +- [4.51.19 Irrigation Valve Table Report Command](04.51.19-irrigation-valve-table-report-command.md) +- [4.51.20 Irrigation Valve Table Run Command](04.51.20-irrigation-valve-table-run-command.md) +- [4.51.21 Irrigation System Shutoff Command](04.51.21-irrigation-system-shutoff-command.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.52-language-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.52-language-command-class-version-1.md new file mode 100644 index 0000000..b7d26a7 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.52-language-command-class-version-1.md @@ -0,0 +1,81 @@ + +# 4.52 Language Command Class, version 1 + +The Language Command Class is used to specify the language settings on a device. + +## 4.52.1 Language Set Command + +This command is used to set the language at the receiving node. The receiving node SHOULD use the default language in case the received language is not supported. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS LANGUAGE _ _ | | | | | | | | +| Command = LANGUAGE SET _ | | | | | | | | +| Language 1 | | | | | | | | +| Language 2 | | | | | | | | +| Language 3 | | | | | | | | +| Country 1 | | | | | | | | +| Country 2 | | | | | | | | + +Language (24 bits) + +The code definition of the languages may be found in ISO 639-2:1998 ‘Codes for the representation of names of languages – Part 2: Alpha-3 code’. In the table below are some examples of the alpha-3 codes listed: + +| Language | Language 1 | Language 2 | Language 3 | +| --- | --- | --- | --- | +| English | e | n | g | +| Flemish; Dutch | d | u | t | +| French | f | r | e | +| German | g | e | r | +| Italian | i | t | a | +| Polish | p | o | l | +| Russian | r | u | s | +| Walloon | w | l | n | + +Country (16 bits) + +The code definition of the countries may be found in ISO 3166-1 ‘Country Codes: Alpha-2 codes’. The use of the country field is OPTIONAL and only defined in case it is necessary for distinguishing geographical variants. The number of data fields transmitted MUST be determined from the length field in the frame. In the table below are some examples of the alpha-2 codes listed: + +| Language | Country 1 | Country 2 | +| --- | --- | --- | +| Belgium | B | E | +| Italy | I | T | +| Netherlands | N | L | +| Poland | P | L | +| United Kingdom | G | B | +| United States | U | S | + +## 4.52.2 Language Get Command + +This command is used to request the current language setting in a device. + +The Language Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS LANGUAGE _ _ | | | | | | | | +| Command = LANGUAGE GET _ | | | | | | | | + +## 4.52.3 Language Report Command + +This commandreturns the current language setting in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS LANGUAGE _ _ | | | | | | | | +| Command = LANGUAGE REPORT _ | | | | | | | | +| Language 1 | | | | | | | | +| Language 2 | | | | | | | | +| Language 3 | | | | | | | | +| Country 1 | | | | | | | | +| Country 2 | | | | | | | | + +[For fields’ description, refer to 4.52.1 Language Set Command.](04.52-language-command-class-version-1.md#4521-language-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.53-lock-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.53-lock-command-class-version-1-deprecated.md new file mode 100644 index 0000000..1fa056a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.53-lock-command-class-version-1-deprecated.md @@ -0,0 +1,55 @@ + +# 4.53 Lock Command Class, version 1 [DEPRECATED] + +THIS COMMAND CLASS HAS BEEN DEPRECATED + +A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Door Lock Command Class. If implementing this command class, it is RECOMMENDED that the Door Lock Command Class is also implemented. + +The Lock Command Class is used to lock and unlock a “lock” type device, e.g. a door or window lock + +## 4.53.1 Lock Set Command + +This command is used to set the lock state in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS LOCK _ _ | | | | | | | | +| Command = LOCK SET _ | | | | | | | | +| Lock State | | | | | | | | + +Lock State (8 bits) + +The lock state field used to set the lock state of the device. The value 0 indicates that the device is unlocked. The value 1 indicates that the device is locked. + +## 4.53.2 Lock Get Command + +This command is used to request the lock state from a device. + +The Lock Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS LOCK _ _ | | | | | | | | +| Command = LOCK GET _ | | | | | | | | + +## 4.53.3 Lock Report Command + +This command is used to report the lock state of a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS LOCK _ _ | | | | | | | | +| Command = LOCK REPORT _ | | | | | | | | +| Lock State | | | | | | | | + +Lock State (8 bits) + +The Lock state field used to report the lock state of the device. The value 0 indicates that the device is unlocked. The value 1 indicates that the device is locked. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.45-manufacturer-proprietary-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.54-manufacturer-proprietary-command-class-version-1.md similarity index 61% rename from docs/specs/command-class-specification/04-command-class-definitions/04.45-manufacturer-proprietary-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.54-manufacturer-proprietary-command-class-version-1.md index e349396..109e362 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.45-manufacturer-proprietary-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.54-manufacturer-proprietary-command-class-version-1.md @@ -1,17 +1,17 @@ -# 4.45 Manufacturer Proprietary Command Class, version 1 +# 4.54 Manufacturer Proprietary Command Class, version 1 The Manufacturer Proprietary Command Class is used to transfer data between devices in the Z-Wave network. The data content MUST be vendor specific and MUST be non-value added with respect to the Home Automation application in general. An example could be data used to diagnose the hardware in a device. -Note: Do not use the Manufacturer Proprietary Command Class without written approval from Sigma Designs. +Note: Do not use the Manufacturer Proprietary Command Class without written approval from Silicon Labs. -## 4.45.1 Manufacturer Proprietary Command +## 4.54.1 Manufacturer Proprietary Command Thiscommand is used to transfer proprietary commands between devices. The Command features a manufacturer specific identifier to allow the receiving device to check if this Command can be interpreted. The vendor is responsible for establishing a Command structure to differ between the set of Commands supported. @@ -19,18 +19,18 @@ In order not to congest the Z-Wave network, large data transfers MUST leave tran  40 kbit/s: At least 35 ms if sending more than 2 frames back-to-back  100 kbit/s: At least 15 ms if sending more than 2 frames back-to-back -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS MANUFACTURER PROPRIETARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer ID 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer ID 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Data N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MANUFACTURER PROPRIETARY _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | Manufacturer ID (16 bits) -The Manufacturer ID is a unique ID identifying the manufacturer of the device. Manufacturer identifiers [can be found in [12].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +The Manufacturer ID is a unique ID identifying the manufacturer of the device. Manufacturer identifiers [can be found in [12].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) The first byte (Manufacturer ID 1) is the most significant byte. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.55-meter-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.55-meter-command-class-version-1.md new file mode 100644 index 0000000..7ce0a41 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.55-meter-command-class-version-1.md @@ -0,0 +1,87 @@ + +# 4.55 Meter Command Class, version 1 + +The Meter Command Class is used to advertise instantaneous and accumulated numerical readings. + +The Command Class is intended for accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling some automatic meter reading capabilities. + +## 4.55.1 Terminology + +A meter is used to monitor a resource. The meter accumulates the resource flow over time. As an option, the meter may report not only the most recent accumulated reading but also the previous reading and the time that elapsed since then. A meter may also be able to report the current resource flow. This is known as the instant value. + +Meters may report two rate types. A utility installs production meters in its production facilities, while it installs consumption meters at consumer premises. The difference is the mapping of the physical flow direction to the forward direction of the meter: + + The accumulated value of a production meter grows when more resources are produced  The accumulated value of a production meter drops when more resources are consumed + + The accumulated value of a consumption meter grows when more resources are consumed  The accumulated value of a consumption meter drops when more resources are produced + +If a meter only supports one rate type, the meter may run backwards. If a meter runs backwards, the accumulated value may eventually become negative. While the production meter of a power generator rarely runs backwards, the consumption meter in a private household with solar panels runs backwards every time the solar panels deliver more than is consumed in the household. The actual reading of a one-rate type meter reflects the net accumulated value since the meter was installed with a factory default reading of zero. The accumulated value over an arbitrary interval may be calculated by subtracting a previous accumulated value from the current accumulated value. Normal arithmetic rules ensure that this also works in case of negative values. + +A production meter may be used as a consumption meter by applying a sign change to all production meter readings before using the values as consumption meter readings. + +A meter device may advertise that it implements two separate registers for the production and consumption, respectively. In that case, both of these meters are always running forward: Production makes the production meter run forward while consumption makes the consumption meter run forward. Two meter reports must be used to report the values of the respective meters. + +## 1.1.1 Meter Get Command + +This command is used to request the current meter reading to a supporting node. + +The Meter Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER GET (0x01) _ | | | | | | | | + +## 1.1.2 Meter Report Command + +This command is used to advertise the current meter reading at the sending node. + +This command MUST NOT be issued using broadcast addressing. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER REPORT (0x02) _ | | | | | | | | +| Meter Type | | | | | | | | +| Precision | | | Scale | | Size | | | +| Meter Value 1 | | | | | | | | +| … | | | | | | | | +| Meter Value N | | | | | | | | + +Meter Type (8 bits) + +This field is used to specify what type of metering physical unit is being reported. + +[This field MUST be encoded according to Table 75.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Precision (3 bits) + +This field MUST indicate how many decimal places are included in the Meter Value field. For example, the Meter Value field set to 1025 and this field set to 2 MUST be interpreted as equal to 10.25. + +The value of the precision field MUST be in the range 0..7. Scale (2 bits) + +This field MUST advertise the unit used for the Meter Value field. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Size (3 bits) + +This field indicates the length in bytes of the Meter Value field. This field MUST be set to 1, 2 or 4. + +Meter Value (N bytes) + +This field is used to advertise the actual meter reading. + +The length of this field in bytes MUST be according to the Size field. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.56-meter-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.56-meter-command-class-version-2.md new file mode 100644 index 0000000..5dd4e85 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.56-meter-command-class-version-2.md @@ -0,0 +1,209 @@ + +# 4.56 Meter Command Class, version 2 + +The Meter Command Class is used to advertise instantaneous and accumulated numerical readings. + +The Command Class is intended for accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling some automatic meter reading capabilities. + +## 4.56.1 Compatibility Considerations + +The Meter Command Class, version 2 introduces the following functionalities: + + Commands to interview supporting nodes Meter capabilities  New field ‘Previous Meter Value’ added to the Meter Report indicating consumption since previous report.  An optional Meter Reset Command for resetting accumulated consumption.  New meter scales have been added + +Commands and fields not mentioned in this version MUST remain unchanged from version 1. + +Supporting nodes MAY support several scales. A manufacturer MUST define which scale is the default scale and it MUST be described in the product manual. + +## 4.56.2 Meter Supported Get Command + +This command is used to request the supported scales in a sub meter. + +The Meter Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER SUPPORTED GET (0x03) _ _ | | | | | | | | + +## 4.56.3 Meter Supported Report Command + +This command is used to advertise the supported scales and capabilities of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER SUPPORTED REPORT (0x04) _ _ | | | | | | | | +| Meter Reset | Reserved | | Meter Type | | | | | +| Reserved | | | | Scale Supported | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Meter Reset (1 bit) + +This field is used to indicate if the sending node supports the Meter Reset Command. + +The value 1 MUST indicate that the Meter Reset Command is supported. + +The value 0 MUST indicate that the Meter Reset Command is not supported and MUST be ignored by the sending node. + +Meter Type (5 bits) + +This field is used to advertise the implemented meter type by the sending node. + +[This field MUST be encoded according to Table 75.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Scale Supported (4 bits) This field is used to advertise the supported scales of the sending node. + +The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. + +This MUST be interpreted as a bitmask in combination with the Meter Type field and MUST be [according to Table 74.](04.59-meter-command-class-version-5.md#4592-meter-supported-report-command) + +## 4.56.4 Meter Reset Command + +This command is used to reset all accumulated values stored at the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER RESET (0x05) _ | | | | | | | | + +A supporting node MUST reset all its supported accumulated values when receiving this command if it [advertises support for Meter Reset in the Meter Supported Report Command.](04.56-meter-command-class-version-2.md#4563-meter-supported-report-command) + +[A supporting node MUST ignore this command if it advertises no support for Meter Reset in the Meter Supported Report Command](04.56-meter-command-class-version-2.md#4563-meter-supported-report-command) + +## 4.56.5 Meter Get Command + +This command is used to request the current meter reading to a supporting node . + +The Meter Report Command MUST be returned in response to this command if the requested scale is supported. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER GET (0x01) _ | | | | | | | | +| Reserved | | | Scale | | Reserved | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Scale (2 bits) + +This field is used to request an actual scale for the meter reading. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +If this field is not present or set to 0x00, a supporting node MUST return a report using its default scale. + +A supporting node MUST ignored this command if this field is set to a non-supported scale. + +For improved compatibility with version 1 controlling nodes, a supporting node receiving this command without this field (version 1 format) SHOULD either return a version 1 Report Command or a Report Command with the Rate Type field set to 0x00 + +## 4.56.6 Meter Report Command + +This command is used to advertise the current meter reading at the sending node. + +This command MUST NOT be issued using broadcast addressing. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER REPORT (0x02) _ | | | | | | | | +| Res | Rate Type | | Meter Type | | | | | +| Precision | | | Scale | | Size | | | +| Meter Value 1 | | | | | | | | +| … | | | | | | | | +| Meter Value N | | | | | | | | +| Delta Time 1 | | | | | | | | +| Delta Time 2 | | | | | | | | +| Previous Meter Value 1 (optional) | | | | | | | | +| … | | | | | | | | +| Previous Meter Value N (optional) | | | | | | | | + +Fields not described below MUST remain unchanged from version 1. + +Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Rate Type (2 bits) + +This field is used to indicate if the actual reading advertises import or export values. + +The Import value for a meter reading MUST indicate that the reading represents a consumed amount. The Export value for a meter reading MUST indicate that the reading represents a produced amount. + +[This field MUST be encoded according to Table 69.](04.56-meter-command-class-version-2.md#4566-meter-report-command) + +Table 69, Meter Report::Rate Type encoding + +| Value | Rate Type | Version | +| --- | --- | --- | +| 0x00 | Unspecified | 1 | +| 0x01 | Import (consumed) | 2 | +| 0x02 | Export (produced) | 2 | +| 0x03 | Reserved | - | + +Meter Type (5 bits) + +This field is used to specify what type of metering physical unit is being reported. + +[This field MUST be encoded according to Table 75.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Precision (3 bits) + +This field MUST indicate how many decimal places are included in the Meter Value and Previous Meter Value fields. For example, the Meter Value set to 1025 and this field set to 1 MUST be interpreted as equal to 102.5. + +The value of the precision field MUST be in the range 0..7. + +Scale (2 bits) + +This field MUST advertise the unit used for the Meter Value and Previous Meter Value fields. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Size (3 bits) + +This field MUST indicate the length in bytes of the Meter Value and Previous Meter Value fields. + +This field MUST be set to 1, 2 or 4. + +Meter Value (N bytes) + +This field is used to advertise the actual meter reading. + +The length of this field in bytes MUST be according to the Size field. + +The first byte MUST be the most significant byte. + +[The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) Delta Time (16 bits) + +This field MUST advertise the elapsed time in seconds between the readings advertised by the Meter Value and the Previous Meter Value [fields. This field MUST be according to Table 70.](04.56-meter-command-class-version-2.md#4566-meter-report-command) + +Table 70, Meter Report v2::Delta Time encoding + +| Value | Description | +| --- | --- | +| 0x0000 | No Previous Meter Value field is included in this command | +| 0x0001..0xFFFE | 1..65534 seconds have elapsed between reporting the Previous Meter Value reading and the current meter reading | +| 0xFFFF | Unknown elapsed time between the Previous Meter Value reading and the current meter reading | + +Previous Meter Value (N bytes) + +This field is used to advertise the last issued meter reading for the actual scale. + +This field MUST be omitted if the Delta Time field is set to the value 0. The length of this field in bytes MUST be according to the Size field if the Delta Time field is set to a non- zero value. + +The length of this field in bytes MUST be according to the Size field. + +The first byte MUST be the most significant byte. + +[The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.57-meter-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.57-meter-command-class-version-3.md new file mode 100644 index 0000000..a9137e4 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.57-meter-command-class-version-3.md @@ -0,0 +1,104 @@ + +# 4.57 Meter Command Class, version 3 + +The Meter Command Class is used to advertise instantaneous and accumulated numerical readings. + +The Command Class is intended for accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling some automatic meter reading capabilities. + +## 4.57.1 Compatibility Considerations + +The Meter Command Class, version 3 introduces the following functionalities: + + New meter scales have been added. + +Commands and fields not mentioned in this version MUST remain unchanged from version 2. + +The manufacturer MUST define which scale is the default scale and it MUST be described in the product manual. + +The default scale MUST be in the range 0..3 as version 1 and version 2 controlling nodes will not be able to interpret scale values in the range 4..7. + +## 4.57.2 Meter Supported Report Command + +This command is used to advertise the supported scales and capabilities of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER SUPPORTED REPORT (0x04) _ _ | | | | | | | | +| Meter Reset | Reserved | | Meter Type | | | | | +| Scale Supported | | | | | | | | + +Fields not described below MUST remain unchanged from version 2. + +Scale Supported (8 bits) + +This field is used to advertise the supported scales by the sending node. + +The field MUST be treated as a bitmask in combination with the Meter Type field and MUST be [according to Table 74.](04.59-meter-command-class-version-5.md#4592-meter-supported-report-command) + +The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. + +## 4.57.3 Meter Get Command + +This command is used to request the current meter reading to a supporting node. + +The Meter Report Command MUST be returned in response to this command if the requested scale is supported. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER GET (0x01) _ | | | | | | | | +| Reserved | | Scale | | | Reserved | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Scale (3 bits) + +This field is used to request an actual scale for the meter reading. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) If this field is not present or set to 0x00, a supporting node MUST return a report using its default scale. + +A supporting node MUST ignored this command if this field is set to a non-supported scale. + +For improved compatibility with version 1 controlling nodes, a supporting node receiving this command without this field (version 1 format) SHOULD either return a version 1 Report Command or a Report Command with the Rate Type field set to 0x00 + +## 4.57.4 Meter Report Command + +This command is used to advertise the current meter reading at the sending node. + +This command MUST NOT be issued using broadcast addressing. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER REPORT (0x02) _ | | | | | | | | +| Scale (2) | Rate Type | | Meter Type | | | | | +| Precision | | | Scale (1:0) | | Size | | | +| Meter Value 1 | | | | | | | | +| … | | | | | | | | +| Meter Value N | | | | | | | | +| Delta Time 1 | | | | | | | | +| Delta Time 2 | | | | | | | | +| Previous Meter Value 1 (optional) | | | | | | | | +| … | | | | | | | | +| Previous Meter Value N (optional) | | | | | | | | + +Fields not described below MUST remain unchanged from version 2. + +Scale (3 bits) + +This field MUST advertise the unit used for the Meter Value and Previous Meter Value fields. + +This field is composed of two sub-fields Scale (2) and Scale (1:0) which MUST be composed and interpreted as one unit. Scale (2) MUST be the most significant bit. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.58-meter-command-class-version-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.58-meter-command-class-version-4.md new file mode 100644 index 0000000..b5b4c08 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.58-meter-command-class-version-4.md @@ -0,0 +1,204 @@ + +# 4.58 Meter Command Class, version 4 + +The Meter Command Class is used to advertise instantaneous and accumulated numerical readings. + +The Command Class is intended for accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling some automatic meter reading capabilities. + +## 4.58.1 Compatibility Considerations + +The Meter Command Class, version 4 introduces the following functionalities: + + A supporting node can now support several rate types  New meter scales have been added + +Commands and fields not mentioned in this version MUST remain unchanged from version 3. + +The manufacturer MUST define which scale and rate types are the default and it MUST be described in the product manual. + +The default scale MUST be in the range 0..3 as version 1 and version 2 controlling nodes will not be able to interpret scale values in the range 4..7. + +## 4.58.2 Meter Supported Report Command + +This command is used to advertise the supported scales and capabilities of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER SUPPORTED REPORT (0x04) _ _ | | | | | | | | +| Meter Reset | Rate Type | | Meter Type | | | | | +| M.S.T | Scale Supported “Byte 1” | | | | | | | +| Number of Scale Supported Bytes to Follow (optional) | | | | | | | | +| Scale Supported “Byte 2” 1 (optional) | | | | | | | | +| … | | | | | | | | +| Scale Supported “Byte N+1” N (optional) | | | | | | | | + +Fields not described below MUST remain unchanged from version 3. + +Rate Type (2 bits) + +This field is used to indicate the supported rate types by the sending node. + +[This field MUST be encoded according to Table 71.](04.58-meter-command-class-version-4.md#4582-meter-supported-report-command) Table 71, Meter Supported Report::Rate Type encoding + +| Value | Supported rate types | Version | +| --- | --- | --- | +| 0x00 | Reserved | 1..3 | +| 0x01 | Import only (consumed) | 4 | +| 0x02 | Export only (produced) | 4 | +| 0x03 | Both Import and Export | 4 | + +Scale Supported “Byte 1” (7 bits) + +This field is used to advertise the supported scales by the sending node. + +The field MUST be treated as a bitmask in combination with the Meter Type field and MUST be [according to Table 74.](04.59-meter-command-class-version-5.md#4592-meter-supported-report-command) + +The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. + +M.S.T. (More Scale Types) (1 bit) + +This field is used to indicate if the Number of Scale Supported Bytes to Follow field is included in the command. + +The value 0 MUST indicate that the Number of Scale Supported Bytes to Follow and subsequent optional Scale Supported fields are omitted from the command. + +The value 1 MUST indicate that the Number of Scale Supported Bytes to Follow field is present in the command. + +Number of Scale Supported to Follow (8 bits) + +This field MUST indicate the length in bytes of the subsequent Scale Supported (bytes 2..N+1) field. + +This field MUST be omitted if the M.S.T. field is set to 0. + +Scale Supported (bytes 2..N+1) (N bytes) + +This field is used to advertise the supported scales by the sending node. + +The length of this field in bytes MUST be according to the Number of Scale Supported Bytes to Follow field. + +This field MUST be omitted if the M.S.T. field is set to 0 or if the Number of Scale Supported Bytes to Follow field is set to 0. + +The field MUST be treated as a bitmask in combination with the Meter Type field and MUST be [according to Table 74.](04.59-meter-command-class-version-5.md#4592-meter-supported-report-command) + +The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. + +## 4.58.3 Meter Get Command + +This command is used to request the current meter reading to a supporting node. + +The Meter Report Command MUST be returned in response to this command if the requested scale and rate type are supported. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER GET (0x01) _ | | | | | | | | +| Rate Type | | Scale | | | Reserved | | | +| Scale 2 | | | | | | | | + +Fields not described below MUST remain unchanged from version 3. + +Rate Type (2 bits) + +This field is used to request a rate type for the meter reading. + +[This field MUST be encoded according to Table 72.](04.58-meter-command-class-version-4.md#4583-meter-get-command) + +Table 72, Meter Get::Rate Type encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Default | 1 | +| 0x01 | Import (consumed) | 4 | +| 0x02 | Export (produced) | 4 | +| 0x03 | Reserved | - | + +If supported, a receiving node MUST return a report for the requested Rate Type. + +If this field is not present or set to 0x00, a receiving node MUST return a Report using its default Rate Type. Scale (3 bits) + +This field is used to request an actual scale for the meter reading. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +If this field is not present or set to 0x00, a supporting node MUST return a report using its default scale. + +A supporting node MUST ignored this command if this field is set to a non-supported scale. + +For improved compatibility with version 1 controlling nodes, a supporting node receiving this command without this field (version 1 format) SHOULD either return a version 1 Report Command or a Report Command with the Rate Type field set to 0x00 + +The value 7 MUST indicate that the scale of the requested meter reading is advertised by the Scale 2 field. + +Scale 2 (8 bits) + +This field is used to request an actual scale for the meter reading. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +This field MUST be present in the command if the Scale field is set to 7 (M.S.T). + +This field MUST be omitted if the Scale field is set to a different value than 7. + +## 4.58.4 Meter Report Command + +This command is used to advertise the current meter reading at the sending node. + +This command MUST NOT be issued using broadcast addressing. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER REPORT (0x02) _ | | | | | | | | +| Scale (2) | Rate Type | | Meter Type | | | | | +| Precision | | | Scale (1:0) | | Size | | | +| Meter Value 1 | | | | | | | | +| … | | | | | | | | +| Meter Value N | | | | | | | | +| Delta Time 1 | | | | | | | | +| Delta Time 2 | | | | | | | | +| Previous Meter Value 1 (optional) | | | | | | | | +| … | | | | | | | | +| Previous Meter Value N (optional) | | | | | | | | +| Scale 2 | | | | | | | | + +Fields not described below MUST remain unchanged from version 3. Scale (3 bits) + +This field MUST advertise the unit used for the Meter Value and Previous Meter Value fields. + +This field is composed of two sub-fields Scale (2) and Scale (1:0) which MUST be composed and interpreted as one unit. Scale (2) MUST be the most significant bit. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +The value 7 MUST indicate that the scale of the advertised meter reading is advertised by the Scale 2 field. + +Scale 2 (8 bits) + +This field is used to advertise the unit used for the Meter Value and Previous Meter Value fields. + +This field MUST be present in the command if the Scale field is set to 7 (M.S.T). + +This field MUST be omitted if the Scale field is set to a different value than 7. + +[This field MUST be encoded according to Table 73.](04.58-meter-command-class-version-4.md#4584-meter-report-command) + +Table 73, Meter Report::Scale 2 encoding + +| Meter Type | Scale | Value | Version | +| --- | --- | --- | --- | +| Electric meter | kVar | 0x00 | 4 | +| | kVarh | 0x01 | 4 | +| | Reserved | 0x02..0xFF | - | +| Gas meter | Reserved | 0x00..0xFF | - | +| Water meter | Reserved | 0x00..0xFF | - | +| Heating meter | Reserved | 0x00..0xFF | - | +| Cooling meter | Reserved | 0x00..0xFF | - | + +Reserved values MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.59-meter-command-class-version-5.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.59-meter-command-class-version-5.md new file mode 100644 index 0000000..a688b6c --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.59-meter-command-class-version-5.md @@ -0,0 +1,143 @@ + +# 4.59 Meter Command Class, version 5 + +The Meter Command Class is used to advertise instantaneous and accumulated numerical readings. + +The Command Class is intended for accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling some automatic meter reading capabilities. + +## 4.59.1 Compatibility considerations + +The Meter Command Class, version 5 adds support for Heating and Cooling Meter types. + +The Meter Command Class, version 5 is backwards compatible with version 4. + +Commands and fields not described in this version MUST remain unchanged from version 4. + +## 4.59.2 Meter Supported Report Command + +This command is used to advertise supported scales and capabilities of the sending. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER SUPPORTED REPORT (0x04) _ _ | | | | | | | | +| Meter Reset | Rate Type | | Meter Type | | | | | +| M.S.T | Scale Supported “Byte 1” | | | | | | | +| Number of Scale Supported Bytes to Follow (Version 4 Extension) | | | | | | | | +| Scale Supported 1 “Byte 2” | | | | | | | | +| … | | | | | | | | +| Scale Supported N “Byte N+1” | | | | | | | | + +All fields not described below MUST remain unchanged from version 4. Table 74, Meter Supported Report::Scale Supported Bitmask encoding + +| Meter Type | Scale | Scale Supported Byte number | Scale Supported Bit position | Measurement mode | Version | +| --- | --- | --- | --- | --- | --- | +| Electric meter | kWh | Byte 1 | Bit 0 | Accumulated | 1 | +| | kVAh | Byte 1 | Bit 1 | Accumulated | 2 | +| | W | Byte 1 | Bit 2 | Instant | 2 | +| | Pulse count | Byte 1 | Bit 3 | Accumulated | 2 | +| | V | Byte 1 | Bit 4 | Instant | 3 | +| | A | Byte 1 | Bit 5 | Instant | 3 | +| | Power factor | Byte 1 | Bit 6 | Instant | 3 | +| | kVar | Byte 2 | Bit 0 | Instant | 4 | +| | kVarh | Byte 2 | Bit 1 | Accumulated | 4 | +| | Reserved | Byte 2 | Bit 2-7 | Reserved | - | +| Gas meter | Cubic meters | Byte 1 | Bit 0 | Accumulated | 1 | +| | Cubic feet | Byte 1 | Bit 1 | Accumulated | 2 | +| | Reserved | Byte 1 | Bit 2 | n/a | - | +| | Pulse count | Byte 1 | Bit 3 | Accumulated | 2 | +| | Reserved | Byte 1 | Bit 4-6 | Reserved | - | +| | Reserved | Byte 2 | Bit 0-7 | Reserved | - | +| Water meter | Cubic meters | Byte 1 | Bit 0 | Accumulated | 1 | +| | Cubic feet | Byte 1 | Bit 1 | Accumulated | 1 | +| | US gallons | Byte 1 | Bit 2 | Accumulated | 1 | +| | Pulse count | Byte 1 | Bit 3 | Accumulated | 2 | +| | Reserved | Byte 1 | Bit 4-6 | Reserved | - | +| | Reserved | Byte 2 | Bit 0-7 | Reserved | - | +| Heating meter | kWh | Byte 1 | Bit 0 | Accumlated | 5 | +| | Reserved | Byte 1 | Bit 1-6 | Reserved | - | +| | Reserved | Byte 2 | Bit 0-7 | Reserved | - | +| Cooling meter | kWh | Byte 1 | Bit 0 | Accumlated | 5 | +| | Reserved | Byte 1 | Bit 1-6 | Reserved | - | +| | Reserved | Byte 2 | Bit 0-7 | Reserved | - | + +## 4.59.3 Meter Report Command + +This command is used to advertise the current meter reading at the sending node. + +This command MUST NOT be issued using broadcast addressing. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER REPORT (0x02) _ | | | | | | | | +| Scale (2) | Rate Type | | Meter Type | | | | | +| Precision | | | Scale (1:0) | | Size | | | +| Meter Value 1 | | | | | | | | +| … | | | | | | | | +| Meter Value N | | | | | | | | +| Delta Time 1 | | | | | | | | +| Delta Time 2 | | | | | | | | +| Previous Meter Value 1 (optional) | | | | | | | | +| … | | | | | | | | +| Previous Meter Value N (optional) | | | | | | | | +| Scale 2 | | | | | | | | + +Fields not described below MUST remain unchanged from version 4. + +Meter Type (5 bits) + +This field is used to specify what type of metering physical unit is being reported. + +[This field MUST be encoded according to Table 75.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Table 75,Meter Report::Meter Type encoding + +| Value | Meter Type | Version | +| --- | --- | --- | +| 0x01 | Electric meter | 1 | +| 0x02 | Gas meter | 1 | +| 0x03 | Water meter | 1 | +| 0x04 | Heating meter | 5 | +| 0x05 | Cooling meter | 5 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Scale (3 bits) + +This field MUST advertise the unit used for the Meter Value and Previous Meter Value fields . This field is composed of two sub-fields Scale (2) and Scale (1:0), which MUST be composed and interpreted as one unit. Scale (2) MUST be the most significant bit. + +[This field MUST be encoded according to Table 76.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +The value 0x07 MUST indicate that the scale of the advertised meter reading is advertised through the Scale 2 field. + +Table 76, Meter Report::Scale encoding + +| Meter Type | Scale | Value | Version | +| --- | --- | --- | --- | +| Electric meter | kWh | 0x00 | 1 | +| | kVAh | 0x01 | 2 | +| | W | 0x02 | 2 | +| | Pulse count | 0x03 | 2 | +| | V | 0x04 | 3 | +| | A | 0x05 | 3 | +| | Power Factor | 0x06 | 3 | +| | M.S.T | 0x07 | 4 | +| Gas meter | Cubic meters | 0x00 | 1 | +| | Cubic feet | 0x01 | 2 | +| | Reserved | 0x02 | - | +| | Pulse count | 0x03 | 2 | +| | Reserved | 0x04..0x06 | - | +| | M.S.T | 0x07 | 4 | +| Water meter | Cubic meters | 0x00 | 1 | +| | Cubic feet | 0x01 | 1 | +| | US gallons | 0x02 | 1 | +| | Pulse count | 0x03 | 2 | +| | Reserved | 0x04..0x06 | - | +| | M.S.T | 0x07 | 4 | +| Heating meter | kWh | 0x00 | 5 | +| Cooling meter | kWh | 0x00 | 5 | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.60-meter-command-class-version-6.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.60-meter-command-class-version-6.md new file mode 100644 index 0000000..916cc2d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.60-meter-command-class-version-6.md @@ -0,0 +1,53 @@ + +# 4.60 Meter Command Class, version 6 + +The Meter Command Class is used to advertise instantaneous and accumulated numerical readings. + +The Command Class is intended for accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling some automatic meter reading capabilities. + +## 4.60.1 Compatibility Considerations + +The Meter Command Class, version 6 adds a functionality to reset the accumulated value stored at receiving node to specific.values. + +The Meter Command Class, version 6 is backwards compatible with version 5. + +Commands and fields not described in this version MUST remain unchanged from version 5. + +## 4.60.2 Meter Reset Command + +This command is used to reset the accumulated values stored at the receiving node. + +If the node advertises support for Meter Reset in the Meter Supported Report Command, the supporting node MUST reset the accumulated values to specific values, instead of setting to zero, when receiving this command. + +[A supporting node MUST ignore this command if it advertises no support for Meter Reset in the Meter Supported Report Command.](04.56-meter-command-class-version-2.md#4563-meter-supported-report-command) + +When a supporting node resets the value, it MUST use the scale that was used in the last issued Meter Report Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER _ _ | | | | | | | | +| Command = METER RESET (0x05) _ | | | | | | | | +| Size | | | Meter Type | | | | | +| Meter Value 1 | | | | | | | | +| … | | | | | | | | +| Meter Value N | | | | | | | | + +Size (3 bits) + +This field MUST indicate the length in bytes of the Meter Value field. This field MUST be set to 1, 2 or 4. + +Meter Type (5 bits) + +This field is used to specify which Meter type values are being reseted. + +[This field MUST be encoded according to Table 75.](04.59-meter-command-class-version-5.md#4593-meter-report-command) + +Meter Value (N bytes) This field is used to advertise the actual meter values to set. + +The length of this field in bytes MUST be according to the Size field. The first byte MUST be the most significant byte. [The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.61-meter-table-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.61-meter-table-configuration-command-class-version-1.md new file mode 100644 index 0000000..1e9a710 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.61-meter-table-configuration-command-class-version-1.md @@ -0,0 +1,37 @@ + +# 4.61 Meter Table Configuration Command Class, version 1 + +The Meter Table Configuration Command Class defines the Commands necessary to configure the fundamental properties of the meter. + +The Meter Table configuration commands are separated from the Meter Table monitoring commands in the Meter Table Monitor Command Class, allowing the classes to be optionally supported at different Z-Wave security levels. (E.g. Meter table monitoring commands could be supported in any device, while enabling a strict and certificate based security solution for the Meter Table Configuration Command [class). Refer to [14] for more details about Z-Wave security.](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +## 4.61.1 Meter Table Point Adm Number Set Command + +This command is used to set the Meter Point Administration Number in the metering device. The Meter Point Administration Number is used to identify the customer. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL CONFIG _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE POINT ADM NO SET _ _ _ _ _ _ | | | | | | | | +| Reserved | | | Number of Meter Point Adm Number Characters | | | | | +| Meter Point Adm Number Character 1 | | | | | | | | +| … | | | | | | | | +| Meter Point Adm Number Character N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Number of Meter Point Adm Number Characters (5 bits) + +Number of characters in the meter point administration number(1…32). + +Meter Point Adm Number Character (N bytes) + +The Meter Point Adm Number character fields hold the string identifying the customer. The character presentation uses standard ASCII codes (values 128-255 are ignored). diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.01-meter-table-point-adm-number-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.01-meter-table-point-adm-number-get-command.md new file mode 100644 index 0000000..0d34819 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.01-meter-table-point-adm-number-get-command.md @@ -0,0 +1,21 @@ + +# 4.62.1 Meter Table Point Adm. Number Get Command + +This command is used to request the Meter Point Administration Number to identify customer. + +The Meter Table Adm. Number Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE POINT ADM NO GET _ _ _ _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.02-meter-table-point-adm-number-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.02-meter-table-point-adm-number-report-command.md new file mode 100644 index 0000000..547409c --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.02-meter-table-point-adm-number-report-command.md @@ -0,0 +1,21 @@ + +# 4.62.2 Meter Table Point Adm. Number Report Command + +This command reports parameters used for identification of customer and metering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE POINT ADM NO REPORT _ _ _ _ _ _ | | | | | | | | +| Reserved | | | Number of Meter Point Adm. Number Characters | | | | | +| Meter Point Adm. Number Character 1 | | | | | | | | +| … | | | | | | | | +| Meter Point Adm. Number Character N | | | | | | | | + +Fields MUST be according to descriptions in the Meter Table Point Adm Number Set Command from the Meter Table Configuration Command Class, version 1. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.03-meter-table-id-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.03-meter-table-id-get-command.md new file mode 100644 index 0000000..bf4da71 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.03-meter-table-id-get-command.md @@ -0,0 +1,21 @@ + +# 4.62.3 Meter Table ID Get Command + +This command is used to request the parameters used for identification of customer and metering device. + +The Meter Table ID Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE ID GET _ _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.04-meter-table-id-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.04-meter-table-id-report-command.md new file mode 100644 index 0000000..586fb7d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.04-meter-table-id-report-command.md @@ -0,0 +1,37 @@ + +# 4.62.4 Meter Table ID Report Command + +This command reports parameters used for identification of customer and metering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE ID REPORT _ _ _ _ | | | | | | | | +| Reserved | | | Number of Meter ID Characters | | | | | +| Meter ID Character 1 | | | | | | | | +| … | | | | | | | | +| Meter ID Character N | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Number of Meter ID Characters (5 bits) + +This field is used to indicate the length of the Meter ID Character field in bytes. + +This field MUST be in the range 1..32. Meter ID Character (N bytes) + +This field is used to identify the individual metering device. + +The length of this field in bytes MUST be according to the Number of Meter ID Characters field. + +Each byte of this field MUST be encoded with ASCII representation and be in the range 0x00..0x7F. + +A controlling node can use the Manufacturer Specific Command Class in conjunction for product identification. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.05-meter-table-capability-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.05-meter-table-capability-get-command.md new file mode 100644 index 0000000..4ace068 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.05-meter-table-capability-get-command.md @@ -0,0 +1,21 @@ + +# 4.62.5 Meter Table Capability Get Command + +This command is used to request the meter table capabilities of a supporting device. + +The Meter Table Capability Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE CAPABILITY GET _ _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.06-meter-table-capability-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.06-meter-table-capability-report-command.md new file mode 100644 index 0000000..7c79a59 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.06-meter-table-capability-report-command.md @@ -0,0 +1,68 @@ + +# 4.62.6 Meter Table Capability Report Command + +This command is used to advertise meter table capabilities of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL REPORT _ _ | | | | | | | | +| Rate Type | | Meter Type | | | | | | +| Reserved | | | | Pay Meter | | | | +| Dataset Supported 1 | | | | | | | | +| Dataset Supported 2 | | | | | | | | +| Dataset Supported 3 | | | | | | | | +| Dataset History Supported 1 | | | | | | | | +| Dataset History Supported 2 | | | | | | | | +| Dataset History Supported 3 | | | | | | | | +| Data History Supported 1 | | | | | | | | +| Data History Supported 2 | | | | | | | | +| Data History Supported 3 | | | | | | | | + +Rate Type (2 bits) + +This field is used to indicate if the actual reading advertises import or export values. + +The Import value for a meter reading MUST indicate that the reading indicates a consumed amount. + +The Export value for a meter reading MUST indicate that the reading indicates a produced amount. + +[This field MUST be encoded according to the Rate Types values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Meter Type (6 bits) + +This field is used to specify the type of metering physical unit that is being reported. + +[This field MUST be encoded according to the Meter Types values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Pay Meter (4 bits) + +This field is used to indicate the type of payment that is used for the meter. + +[This field MUST be encoded according to the Pay meter values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Dataset Supported (24 bits) + +This field is used to advertise which datasets are supported and can be requested from the metering node with the Meter Table Current Data Get Command. + +[This field MUST be encoded according to the Meter dataset bitmask values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Dataset History Supported (24 bits) + +This field is used to advertise which datasets are supported and can be requests from the metering node with the Meter Table Historical Data Get Command. + +[This field MUST be encoded according to the Meter dataset bitmask values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Data History Supported (24 bits) + +This field is used to advertise the total number of entries that the supporting node can hold in memory for historical values. + +This field MUST be in the range 0..16777215. The value 0 MUST indicate that Historical data cannot be requested to the sending node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.07-meter-table-status-supported-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.07-meter-table-status-supported-get-command.md new file mode 100644 index 0000000..262baf0 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.07-meter-table-status-supported-get-command.md @@ -0,0 +1,21 @@ + +# 4.62.7 Meter Table Status Supported Get Command + +This command is used to request the supported operating status event parameters and logging depth of the metering device. + +The Meter Table Status Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL STATUS SUPPORTED GET _ _ _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.08-meter-table-status-supported-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.08-meter-table-status-supported-report-command.md new file mode 100644 index 0000000..ee042bb --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.08-meter-table-status-supported-report-command.md @@ -0,0 +1,39 @@ + +# 4.62.8 Meter Table Status Supported Report Command + +This command is used to report the supported operation status and logging depth of these in the meter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL STATUS SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Supported Operating Status 1 | | | | | | | | +| Supported Operating Status 2 | | | | | | | | +| Supported Operating Status 3 | | | | | | | | +| Status Event Log Depth | | | | | | | | + +Supported Operating Status (24 bits) + +This field is used to advertise which operating statuses are supported and can be sent by the metering node in the Meter Table Status Report Command. + +[This field MUST be encoded as a bitmask according to the Operating status values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If the Operating Status event is supported, the corresponding bit MUST be set to 1. + +If the Operating Status event is not supported, the corresponding bit MUST be set to 0. + +A supporting node MAY support no operating status event and set this field to 0. + +Status Event Log Depth (8 bits) + +This field MUST indicate the supported depth of the event log. + +This field MUST be in the range 0..255. + +If the supporting node can only return the current status, this field MUST be set to 0. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.09-meter-table-status-depth-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.09-meter-table-status-depth-get-command.md new file mode 100644 index 0000000..d387992 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.09-meter-table-status-depth-get-command.md @@ -0,0 +1,32 @@ + +# 4.62.9 Meter Table Status Depth Get Command + +This command is used to request the current operating status of the metering device or to request a number of the latest status event from the logs. + +The Meter Table Status Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL STATUS DEPTH GET _ _ _ _ | | | | | | | | +| Status Event Log Depth | | | | | | | | + +Status Event Log Depth (8 bits) + +This field is used to indicate the number of last recorded events that should be returned. + +The value 0x00 MUST indicate that the receiving node MUST return the current status only. + +Values in the range 0x01..0xFE MUST indicate the number of last recorded event that the receiving node SHOULD return. + +The value 0xFF MUST indicate that the receiving node SHOULD return its entire status event log. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.10-meter-table-status-date-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.10-meter-table-status-date-get-command.md new file mode 100644 index 0000000..79086de --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.10-meter-table-status-date-get-command.md @@ -0,0 +1,68 @@ + +# 4.62.10 Meter Table Status Date Get Command + +This command is used to request a number of status events recorded in a certain time interval. + +The Meter Table Status Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +If a supporting node does not support a status event log history, it MUST return the current state of the meter (refer to the Meter Table Status Report Command). + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL STATUS DATE GET _ _ _ _ | | | | | | | | +| Maximum Reports | | | | | | | | +| Start - Year 1 | | | | | | | | +| Start - Year 2 | | | | | | | | +| Start - Month | | | | | | | | +| Start - Day | | | | | | | | +| Start - Hour Local Time | | | | | | | | +| Start - Minute Local Time | | | | | | | | +| Start - Second Local Time | | | | | | | | +| Stop - Year 1 | | | | | | | | +| Stop - Year 2 | | | | | | | | +| Stop - Month | | | | | | | | +| Stop - Day | | | | | | | | +| Stop - Hour Local Time | | | | | | | | +| Stop - Minute Local Time | | | | | | | | +| Stop - Second Local Time | | | | | | | | + +Maximum Reports (8 bits) + +This field is used to indicate the maximum number of Meter Table Status Report Command that can be returned to advertise the requested status event history. The most recent recorded log entries MUST be returned first. + +The value 0x00 MUST indicate that there is no maximum number of reports for returning the event log and the supporting node MUST return as many Reports as necessary to advertise the requested entry logs. + +Values in the range 0x01..0xFF MUST indicate an actual upper limit number of reports to advertise the requested entry logs. + +Start/Stop - Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Start/Stop - Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). + +Start/Stop - Day (8 bits) + +Specify the day of the month between 01 and 31. + +Start/Stop - Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00-23) in local time. + +Start/Stop - Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. + +Start/Stop - Second Local Time (8 bits) + +Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.11-meter-table-status-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.11-meter-table-status-report-command.md new file mode 100644 index 0000000..3929feb --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.11-meter-table-status-report-command.md @@ -0,0 +1,88 @@ + +# 4.62.11 Meter Table Status Report Command + +This command is used to advertise the current status and optionally historical status data of the meter. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | +| Command = METER TBL STATUS REPORT _ _ _ | | | | | | | | | +| Reports to follow | | | | | | | | | +| Current Operating Status 1 | | | | | | | | | +| Current Operating Status 2 | | | | | | | | | +| Current Operating Status 3 | | | | | | | | | +| Event 1 - Type | | Reserved | | Event 1 - Operating Status Event ID | | | | | +| Event 1 - Year 1 | | | | | | | | | +| Event 1 - Year 2 | | | | | | | | | +| Event 1 - Month | | | | | | | | | +| Event 1 - Day | | | | | | | | | +| Event 1 - Hour Local Time | | | | | | | | | +| Event 1 - Minute Local Time | | | | | | | | | +| Event 1 - Second Local Time | | | | | | | | | +| … | | | | | | | | | +| Event N -Type | | Reserved | | Event N - Operating Status Event ID | | | | | +| Event N - Year 1 | | | | | | | | | +| Event N - Year 2 | | | | | | | | | +| Event N - Month | | | | | | | | | +| Event N - Day | | | | | | | | | +| Event N - Hour Local Time | | | | | | | | | +| Event N -Minute Local Time | | | | | | | | | +| Event N - Second Local Time | | | | | | | | | + +Reports to follow (8 bits) + +This field MUST be used if multiple Meter Table Status Report Commands are used to report the requested Operating status. Values in the range 0x00..0xFE MUST indicate the actual number of commands following the actual command. + +The value 0xFF MUST indicate that the number of remaining commands have not been calculated yet or is higher than 255. + +Current Operating Status (24 bits) + +This field is used to advertise which operating statuses are currently active at the sending node. + +[This field MUST be encoded as a bitmask according to the Operating status values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If the Operating Status event is active, the corresponding bit MUST be set to 1. + +If the Operating Status event is not active, the corresponding bit MUST be set to 0. + +Event – Type (N * 1 bit) + +This field is used to advertise the type of the actual event in the event log. It represents the transition to or from a state. + +The value 0 MUST indicate that the sending node entered the state described by the corresponding Operating Status Event ID at the reported time. + +The value 1 MUST indicate that the sending node left the state described by the corresponding Operating Status Event ID at the reported time. + +Event – Operating Status Event ID (N * 5 bits) + +This field is used to advertise the identifier of the actual event in the event log. + +[This field MUST be encoded according to the Operating status Event identifier values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Event - Year (N * 16 bits) + +This field is used to specify the year in the usual Gregorian calendar for the actual event. The first byte (Year 1) MUST be the most significant byte. + +Event - Month (N * 8 bits) + +This field is used to specify the month of the year between 01 (January) and 12 (December) for the actual event. This field MUST be in the range 1..12. + +Event - Day (N * 8 bits) + +This field is used to specify the day of the month for the actual event. This field MUST be in the range 1..31 Event - Hour Local Time (N * 8 bits) + +This field is used to specify the number of complete hours that have passed since midnight in local time for the actual event. This field MUST be in the range 0..23. + +Event - Minute Local Time (N * 8 bits) + +This field is used to specify the number of complete minutes that have passed since the start of the hour in local time for the actual event. This field MUST be in the range 0..59. + +Event - Second Local Time (N * 8 bits) + +This field is used to specify the number of complete seconds since the start of the minute in local time for the actual event. The value 60 used to keep UTC from wandering away is not supported. This field MUST be in the range 0..59. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.12-meter-table-current-data-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.12-meter-table-current-data-get-command.md new file mode 100644 index 0000000..88ff32e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.12-meter-table-current-data-get-command.md @@ -0,0 +1,30 @@ + +# 4.62.12 Meter Table Current Data Get Command + +This command is used to request a number of time stamped values (current) in physical units according to the dataset mask. + +The Meter Table Current Data Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL CURRENT DATA GET _ _ _ _ | | | | | | | | +| Dataset Requested 1 | | | | | | | | +| Dataset Requested 2 | | | | | | | | +| Dataset Requested 3 | | | | | | | | + +Dataset Requested (24 bits) + +This field is used to indicate which datasets are requested from the supporting node. + +This field MUST be encoded as a bitmask and according to the Meter dataset bitmask values defined in [[21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md new file mode 100644 index 0000000..2db9d92 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md @@ -0,0 +1,102 @@ + +# 4.62.13 Meter Table Current Data Report Command + +This command is is used to report a number of time stamped values. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL CURRENT DATA REPORT _ _ _ _ | | | | | | | | +| Reports to Follow | | | | | | | | +| Reserved | | | | | | Rate Type | | +| Dataset 1 | | | | | | | | +| Dataset 2 | | | | | | | | +| Dataset 3 | | | | | | | | +| Year 1 | | | | | | | | +| Year 2 | | | | | | | | +| Month | | | | | | | | +| Day | | | | | | | | +| Hour Local Time | | | | | | | | +| Minute Local Time | | | | | | | | +| Second Local Time | | | | | | | | +| Current Meter Precision 1 | | | Current Meter Scale 1 | | | | | +| Current Value 1,1 | | | | | | | | +| Current Value 1,2 | | | | | | | | +| Current Value 1,3 | | | | | | | | +| Current Value 1,4 | | | | | | | | +| … | | | | | | | | +| Current Meter Precision N | | | Current Meter Scale N | | | | | +| Current Value N,1 | | | | | | | | +| Current Value N,2 | | | | | | | | +| Current Value N,3 | | | | | | | | +| Current Value N,4 | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Reports to follow (8 bits) + +This field MUST be used if multiple Meter Table Current Data Report Commands are used to report the requested values. + +Values in the range 0x00..0xFE MUST indicate the actual number of commands following the actual command. + +The value 0xFF MUST indicate that the number of remaining commands have not been calculated yet or is higher than 255. + +Rate Type (2 bits) + +This field is used to specify the type of parameters advertised in this command. This field MUST be [encoded according to the rate types values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Dataset (24 bits) + +This field is used to indicate which datasets are included in this command. This field MUST be encoded [as a bitmask and according to the Meter dataset bitmask values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +The length of the Current Meter Precision, Current Meter Scale and Current Value fields MUST be according to the number of bits set in this field. + +Year (16 bits) + +This field is used to specify the year in the usual Gregorian calendar. The first byte (Year 1) MUST be the most significant byte. A year equal to 0x0000 MUST indicate that an accumulated value is not determined yet. + +Month (8 bits) + +This field is used to specify the month of the year between 01 (January) and 12 (December). This field MUST be in the range 1..12. + +Day (8 bits) + +This field is used to specify the day of the month. This field MUST be in the range 1..31. + +Hour Local Time (8 bits) + +This field is used to specify the number of complete hours that have passed since midnight in local time. This field MUST be in the range 0..23. + +Minute Local Time (8 bits) + +This field is used to specify the number of complete minutes that have passed since the start of the hour in local time. This field MUST be in the range 0..59. + +Second Local Time (8 bits) + +This field is used to specify the number of complete seconds since the start of the minute in local time. The value 60 used to keep UTC from wandering away is not supported. This field MUST be in the range 0..59. Meter Precision (N * 3 bits) + +This field is used to indicate how many decimal places are included in the corresponding Current Value field. For example, the Current Value field set to 1025 with this field set to 2 MUST be interpreted as equal to 10.25. + +Meter Scale (N * 5 bits) + +This field is used to indicate the scale (unit) for the corresponding Current Value field reading. This field [MUST be encoded according to the Meter Scale values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Current Value (N * 4 bytes) + +This field is used to advertise an actual meter reading. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +Readings MUST be advertised according to the Dataset field. The first reading MUST correspond to the first bit set in the Dataset field, the second reading MUST correspond to the second bit set in the Dataset field, and so on. + +A controlling node MUST always show the value even if the reading type or scale are unknown. + +A controlling node SHOULD implement the capability to update its list of Meter datasets and scales, so [that new Meter readings and scales added in [21] are not presented as unknown. If a controlling node](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) receives an unknown Meter reading or scale, it SHOULD allow the user to assign a free-text description to that Meter reading diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.14-meter-table-historical-data-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.14-meter-table-historical-data-get-command.md new file mode 100644 index 0000000..c228473 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.14-meter-table-historical-data-get-command.md @@ -0,0 +1,77 @@ + +# 4.62.14 Meter Table Historical Data Get Command + +This command is used to request a number of time stamped values (historical) in physical units according to rate type, dataset bitmask and time interval. + +The Meter Table Historical Data Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL HISTORICAL DATA GET _ _ _ _ | | | | | | | | +| Maximum Reports | | | | | | | | +| Historical Dataset Requested 1 | | | | | | | | +| Historical Dataset Requested 2 | | | | | | | | +| Historical Dataset Requested 3 | | | | | | | | +| Start Year 1 | | | | | | | | +| Start Year 2 | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour Local Time | | | | | | | | +| Start Minute Local Time | | | | | | | | +| Start Second Local Time | | | | | | | | +| Stop Year 1 | | | | | | | | +| Stop Year 2 | | | | | | | | +| Stop Month | | | | | | | | +| Stop Day | | | | | | | | +| Stop Hour Local Time | | | | | | | | +| Stop Minute Local Time | | | | | | | | +| Stop Second Local Time | | | | | | | | + +Maximum Reports (8 bits) + +This field is used to indicate the maximum number of Meter Table Historical Data Report Commands that can be returned to advertise the requested historical data. The most recent recorded values MUST be returned first. + +The value 0x00 MUST indicate that there is no maximum number of reports for returning the event log and the supporting node MUST return as many Reports as necessary to advertise the requested historical values. + +Values in the range 0x01..0xFF MUST indicate an actual upper limit number of reports to advertise the requested historical values. + +Dataset History (24 bits) + +This field is used to indicate which datasets are requested from the supporting node. + +This field MUST be encoded as a bitmask and according to the Meter dataset bitmask values defined in [[21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Start/Stop Year (16 bits) + +This field is used to specify the year in the usual Gregorian calendar. The first byte (Year 1) MUST be the most significant byte. + +Start/Stop Month (8 bits) + +This field is used to specify the month of the year between 01 (January) and 12 (December). This field MUST be in the range 1..12. + +Start/Stop Day (8 bits) + +This field is used to specify the day of the month. This field MUST be in the range 1..31. + +Start/Stop Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00-23) in local time. + +Start/Stop Minute Local Time (8 bits) + +This field is used to specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. This field MUST be in the range 0..59. + +Start/Stop Second Local Time (8 bits) + +This field is used to specify the number of complete seconds since the start of the minute in local time. The value 60 used to keep UTC from wandering away is not supported. This field MUST be in the range 0..59. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.15-meter-table-historical-data-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.15-meter-table-historical-data-report-command.md new file mode 100644 index 0000000..8318997 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/04.62.15-meter-table-historical-data-report-command.md @@ -0,0 +1,104 @@ + +# 4.62.15 Meter Table Historical Data Report Command + +This command is used to report a number of time stamped values. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL HISTORICAL DATA REPORT _ _ _ _ | | | | | | | | +| Reports to Follow | | | | | | | | +| Reserved | | | | | | Rate Type | | +| Dataset 1 | | | | | | | | +| Dataset 2 | | | | | | | | +| Dataset 3 | | | | | | | | +| Historical Year 1 | | | | | | | | +| Historical Year 2 | | | | | | | | +| Historical Month | | | | | | | | +| Historical Day | | | | | | | | +| Historical Hour Local Time | | | | | | | | +| Historical Minute Local Time | | | | | | | | +| Historical Second Local Time | | | | | | | | +| Historical Precision 1 | | | Historical Scale 1 | | | | | +| Historical Value 1,1 | | | | | | | | +| Historical Value 1,2 | | | | | | | | +| Historical Value 1,3 | | | | | | | | +| Historical Value 1,4 | | | | | | | | +| … | | | | | | | | +| Historical Precision N | | | Historical Scale N | | | | | +| Historical Value N,1 | | | | | | | | +| Historical Value N,2 | | | | | | | | +| Historical Value N,3 | | | | | | | | +| Historical Value N,4 | | | | | | | | + +Reports to Follow (8 bits) + +This field MUST be used if multiple Meter Table Current Data Report Commands are used to report the requested values. + +Values in the range 0x00..0xFE MUST indicate the actual number of commands following the actual command. + +The value 0xFF MUST indicate that the number of remaining commands have not been calculated yet or is higher than 255. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Rate Type (2 bits) + +This field is used to specify the type of parameters advertised in this command. This field MUST be [encoded according to the rate types values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Dataset (24 bits) + +This field is used to indicate which datasets are included in this command. This field MUST be encoded [as a bitmask and according to the Meter dataset bitmask values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If no historical data has been registered for the requested period, this field MUST be set to 0 and the Historical Scale, Historical Precision and Historical Value fields MUST be omitted from the command. + +Historical Year (16 bits) + +This field is used to specify for the dataset the year in the usual Gregorian calendar. The first byte (Year 1) MUST be the most significant byte. A year equal to 0x0000 indicates that an accumulated value is not determined yet. + +Historical Month (8 bits) + +This field is used to specify for the dataset the month of the year between 01 (January) and 12 (December). This field MUST be in the range 1..12. + +Historical Day (8 bits) + +This field is used to specify for the dataset the day of the month. This field MUST be in the range 1..31. Historical Hour Local Time (8 bits) + +This field is used to specify for the dataset the number of complete hours that have passed since midnight in local time. This field MUST be in the range 0..23. + +Historical Minute Local Time (8 bits) + +This field is used to specify for the dataset the number of complete minutes that have passed since the start of the hour in local time. This field MUST be in the range 0..59. + +Historical Second Local Time (8 bits) + +This field is used to specify for the dataset the number of complete seconds since the start of the minute in local time. The value 60 used to keep UTC from wandering away is not supported. This field MUST be in the range 0..59. + +Historical Precision (N * 3 bits) + +This field is used to specify how many decimal places are included in the corresponding Historical Value field. For example, the Historical Value field set to 1025 with this field set to 2 MUST be interpreted as equal to 10.25. + +Historical Scale (5 bits) + +This field is used to indicate the scale (unit) of the corresponding Historical Value field reading. This field [MUST be encoded according to the Meter Scale values defined in [21].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Historical Value + +This field is used to advertise an actual historical meter reading. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +Readings MUST be advertised according to the Dataset field. The first reading MUST correspond to the first bit set in the Dataset field, the second reading MUST correspond to the second bit set in the Dataset field, and so on. + +A controlling node MUST always show the value even if the reading type or scale are unknown. + +A controlling node SHOULD implement the capability to update its list of Meter datasets and scales, so [that new Meter readings and scales added in [21] are not presented as unknown. If a controlling node](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) receives an unknown Meter reading or scale, it SHOULD allow the user to assign a free-text description to that Meter reading diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/index.md new file mode 100644 index 0000000..05262e4 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.62-meter-table-monitor-command-class-version-1/index.md @@ -0,0 +1,28 @@ + +# 4.62 Meter Table Monitor Command Class, version 1 + +The Meter Table Monitor Command Class defines the Commands necessary to read historical and accumulated values in physical units from a water meter or other metering device (gas, electric etc.) and thereby enabling automatic meter reading capabilities + +## Contents + +- [4.62.1 Meter Table Point Adm. Number Get Command](04.62.01-meter-table-point-adm-number-get-command.md) +- [4.62.2 Meter Table Point Adm. Number Report Command](04.62.02-meter-table-point-adm-number-report-command.md) +- [4.62.3 Meter Table ID Get Command](04.62.03-meter-table-id-get-command.md) +- [4.62.4 Meter Table ID Report Command](04.62.04-meter-table-id-report-command.md) +- [4.62.5 Meter Table Capability Get Command](04.62.05-meter-table-capability-get-command.md) +- [4.62.6 Meter Table Capability Report Command](04.62.06-meter-table-capability-report-command.md) +- [4.62.7 Meter Table Status Supported Get Command](04.62.07-meter-table-status-supported-get-command.md) +- [4.62.8 Meter Table Status Supported Report Command](04.62.08-meter-table-status-supported-report-command.md) +- [4.62.9 Meter Table Status Depth Get Command](04.62.09-meter-table-status-depth-get-command.md) +- [4.62.10 Meter Table Status Date Get Command](04.62.10-meter-table-status-date-get-command.md) +- [4.62.11 Meter Table Status Report Command](04.62.11-meter-table-status-report-command.md) +- [4.62.12 Meter Table Current Data Get Command](04.62.12-meter-table-current-data-get-command.md) +- [4.62.13 Meter Table Current Data Report Command](04.62.13-meter-table-current-data-report-command.md) +- [4.62.14 Meter Table Historical Data Get Command](04.62.14-meter-table-historical-data-get-command.md) +- [4.62.15 Meter Table Historical Data Report Command](04.62.15-meter-table-historical-data-report-command.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.63-meter-table-monitor-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.63-meter-table-monitor-command-class-version-2.md new file mode 100644 index 0000000..64354e4 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.63-meter-table-monitor-command-class-version-2.md @@ -0,0 +1,182 @@ + +# 4.63 Meter Table Monitor Command Class, version 2 + +The Meter Table Monitor Command Class defines the Commands necessary to read historical and accumulated values in physical units from a water meter or other metering device (gas, electric etc.) or electric sub-metering device and thereby enabling automatic meter reading capabilities. + +## 4.63.1 Compatibility Considerations + +The Meter Table Monitor Command Class, version 2 is backwards compatible with the Meter Table Monitor Command Class, version 1. + +All commands and fields not mentioned in this version MUST remain unchanged from the Meter Table Monitor Command Class, version 1. + +## 4.63.2 Meter Table Point Adm. Number Report Command + +This command reports parameters used for identification of customer and metering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE POINT ADM NO REPORT _ _ _ _ _ _ | | | | | | | | +| Reserved | | | Number of Meter Point Adm. Number Characters | | | | | +| Meter Point Adm. Number Character 1 | | | | | | | | +| … | | | | | | | | +| Meter Point Adm. Number Character N | | | | | | | | + +Fields not described below MUST remain unchanged from version 1. + +Number of Meter Point Adm. Number Characters (5 bits) + +If the Meter Table Point Adm, Number has not been set using the Meter Table Configuration Command Class, this field MUST be set to 0x00 and the Meter Point Adm. Numbers Character field MUST be omitted. + +## 4.63.3 Meter Table ID Report Command + +This command reports parameters used for identification of customer and metering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL TABLE ID REPORT _ _ _ _ | | | | | | | | +| Reserved | | | Number of Meter ID Characters | | | | | +| Meter ID Character 1 | | | | | | | | +| … | | | | | | | | +| Meter ID Character N | | | | | | | | + +Fields not described below MUST remain unchanged from version 1. + +Number of Meter ID Characters (5 bits) + +This field is used to indicate the length of the Meter ID Character field in bytes. + +This field MUST be in the range 0..32. + +The value 0 MUST indicate that the Meter ID is not used and the Meter ID Character field MUST be omitted from the command. + +## 4.63.4 Meter Table Capability Report Command + +This command is used to advertise meter table capabilities. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | +| Command = METER TBL REPORT _ _ | | | | | | | | +| Rate Type | | Meter Type | | | | | | +| Reserved | | | | Pay Meter | | | | +| Dataset Supported 1 | | | | | | | | +| Dataset Supported 2 | | | | | | | | +| Dataset Supported 3 | | | | | | | | +| Dataset History Supported 1 | | | | | | | | +| Dataset History Supported 2 | | | | | | | | +| Dataset History Supported 3 | | | | | | | | +| Data History Supported 1 | | | | | | | | +| Data History Supported 2 | | | | | | | | +| Data History Supported 3 | | | | | | | | + +Fields not described below MUST remain unchanged from version 1. + +Rate Type (2 bits) + +This field is used to indicate if the actual reading advertises import or export values. + +The Import value for a meter reading MUST indicate that the reading indicates a consumed amount. The Export value for a meter reading MUST indicate that the reading indicates a produced amount. + +[This field MUST be encoded according tothe Rate Types values defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If the Meter Type field is set to Submeter (0x0B), this field MUST be set to Import (0x01). + +## 4.63.5 Meter Table Current Data Report Command + +This command is used to report a number of time stamped values. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | +| Command = METER TBL CURRENT DATA REPORT _ _ _ _ | | | | | | | | | +| Reports to Follow | | | | | | | | | +| Operating Status Indication | | Reserved | | | | | Rate Type | | +| Dataset 1 | | | | | | | | | +| Dataset 2 | | | | | | | | | +| Dataset 3 | | | | | | | | | +| Year 1 | | | | | | | | | +| Year 2 | | | | | | | | | +| Month | | | | | | | | | +| Day | | | | | | | | | +| Hour Local Time | | | | | | | | | +| Minute Local Time | | | | | | | | | +| Second Local Time | | | | | | | | | +| Current Meter Precision 1 | | | | Current Meter Scale 1 | | | | | +| Current Value 1,1 | | | | | | | | | +| Current Value 1,2 | | | | | | | | | +| Current Value 1,3 | | | | | | | | | +| Current Value 1,4 | | | | | | | | | +| … | | | | | | | | | +| Current Meter Precision N | | | | Current Meter Scale N | | | | | +| Current Value N,1 | | | | | | | | | +| Current Value N,2 | | | | | | | | | +| Current Value N,3 | | | | | | | | | +| Current Value N,4 | | | | | | | | | + +Fields not described below MUST remain unchanged from version 1. Operating Status Indication (1 bit) + +This field is used to indicate that the reported meter data is measured while the meter is in an operating status different from Normal (0x00) e.g. accuracy warning or clock not accurate. + +The value 1 MUST indicate that the meter is operating in a status different from Normal + +The value 0 MUST indicate that the meter is operating in Normal mode (Operating status=0x00). + +Rate Type (2 bits) + +This field is used to indicate the type of parameters in the report. This field MUST be encoded according [to the Rate Types values defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If the Meter Type field is set to Submeter (0x0B), this field MUST be set to Import (0x01). + +## 4.63.6 Meter Table Historical Data Report Command + +This command is used to report a number of time stamped values. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | +| Command = METER TBL HISTORICAL DATA REPORT _ _ _ _ | | | | | | | | | +| Reports to Follow | | | | | | | | | +| Operating Status Indication | | Reserved | | | | | Rate Type | | +| Dataset 1 | | | | | | | | | +| Dataset 2 | | | | | | | | | +| Dataset 3 | | | | | | | | | +| Historical Year 1 | | | | | | | | | +| Historical Year 2 | | | | | | | | | +| Historical Month | | | | | | | | | +| Historical Day | | | | | | | | | +| Historical Hour Local Time | | | | | | | | | +| Historical Minute Local Time | | | | | | | | | +| Historical Second Local Time | | | | | | | | | +| Historical Precision 1 | | | | Historical Scale 1 | | | | | +| Historical Value 1,1 | | | | | | | | | +| Historical Value 1,2 | | | | | | | | | +| Historical Value 1,3 | | | | | | | | | +| Historical Value 1,4 | | | | | | | | | +| … | | | | | | | | | +| Historical Precision N | | | | Historical Scale N | | | | | +| Historical Value N,1 | | | | | | | | | +| Historical Value N,2 | | | | | | | | | +| Historical Value N,3 | | | | | | | | | +| Historical Value N,4 | | | | | | | | | + +Fields not described below MUST remain unchanged from version 1. Operating Status Indication (1 bit) + +This field is used to indicate that the reported meter data is measured while the meter is in an operating status different from Normal (0x00) e.g. accuracy warning or clock not accurate. + +The value 1 MUST indicate that the meter is operating in a status different from Normal + +The value 0 MUST indicate that the meter is operating in Normal mode (Operating status=0x00). + +Rate Type (2 bits) + +This field is used to indicate the type of parameters in the report. This field MUST be encoded according [to the Rate Types values defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If the Meter Type field is set to Submeter (0x0B), this field MUST be set to Import (0x01). diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.64-meter-table-monitor-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.64-meter-table-monitor-command-class-version-3.md new file mode 100644 index 0000000..627c11a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.64-meter-table-monitor-command-class-version-3.md @@ -0,0 +1,18 @@ + +# 4.64 Meter Table Monitor Command Class, version 3 + +The Meter Table Monitor Command Class, version 3 is used for advanced metering applications. It allows reading historical and accumulated values in physical units from a water meter or other metering device (gas, electric etc.) or electric sub-metering device and thereby enabling automatic meter reading capabilities + +## 4.64.1 Compatibility Considerations + +The Meter Table Monitor Command Class, version 3 is backwards compatible with the Meter Table Monitor Command Class, version 2. + +All commands and fields not mentioned in this version MUST remain unchanged from the Meter Table Monitor Command Class, version 2. + +[The list of supported Meter Types, Meter scales and Meter dataset bitmasks is moved to [21]. Values not defined in [21] are reserved and MUST NOT be used by a supporting node.](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.65-meter-table-push-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.65-meter-table-push-configuration-command-class-version-1.md new file mode 100644 index 0000000..47e5a23 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.65-meter-table-push-configuration-command-class-version-1.md @@ -0,0 +1,104 @@ + +# 4.65 Meter Table Push Configuration Command Class version 1 + +The Meter Table Push Configuration Command Class is used to configure the meter to send a Current Data Report at a given interval. The meter may be configured to return different data sets at different intervals using both the primary and secondary push commands. + +## 4.65.1 Meter Table Push Configuration Set Command + +This command is used to request the meter to send a Current Data Report at a given interval. The meter may be configured to return different data sets at different intervals using both the primary and secondary push commands. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL PUSH _ _ _ _ | | | | | | | | +| Command = METER TBL PUSH CONFIGURATION SET _ _ _ _ | | | | | | | | +| Reserved | | | P/S | Operating Status Push Mode | | | | +| Push Dataset 1 | | | | | | | | +| Push Dataset 2 | | | | | | | | +| Push Dataset 3 | | | | | | | | +| Interval Months | | | | | | | | +| Interval Days | | | | | | | | +| Interval Hours | | | | | | | | +| Interval Minutes | | | | | | | | +| Push Node ID | | | | | | | | + +Operating Status Push Mode (4 bits) + +[This field is used to configure if the Meter Table Status Report Command (refer to 4.62.11) participates](04.62-meter-table-monitor-command-class-version-1/04.62.11-meter-table-status-report-command.md#46211-meter-table-status-report-command) in the Push Functionality + +| Operating Status Push Mode Identifier | Description | +| --- | --- | +| 0x00 | Operating Status push disabled | +| 0x01 | Operating Status push based on Interval | +| 0x02 | Operating Status push based on Status Change | +| 0x03 | Operating Status push Based on Interval AND status change | +| 0x04-0x0F | Reserved | + +P/S (1 bit) + +| P/S | Description | +| --- | --- | +| 0x00 | Primary push configuration | +| 0x01 | Secondary push configuration | + +Push Dataset (24 bits) + +The Push Dataset parameter is use to indicate which parameters are requested to be pushed from the [meter. This field MUST be encoded according to the Meter Dataset defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Interval Months (8 bits) + +Specify the number of months between pushing the push dataset. + +Interval Day (8 bits) + +Specify the number of days between pushing the push dataset. + +Interval Hours (8 bits) + +Specify the number of hours between pushing the push dataset. + +Interval Minute (8 bits) + +Specify the number of minutes between pushing the push dataset. + +Push Node ID (8 bits) + +Specify the node ID of the node to receive push dataset in the given interval. + +## 4.65.2 Meter Table Push Configuration Get Command + +This command is used to request the meters push configuration + +The Meter Table Push Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL PUSH _ _ _ _ | | | | | | | | +| Command = METER TBL PUSH CONFIGURATION GET _ _ _ _ | | | | | | | | + +## 4.65.3 Meter Table Push Configuration Report Command + +This command is used report the current Push Configuration + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER TBL PUSH _ _ _ _ | | | | | | | | +| Command = METER TBL PUSH CONFIGURATION REPORT _ _ _ _ | | | | | | | | +| Reserved | | | P/S | Operating Status Push Mode | | | | +| Push Dataset 1 | | | | | | | | +| Push Dataset 2 | | | | | | | | +| Push Dataset 3 | | | | | | | | +| Interval Months | | | | | | | | +| Interval Days | | | | | | | | +| Interval Hours | | | | | | | | +| Interval Minutes | | | | | | | | +| Push Node ID | | | | | | | | + +[Refer to Meter Table Push Configuration Set Command (section 4.65.1) for detailed description of the](04.65-meter-table-push-configuration-command-class-version-1.md#4651-meter-table-push-configuration-set-command) fields. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..5a17b3b --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md @@ -0,0 +1,74 @@ + +# 4.66 Move To Position Window Covering Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST NOT support this command class. + +Window covering device implementations SHOULD support the Window Covering Command Class. + +The Move To Position Window Covering Command Class is used to control the position of a window covering device. + +The Move To Position Window Covering Command Class is an actuator control command class. [Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +## 4.66.1 Move To Position Set Command + +This command is used to instruct a window covering to move to a new position. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MTP WINDOW COVERING _ _ _ _ | | | | | | | | +| Command = MOVE TO POSITION SET _ _ _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +[The encoding of the Value field MUST be according to Table 77.](04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md#4661-move-to-position-set-command) + +Table 77, Move To Position Set :: Value + +| Value | Level | State | +| --- | --- | --- | +| 0 (0x00) | 0% | Closed | +| 1..99 (0x01..0x63) | Almost closed .. 100% Open | Open | +| … | reserved | reserved | +| 255 (0xFF) | 100% Open | Open | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.66.2 Move To Position Get Command + +This command is used to request the status of a window covering device. + +The Move To Position Report command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MTP WINDOW COVERING _ _ _ _ | | | | | | | | +| Command = MOVE TO POSITION GET _ _ _ | | | | | | | | + +## 4.66.3 Move To Position Report Command + +This command is used to advertise the status of a window covering device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MTP WINDOW COVERING _ _ _ _ | | | | | | | | +| Command = MOVE TO POSITION REPORT _ _ _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +[The encoding of the Value field MUST be according to Table 77.](04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md#4661-move-to-position-set-command) + +The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. + +A controlling device MUST NOT assume that the Value is identical to a value previously issued with a Set command when a transition has ended. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.67-multilevel-sensor-command-class-version-1-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.67-multilevel-sensor-command-class-version-1-4.md new file mode 100644 index 0000000..40746be --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.67-multilevel-sensor-command-class-version-1-4.md @@ -0,0 +1,75 @@ + +# 4.67 Multilevel Sensor Command Class, version 1-4 + +The Multilevel Sensor Command Class is used to advertise numerical sensor readings.. + +## 4.67.1 Multilevel Sensor Get Command + +This command is used to request the current reading from a multilevel sensor. + +The Multilevel Sensor Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL GET _ _ | | | | | | | | + +## 4.67.2 Multilevel Sensor Report Command + +This command is used by a supporting node to advertise its current sensor reading for its supported sensor type. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL REPORT _ _ | | | | | | | | +| Sensor Type | | | | | | | | +| Precision | | | Scale | | Size | | | +| Sensor Value 1 | | | | | | | | +| … | | | | | | | | +| Sensor Value N | | | | | | | | + +Sensor Type (8 bits) + +This field is used to specify the sensor type of the actual sensor reading. + +[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) be used. + +A node MUST support as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type is specified [in [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Precision (3 bits) + +This field is used to indicate how many decimal places are included the Sensor Value field. For example, the Sensor Value 1025 with precision 2 MUST be interpreted as equal to 10.25. + +Scale (2 bits) + +This field is used to indicate what scale is used for the actual sensor reading. + +[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) be used. + +A node MUST implement as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type [is specified in [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Size (3 bits) + +This field is used to indicate the length in bytes of the Sensor Value field. + +This field MUST be set to 1, 2 or 4. Sensor Value (N bytes) + +This field is used to advertise the value of the actual sensor reading. + +The length of this field in bytes MUST be according to the Size field value. + +The first byte MUST be the most significant byte. + +[This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +A controlling node receiving this command MUST always show the sensor value as is even though the Sensor Type and/or Scale are unknown. + +A controlling node SHOULD implement the capability to update its list of Sensor Type and Scales, so that [new Sensor Types and Scales added in [17] are not presented as unknown. If a controlling node receives](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) an unknown Sensor Type or Scale, it SHOULD allow the user to assign a free-text description to the sensor reading. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.68-multilevel-sensor-command-class-version-5-11.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.68-multilevel-sensor-command-class-version-5-11.md new file mode 100644 index 0000000..e3d5455 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.68-multilevel-sensor-command-class-version-5-11.md @@ -0,0 +1,316 @@ + +# 4.68 Multilevel Sensor Command Class, Version 5-11 + +The Multilevel Sensor Command Class is used to advertise numerical sensor readings . + +## 4.68.1 Compatibility considerations + +A node supporting version 5 or newer may support several sensor types and advertise the readings for each of them. + +Version 5 of this command class is extended with the following functionality: + + A “get-supported” mechanism for the controlling device to interview the multilevel sensor for its supported sensor types and/or scales + + Additional sensor type and scale fields to the Multilevel Sensor Get command to request for a specific sensor report + + Additional sensor types and/or scales to the list of multilevel sensors + +Version 6 of this command class is extended with the following functionality: + + Additional sensor types + +Version 7 of this command class is extended with the following functionality: + + Additional sensor types + +Version 8 of this command class is extended with the following functionality: + + New Sensor Types and Scale Values for rotation and linear movement.  New Sensor Types and Scale Values for Smoke Density + +Multilevel Sensor Command Class, version 8 deprecates the Sensor Type “Angle Position”. + +Version 9 of this command class is extended with the following functionality: + + New Sensor Types and Scale Values for Water Flow and Water Pressure  New Sensor Types and Scale Values for RF Signal Strength Version 10 of this command class is extended with the following functionality: + + New Sensor Types and Scale Values for Particulate Matter 10 and Respiratory rate  New Scale Values for CO and VOC Sensors Types + +Version 11 of this command class is extended with the following functionality: + + New Sensor Types and Scale Values.  [Moved the list of assigned Sensor Types and Scale Values to an external registry [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command)  Deprecated the “General Purpose” Sensor Type + +### 4.68.1.1 Unknown Multilevel Sensor Types and Scales + +A controlling node SHOULD implement the capability to update its Multilevel sensor types and scales [list, so that new Types and Scales added in [17] are not presented as unknown. If a controlling node](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) receives an unknown Type or Scale, it SHOULD allow the user to assign a free-text description to that Type or Scale. + +## 4.68.2 Multilevel Sensor Get Supported Sensor Command + +This command is used to request the supported Sensor Types from a supporting node. + +The Multilevel Sensor Supported Sensor Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL SUPPORTED GET SENSOR _ _ _ _ | | | | | | | | + +## 4.68.3 Multilevel Sensor Supported Sensor Report Command + +This command is used to advertise the supported Sensor Types by a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL SUPPORTED SENSOR REPORT _ _ _ _ | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Bit Mask (N bytes) + +This field is used to advertise the supported sensor types by sending node. + +This field MUST be treated as a bit mask and interpreted as follows: + + Bit 0 in Bit Mask 1 indicates if Sensor Type = Air Temperature (0x01) is supported  Bit 1 in Bit Mask 1 indicates if Sensor Type = General Purpose (0x02) is supported  Bit 2 in Bit Mask 1 indicates if Sensor Type = luminance (0x03) is supported  … + +[The list of Sensor Types is defined in [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +The value 1 MUST indicate that the corresponding Sensor Type is supported. + +The value 0 MUST indicate that the corresponding Sensor Type is not supported. + +It is only necessary to send the Bit Mask fields from 1 and up to the Bit Mask N indicating the last CC:0031.05.02.11.003 supported Sensor Type. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. + +Note that the mapping of bit 0 to Sensor Type = 1 differs from the support mapping used by the Notification Command Class. The Notification Command Class maps bit 1 to Notification Type =1. + +## 4.68.4 Multilevel Sensor Get Supported Scale Command + +This command is used to retrieve the supported scales of the specific sensor type from the Multilevel Sensor device. + +The Multilevel Sensor Supported Scale Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL SUPPORTED GET SCALE _ _ _ _ | | | | | | | | +| Sensor Type | | | | | | | | + +Sensor Type (8 bits) + +This field is used to request a given sensor type. + +If the specified sensor type is not supported, a receiving node SHOULD set the Scale Bit Mask field to 0 in the returned response. + +## 4.68.5 Multilevel Sensor Supported Scale Report Command + +This command is used to advertise the supported scales of a specified multilevel sensor type. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL SUPPORTED SCALE REPORT _ _ _ _ | | | | | | | | +| Sensor Type | | | | | | | | +| Reserved | | | | Scale Bit Mask | | | | + +Sensor Type (8 bits) + +This field is used to indicate the actual Sensor Type for which the supported scales are being advertised. + +Scale Bit Mask (4 bits) + +This field is used to advertise the supported scales for the actual sensor type. + +This field MUST be treated as a bit mask and interpreted as follow: + + Bit 0 indicates support for the first scale of the actual Sensor Type  Bit 1 indicates support for the second scale of the actual Sensor Type  … + +[The list of scales for a given sensor type is defined in [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +The value 1 MUST indicate that the corresponding scale is supported for the sensor type. The value 0 MUST indicate that the corresponding scale is not supported for the sensor type. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.68.6 Multilevel Sensor Get Command + +This command is used to request the current reading from a multilevel sensor. + +The Multilevel Sensor Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL GET _ _ | | | | | | | | +| Sensor Type | | | | | | | | +| Reserved | | | Scale | | Reserved | | | + +Sensor Type (8 bits) + +This field is used to request a node to report a reading for the specified sensor type. + +If this field is unspecified or a receiving node does not support the specified Sensor Type, it MUST reply with a pre-defined default Sensor Type and Scale. + +Scale (2 bits) + +This field is used to request a node to report a reading with a particular scale for the actual Sensor Type. + +A node receiving a non-supported scale for the actual Sensor Type MUST reply with a supported scale within the Sensor type. + +A sending node MUST ensure that the receiver supports the requested Sensor Types and/or Scales using the Multilevel Sensor Get Supported Sensor/Scale commands. + +Reserved + +These fields MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.68.7 Multilevel Sensor Report Command + +This command is used to advertise a multilevel sensor reading. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | +| Command = SENSOR MULTILEVEL REPORT _ _ | | | | | | | | +| Sensor Type | | | | | | | | +| Precision | | | Scale | | Size | | | +| Sensor Value 1 | | | | | | | | +| … | | | | | | | | +| Sensor Value N | | | | | | | | + +Sensor Type (8 bits) + +This field is used to specify the sensor type of the actual sensor reading. + +[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) be used. + +A node MUST support as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type is specified [in [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Precision (3 bits) + +This field is used to indicate how many decimal places are included the Sensor Value field. For example, the Sensor Value 1025 with precision 2 MUST be interpreted as equal to 10.25. + +Scale (2 bits) + +This field is used to indicate what scale is used for the actual sensor reading. + +[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) be used. + +A node MUST implement as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type [is specified in [17].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Size (3 bits) + +This field is used to indicate the length in bytes of the Sensor Value field. + +This field MUST be set to 1, 2 or 4. Sensor Value (N bytes) + +This field is used to advertise the value of the actual sensor reading. + +The length of this field MUST be according to the Size field value. The first byte MUST be the most significant byte. [This field MUST be encoded using signed representation and comply with Table 10, Signed field encoding (two’s complement representation).](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +A controlling node receiving this command MUST always show the sensor value as is even though the Sensor Type and/or Scale are unknown. + +A controlling node SHOULD implement the capability to update its list of Sensor Type and Scales, so that [new Sensor Types and Scales added in [17] are not presented as unknown. If a controlling node receives](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) an unknown Sensor Type or Scale, it SHOULD allow the user to assign a free-text description to the sensor reading. + +### 4.68.7.1 Detailed description: Sensor Types for Movement and Rotation + +A device may report position, velocity (position change over time) or acceleration (velocity change over time). Position, velocity and acceleration may all refer to a linear scale following an axis or a polar scale circling an axis. Position may be reported in an absolute or relative fashion. + +The 3D reference coordinate system outlined below MUST be used for reporting changes in the physical orientation. + +![Figure 13, 3D reference coordinate system](assets/img-0d643251a7.png) + +Information relating to linear position, velocity and acceleration MUST refer to the zero position on a given axis. Thus a position change or a velocity MUST be positive if moving towards a larger position, measured from the zero position. + +Information relating to an angle or change in angle MUST use the right-hand rule. This means that if one (virtually) grabs around an axis with the right hand, with the thumb in the direction of the axis, the angle increases in the direction of the index finger. Table 78, Definition of position, velocity or acceleration + +| Application | Definition | +| --- | --- | +| Linear position, absolute | Position with reference to 0 (e.g. 1 meter) | +| Linear position, relative | Position with reference to previous position (e.g. 1 meter) | +| Linear velocity | Position change per time unit (e.g. 1 meter/second) | +| Linear acceleration | Velocity change per time unit (e.g. 1 meter/second2) | +| Polar position, absolute | Angle with reference to 0 (e.g. 45 degrees) | +| Polar position, relative | Angle with reference to previous angle (e.g. 45 degrees) | +| Polar velocity (rotation) | Angle change per time unit (e.g. 1 degree/second) | +| Polar acceleration | Velocity change per time unit (e.g. 1 degree/second2) | + +Depending on the number of axes supported by a given device, changes in the physical orientation are [mapped to one, two or three axes as outlined in Table 79.](04.68-multilevel-sensor-command-class-version-5-11.md#46871-detailed-description-sensor-types-for-movement-and-rotation) + +Table 79, Mapping of 1D, 2D and 3D movement and rotation + +| Dimensions | Movement | Rotation | +| --- | --- | --- | +| 1 | Along X axis | Around X axis | +| 2 | Along X and Y axes | Around X and Y axes | +| 3 | Along X, Y and Z axes | Around X, Y and Z axes | + +A number of Sensor Types allow a device to report changes in the physical orientation. + +Table 80, Recommended Sensor Types for reporting movement and rotation + +| Application | Sensor Type | Intended usage | +| --- | --- | --- | +| 1D Linear position, absolute | Distance (v3) | Single axis measurement of position (m) | +| 1D Linear position, relative | (no support) | Single axis measurement of position change (m) | +| 1D Linear velocity | Velocity (v2) | Single axis measurement of velocity (m/s) | +| 1D Linear accelleration | Acceleration, X (v8) | Single axis measurement of acceleration (m/s2) | +| 1D Polar position, absolute | Direction (v2) | Single axis measurement of angle (degrees) | +| 1D Polar position, relative | (no support) | Single axis measurement of angle change | +| 1D Polar velocity | Rotation (v5) | Single axis measurement of velocity (RPM) | +| 1D Polar accelleration | (no support) | Single axis measurement of acceleration (degree/s2) | +| 2D Linear position, absolute | (no support) | Two axis measurement of position (m) | +| 2D Linear position, relative | (no support) | Two axis measurement of position change (m) | +| 2D Linear velocity | (no support) | Two axis measurement of velocity (m/s) | +| 2D Linear accelleration | Acceleration, X (v8), Acceleration, Y (v8) | Two axis measurement of acceleration (m/s2) | +| 2D Polar position, absolute | (no support) | Two axis measurement of angle (degrees from North) | +| 2D Polar position, relative | (no support) | Two axis measurement of angle change | +| 2D Polar velocity | (no support) | Two axis measurement of velocity (RPM) | +| 2D Polar accelleration | (no support) | Two axis measurement of acceleration (degree/s2) | + +| Application | Sensor Type | Intended usage | +| --- | --- | --- | +| 3D Linear position, absolute | (no support) | Three axis measurement of position (m) | +| 3D Linear position, relative | (no support) | Three axis measurement of position change (m) | +| 3D Linear velocity | (no support) | Three axis measurement of velocity (m/s) | +| 3D Linear accelleration | Acceleration, X (v8), Acceleration, Y (v8), Acceleration, Z (v8) | Three axis measurement of acceleration (m/s2) | +| 3D Polar position, absolute | (no support) | Three axis measurement of angle (degrees from North) | +| 3D Polar position, relative | (no support) | Three axis measurement of angle change | +| 3D Polar velocity | (no support) | Three axis measurement of velocity (RPM) | +| 3D Polar accelleration | (no support) | Three axis measurement of acceleration (degree/s2) | + +4.68.7.1.1 Sensor Type = Acceleration + +The sensor types “Acceleration, X”, “Acceleration, Y” and “Acceleration, Z” are used to advertise the acceleration of a device along the X, Y and Z axes, respectively. + +A one-dimensional device MUST report acceleration using the “Acceleration, X” type. + +A two-dimensional device MUST report acceleration using the “Acceleration, X” and “Acceleration, Y” types. + +The Scale used MUST be m/s 2. An Acceleration value reported with the Scale m/s 2 may be converted by a receiving node to a “g-force” level by using the formula below: + +1g = 9.81m/s 2 (g represents the unit of Earth Gravity; NOT the weight unit “gram”) + +### 4.68.7.2 Detailed description: Smoke Density + +[Figure 14 shows the principle of how a photoelectric smoke detector works. As shown the smoke](04.68-multilevel-sensor-command-class-version-5-11.md#46872-detailed-description-smoke-density) sensor uses the smoke to reflect the light onto a photo cell. So when no smoke is present, the light will not be reflected onto the photo cell. When smoke is present, the light will be reflected onto the photo cell. Dependent on the smoke density, more light will be reflected onto the photo cell. So by measuring the received light strength on the photo cell, it is possible to estimate the smoke density. It is not possible to determine an accurate unit for this, as it is estimated from the light strength on the photo cell. So the exact particle density of the smoke is not known. Also the light strength interval measured on the photo cell, may vary between sensors. So it is decided to report the smoke density in percent, where 0% is no smoke and 100% is the maximum received light strength on the photo cell. + +![Figure 14, Photoelectric smoke detector](assets/img-6c1e53b1c3.png) + +### 4.68.7.3 Detailed description: RF Signal Strength + +The RF Signal Strength sensor type may report values using two different scales. While the dBm is a well-defined unit, the RSSI value represents a relative measurement where the internal sampling circuits and the actual sampling method is product specific. + +The RSSI value MUST be reported in the range 0..100, where the value 100 represents the highest power level that can be measured. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.58-multilevel-switch-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.69-multilevel-switch-command-class-version-1.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.58-multilevel-switch-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.69-multilevel-switch-command-class-version-1.md index 1a92c60..9725822 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.58-multilevel-switch-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.69-multilevel-switch-command-class-version-1.md @@ -1,40 +1,40 @@ -# 4.58 Multilevel Switch Command Class, version 1 +# 4.69 Multilevel Switch Command Class, version 1 The Multilevel Switch Command Class is used to control devices with multilevel capability. [The Multilevel Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) -## 4.58.1 Multilevel Switch Set Command +## 4.69.1 Multilevel Switch Set Command This command is used to set a multilevel value in a supporting device. The device MAY apply a non-zero duration to the transition from one value to a new value. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL SET _ _ | | | | | | | | +| Value | | | | | | | | Value (8 bits) -[The encoding of the Value field MUST be according to Table 75.](04.58-multilevel-switch-command-class-version-1.md#4581-multilevel-switch-set-command) +[The encoding of the Value field MUST be according to Table 81.](04.69-multilevel-switch-command-class-version-1.md#4691-multilevel-switch-set-command) -Table 75, Multilevel Switch Set :: Value +Table 81, Multilevel Switch Set :: Value -| | Value | | | Level | | | State | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | | 0% | | | Off | | | -| 1..99 (0x01..0x63) | | | Lowest non-zero level .. 100% | | | On | | | -| … | | | Reserved | | | Reserved | | | -| 255 (0xFF) | | | Restore most recent (non-zero) level. | | | On | | | +| Value | Level | State | +| --- | --- | --- | +| 0 (0x00) | 0% | Off | +| 1..99 (0x01..0x63) | Lowest non-zero level .. 100% | On | +| … | Reserved | Reserved | +| 255 (0xFF) | Restore most recent (non-zero) level. | On | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. @@ -44,7 +44,7 @@ The values 0x00 and 0xFF are special values which MUST be treated as state contr A device MAY implement up to 100 hardware levels (including 0). If a device implements less than 100 hardware levels, the hardware levels SHOULD be distributed uniformly over the entire range. The mapping of command values to hardware levels MUST be monotonous, i.e. a higher value MUST be [mapped to either the same or a higher hardware level. Refer to 3.6.2.](../03-command-class-overview/03.06-actuator-control.md#362-reporting-values) -## 4.58.2 Multilevel Switch Get Command +## 4.69.2 Multilevel Switch Get Command This command is used to request the status of a multilevel device. @@ -52,51 +52,53 @@ The Multilevel Switch Report command MUST be returned in response to this comman This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL GET _ _ | | | | | | | | -## 4.58.3 Multilevel Switch Report Command +## 4.69.3 Multilevel Switch Report Command This commandis used to advertise the status of a multilevel device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL REPORT _ _ | | | | | | | | +| Value | | | | | | | | Value (8 bits) -[The encoding of the Value field MUST be according to Table 76.](04.58-multilevel-switch-command-class-version-1.md#4583-multilevel-switch-report-command) +[The encoding of the Value field MUST be according to Table 82.](04.69-multilevel-switch-command-class-version-1.md#4693-multilevel-switch-report-command) -Table 76, Multilevel Switch Report :: Value +Table 82, Multilevel Switch Report :: Value -| | Value | | Hardware level | | | State | | -| --- | --- | --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | | 0% | | Off | | | -| 1..99 (0x01..0x63) | | | Lowest non-zero level .. 100% | | On | | | -| ... | | | Reserved | | On | | | -| 254 (0xFE) | | | Unknown | | Unknown | | | -| 255 (0xFF) | | | (100%) | | On [Deprecated] | | | +| Value | Hardware level | State | +| --- | --- | --- | +| 0 (0x00) | 0% | Off | +| 1..99 (0x01..0x63) | Lowest non-zero level .. 100% | On | +| ... | Reserved | On | +| 254 (0xFE) | Unknown | Unknown | +| 255 (0xFF) | (100%) | On [Deprecated] | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. -The value 255 (0xFF) has been deprecated as it provides no information on the actual value in the device. A sending node MUST NOT use the value 255. A receiving node MUST interpret the value 255 as 100%. The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. +The value 255 (0xFF) has been deprecated as it provides no information on the actual value in the device. A sending node MUST NOT use the value 255. A receiving node MUST interpret the value 255 as 100%. + +The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. A controlling device MUST NOT assume that the Value is identical to a value previously issued with a Set command when a transition has ended. -## 4.58.4 Multilevel Switch Start Level Change Command +## 4.69.4 Multilevel Switch Start Level Change Command This command is used to initiate a transition to a new level. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL START LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | Up/ Down | | | Ignore Start Level | | | Reserved | | | | | | | | | | | | | | | -| Start Level | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL START LEVEL CHANGE _ _ _ _ | | | | | | | | +| Reserved | Up/ Down | Ignore Start Level | Reserved | | | | | +| Start Level | | | | | | | | Up/Down (1 bit) @@ -118,11 +120,11 @@ Start Level (8 bits) The Start Level field MUST specify the initial level of the level change. -## 4.58.5 Multilevel Switch Stop Level Change Command +## 4.69.5 Multilevel Switch Stop Level Change Command This command is used to stop an ongoing transition. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL STOP LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL STOP LEVEL CHANGE _ _ _ _ | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.59-multilevel-switch-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.70-multilevel-switch-command-class-version-2.md similarity index 59% rename from docs/specs/command-class-specification/04-command-class-definitions/04.59-multilevel-switch-command-class-version-2.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.70-multilevel-switch-command-class-version-2.md index 901123e..26e3403 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.59-multilevel-switch-command-class-version-2.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.70-multilevel-switch-command-class-version-2.md @@ -1,17 +1,17 @@ -# 4.59 Multilevel Switch Command Class, version 2 +# 4.70 Multilevel Switch Command Class, version 2 The Multilevel Switch Command Class is used to control devices with multilevel capability. [The Multilevel Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) -## 4.59.1 Compatibility considerations +## 4.70.1 Compatibility considerations A device supporting Multilevel Switch CC, version 2 MUST support Multilevel Switch CC, version 1. @@ -19,16 +19,16 @@ Version 2 adds a “Duration” parameter to the Multilevel Switch Set and Multi Commands not described in Version 2 remain unchanged from Version 1. -## 4.59.2 Multilevel Switch Set Command +## 4.70.2 Multilevel Switch Set Command This command is used to set a multilevel value in a supporting device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL SET _ _ | | | | | | | | +| Value | | | | | | | | +| Duration | | | | | | | | Value (8 bits) @@ -42,17 +42,17 @@ The Duration field MUST specify the time that the transition should take from th The factory default duration SHOULD be the same as the duration used for the Multilevel Switch Set command, version 1. -## 4.59.3 Multilevel Switch Start Level Change Command +## 4.70.3 Multilevel Switch Start Level Change Command This command is used to initiate a transition to a new level. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL START LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | Up/ Down | | | Ignore Start Level | | | Reserved | | | | | | | | | | | | | | | -| Start Level | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL START LEVEL CHANGE _ _ _ _ | | | | | | | | +| Reserved | Up/ Down | Ignore Start Level | Reserved | | | | | +| Start Level | | | | | | | | +| Duration | | | | | | | | Up/Down (1 bit) @@ -78,4 +78,4 @@ Duration (8 bits) The dimming rate to use MUST be calculated to match a transition from 0 to 99 during the time specified by the Duration field. A supporting device SHOULD respect the specified Duration value. -[For encoding of the duration value refer to section 4.59.2.](04.59-multilevel-switch-command-class-version-2.md#4592-multilevel-switch-set-command) +[For encoding of the duration value refer to section 4.70.2.](04.70-multilevel-switch-command-class-version-2.md#4702-multilevel-switch-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.60-multilevel-switch-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.71-multilevel-switch-command-class-version-3.md similarity index 60% rename from docs/specs/command-class-specification/04-command-class-definitions/04.60-multilevel-switch-command-class-version-3.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.71-multilevel-switch-command-class-version-3.md index ed7dd5c..cd2ea8a 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.60-multilevel-switch-command-class-version-3.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.71-multilevel-switch-command-class-version-3.md @@ -1,11 +1,11 @@ -# 4.60 Multilevel Switch Command Class, version 3 +# 4.71 Multilevel Switch Command Class, version 3 The Secondary Switch Type of the Multilevel Switch Command Class, version 3 has been DEPRECATED. @@ -29,7 +29,7 @@ The Multilevel Switch Set, Get and Report commands MUST address the primary devi The Multilevel Switch Start/Stop Level Change commands MUST manipulate the Secondary Switch Type functionality based on the Inc/Dec parameter. If the Secondary Switch Type is 0x00 (Undefined / Not supported), the Multilevel Switch Start/Stop Level Change (Inc/Dec) command parameter MUST be ignored. -## 4.60.1 Compatibility considerations +## 4.71.1 Compatibility considerations A device supporting Multilevel Switch CC, version 3 MUST support Multilevel Switch CC, version 2. @@ -37,7 +37,7 @@ A device supporting Multilevel Switch CC, version 3 MUST implement the Primary S Commands not described in Version 3 remain unchanged from Version 2. -## 4.60.2 Multilevel Switch Supported Get Command +## 4.71.2 Multilevel Switch Supported Get Command This command is used to request the supported Switch Types of a supporting device. @@ -45,21 +45,21 @@ The Multilevel Switch Supported Report command MUST be returned in response to t This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL SUPPORTED GET _ _ _ | | | | | | | | -## 4.60.3 Multilevel Switch Supported Report Command +## 4.71.3 Multilevel Switch Supported Report Command This command is used to advertise the supported Switch Types implemented by a supporting device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Primary Switch Type | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Secondary Switch Type | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL SUPPORTED REPORT _ _ _ | | | | | | | | +| Reserved | | | Primary Switch Type | | | | | +| Reserved | | | Secondary Switch Type | | | | | Reserved @@ -73,79 +73,78 @@ Primary Switch Type 0x00, indicating “Not supported”, has been OBSOLETED. Previous revisions of this specification allowed that a device may (theoretically) be implemented with no primary device functionality, i.e. Primary Switch Type 0x00, and specified that such a device should indicate this situation by returning Multilevel Switch Report commands carrying the value 0xFE. The value 0xFE is incompatible with Versions 1 and 2 of the Multilevel Switch Command Class and MUST NOT be used in a Multilevel Switch Report. -[The Primary Switch Type MUST comply with Table 77.](04.60-multilevel-switch-command-class-version-3.md#4603-multilevel-switch-supported-report-command) A supporting device MUST implement the Primary Switch type. The Primary Switch Type SHOULD be 0x02 (Up/Down). The Primary Switch Type MUST NOT be 0x00 (Undefined). +[The Primary Switch Type MUST comply with Table 83.](04.71-multilevel-switch-command-class-version-3.md#4713-multilevel-switch-supported-report-command) A supporting device MUST implement the Primary Switch type. The Primary Switch Type SHOULD be 0x02 (Up/Down). The Primary Switch Type MUST NOT be 0x00 (Undefined). -Table 77, Encoding of Primary and Secondary Switch Types +Table 83, Encoding of Primary and Secondary Switch Types -| | Switch | | | 0x00 | | | 0x63/0xFF | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | Type Value | | | (Direction/Endpoint A) | | | (Direction/Endpoint B) | | -| 0x00 | | | Undefined / Not supported (Secondary only) | | | | | | -| 0x01 | | | Off | | | On | | | -| 0x02 | | | Down | | | Up | | | -| 0x03 | | | Close | | | Open | | | -| 0x04 | | | Counter-Clockwise | | | Clockwise | | | -| 0x05 | | | Left | | | Right | | | -| 0x06 | | | Reverse | | | Forward | | | -| 0x07 | | | Pull | | | Push | | | -| 0x08-0x1F | | | Reserved | | | | | | +| Switch Type Value | 0x00 (Direction/Endpoint A) | 0x63/0xFF (Direction/Endpoint B) | +| --- | --- | --- | +| 0x00 | Undefined / Not supported (Secondary only) | | +| 0x01 | Off | On | +| 0x02 | Down | Up | +| 0x03 | Close | Open | +| 0x04 | Counter-Clockwise | Clockwise | +| 0x05 | Left | Right | +| 0x06 | Reverse | Forward | +| 0x07 | Pull | Push | +| 0x08-0x1F | Reserved | | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Secondary Switch Type (5 bits) -The Secondary Switch Type field MUST represent the secondary device functionality. The Secondary [Switch Type MUST comply with Table 77.](04.60-multilevel-switch-command-class-version-3.md#4603-multilevel-switch-supported-report-command) +The Secondary Switch Type field MUST represent the secondary device functionality. The Secondary [Switch Type MUST comply with Table 83](04.71-multilevel-switch-command-class-version-3.md#4713-multilevel-switch-supported-report-command) A supporting device MAY implement the Secondary Switch type. -## 4.60.4 Multilevel Switch Start Level Change Command +## 4.71.4 Multilevel Switch Start Level Change Command This command is used to initiate a transition to a new level. The Multilevel Switch Command Class, version 3 adds a “Secondary Switch Inc/Dec” and a “Secondary Switch Step Size” field to this command to support motor controlled devices featuring two-dimensional motion. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL START LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Primary Switch Up/Down | | | | | | Ignore Start Level | | | Secondary Switch Inc/Dec | | | | | | Reserved | | | | | | | | | -| Primary Switch Start Level | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | -| Secondary Switch Step Size | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL START LEVEL CHANGE _ _ _ _ | | | | | | | | +| Primary Switch Up/Down | | Ignore Start Level | Secondary Switch Inc/Dec | | Reserved | | | +| Primary Switch Start Level | | | | | | | | +| Duration | | | | | | | | +| Secondary Switch Step Size | | | | | | | | Primary Switch Up/Down (2 bits) The Up/Down field MUST be used for manipulating the primary device functionality. -[This field MUST be encoded according to Table 78.](04.60-multilevel-switch-command-class-version-3.md#4604-multilevel-switch-start-level-change-command) +[This field MUST be encoded according to Table 84.](04.71-multilevel-switch-command-class-version-3.md#4714-multilevel-switch-start-level-change-command) -Table 78, Encoding of the Up/Down field +Table 84, Encoding of the Up/Down field -| | Value | | | Description | | | Details | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Up | | | Increase level for Primary Switch Type | | | -| 0x01 | | | Down | | | Decrease level for Primary Switch Type | | | -| 0x02 | | | Reserved | | | | | | -| 0x03 | | | No Up/Down motion | | | Maintain current level for Primary Switch Type | | | +| Value | Description | Details | +| --- | --- | --- | +| 0x00 | Up | Increase level for Primary Switch Type | +| 0x01 | Down | Decrease level for Primary Switch Type | +| 0x02 | Reserved | | +| 0x03 | No Up/Down motion | Maintain current level for Primary Switch Type | Ignore Start Level (1 bit) -A receiving device SHOULD respect the start level if the Ignore Start Level bit is 0. A receiving device MUST ignore the start level if the Ignore Start Level bit is 1. - -Secondary Switch Inc/Dec (2 bits) +A receiving device SHOULD respect the start level if the Ignore Start Level bit is 0. A receiving device MUST ignore the start level if the Ignore Start Level bit is 1. Secondary Switch Inc/Dec (2 bits) The Inc/Dec field MUST be used for controlling the secondary device functionality. -If the Secondary Switch Type is 0x00 (Undefined / Not supported), the Inc/Dec field MUST be ignored. This field MUST be encoded according to the table below. +If the Secondary Switch Type is 0x00 (Undefined / Not supported), the Inc/Dec field MUST be ignored. + +[This field MUST be encoded according to Table 85.](04.71-multilevel-switch-command-class-version-3.md#4714-multilevel-switch-start-level-change-command) -Table 79, Encoding of the Inc/Dec field +Table 85, Encoding of the Inc/Dec field -| | Value | | | Description | | | Details | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Increment | | | Increase level for Secondary Switch Type | | | -| 0x01 | | | Decrement | | | Decrease level for Secondary Switch Type | | | -| 0x02 | | | Reserved | | | | | | -| 0x03 | | | No Inc/Dec | | | Maintain current level for Secondary Switch Type | | | +| Value | Description | Details | +| --- | --- | --- | +| 0x00 | Increment | Increase level for Secondary Switch Type | +| 0x01 | Decrement | Decrease level for Secondary Switch Type | +| 0x02 | Reserved | | +| 0x03 | No Inc/Dec | Maintain current level for Secondary Switch Type | As this field defines the value “00” of two previously reserved bits as the code “Increment”, a supporting device implementing Multilevel Switch CC, version 3 MUST correctly identify the Multilevel Switch Start Level Change command to be version 3 (by the presence of the field) before interpreting the field. Failing to do so will cause a device to start incrementing the Secondary Switch Type in response to version 1 and version 2 variants of the Multilevel Switch Start Level Change command. @@ -159,9 +158,7 @@ The Start Level field MUST be used for controlling the primary device functional Duration (8 bits) -This field is unchanged from version 2. - -Secondary Switch Step Size (8 bits) +This field is unchanged from version 2. Secondary Switch Step Size (8 bits) The Step Size field MAY be used for controlling a secondary device functionality. If the Secondary Switch Type is 0x00 (Undefined / Not supported), the Step Size field MUST be ignored. If the Secondary Switch Type is not 0x00, the Step Size field MUST be used for controlling the secondary device functionality. @@ -171,14 +168,15 @@ This field MUST carry a value in the range {0x00..0x63, 0xFF}. All other values A device MAY implement 100 hardware levels (including 0). If a device implements less than 100 hardware levels, the mapping to hardware levels SHOULD be distributed equally over the entire range of 1..99 (0x01..0x63). The mapping of command values to hardware levels MUST be monotonous, i.e. a higher value MUST be mapped to either the same or a higher hardware level. -[An implementation MUST interpret the combined Inc/Dec and Step Size fields as outlined in Table 80.](04.60-multilevel-switch-command-class-version-3.md#4604-multilevel-switch-start-level-change-command) Table 80, Interpretation of the Inc/Dec and Step Size fields +[An implementation MUST interpret the combined Inc/Dec and Step Size fields as outlined in Table 86.](04.71-multilevel-switch-command-class-version-3.md#4714-multilevel-switch-start-level-change-command) + +Table 86, Interpretation of the Inc/Dec and Step Size fields -| | (Secondary | | Inc/Dec | Step Size | Interpretation | -| --- | --- | --- | --- | --- | --- | -| | Switch Type) | | | | | -| (undefined) | | | (ignore) | (ignore) | Secondary Switch Type is undefined  ignore fields | -| 0x01..0x07 | | | No Inc/Dec | (ignore) | No Inc/Dec  Maintain current Secondary Switch level | -| 0x01..0x07 | | | Increment | x | Increase Secondary Switch level by x steps | -| 0x01..0x07 | | | Decrement | y | Decrease Secondary Switch level by y steps | +| (Secondary Switch Type) | Inc/Dec | Step Size | Interpretation | +| --- | --- | --- | --- | +| (undefined) | (ignore) | (ignore) | Secondary Switch Type is undefined  ignore fields | +| 0x01..0x07 | No Inc/Dec | (ignore) | No Inc/Dec  Maintain current Secondary Switch level | +| 0x01..0x07 | Increment | x | Increase Secondary Switch level by x steps | +| 0x01..0x07 | Decrement | y | Decrease Secondary Switch level by y steps | The requested level change SHOULD take the time specified by the Duration field. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.61-multilevel-switch-command-class-version-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.72-multilevel-switch-command-class-version-4.md similarity index 61% rename from docs/specs/command-class-specification/04-command-class-definitions/04.61-multilevel-switch-command-class-version-4.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.72-multilevel-switch-command-class-version-4.md index 6085e3b..c970495 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.61-multilevel-switch-command-class-version-4.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.72-multilevel-switch-command-class-version-4.md @@ -1,17 +1,17 @@ -# 4.61 Multilevel Switch Command Class, version 4 +# 4.72 Multilevel Switch Command Class, version 4 The Multilevel Switch Command Class is used to control devices with multilevel capability. [The Multilevel Switch Command Class is an actuator control Command Class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) -## 4.61.1 Compatibility considerations +## 4.72.1 Compatibility considerations Version 4 adds reporting of target value and duration. @@ -19,21 +19,21 @@ A device supporting Multilevel Switch CC, Version 4 MUST support Multilevel Swit A device receiving a V1 Multilevel Set command MAY apply a factory default duration to the transition to a new value. -## 4.61.2 Multilevel Switch Report Command +## 4.72.2 Multilevel Switch Report Command This command is used to advertise the status of a multilevel device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH MULTILEVEL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH MULTILEVEL _ _ _ | | | | | | | | +| Command = SWITCH MULTILEVEL REPORT _ _ | | | | | | | | +| Current Value | | | | | | | | +| Target Value | | | | | | | | +| Duration | | | | | | | | Current Value (8 bits) -[The encoding of the Value field MUST be according to Table 76.](04.58-multilevel-switch-command-class-version-1.md#4583-multilevel-switch-report-command) +[The encoding of the Value field MUST be according to Table 82.](04.69-multilevel-switch-command-class-version-1.md#4693-multilevel-switch-report-command) The device may be queried for its current value while in transition to a new value. The response to a Get command SHOULD be the current value of the device hardware. @@ -43,10 +43,12 @@ Target Value (8 bits) The Target Value field MUST advertise the target value of an ongoing transition or the most recent transition. -[The encoding of the Target Value field MUST be according to Table 76.](04.58-multilevel-switch-command-class-version-1.md#4583-multilevel-switch-report-command) +[The encoding of the Target Value field MUST be according to Table 82.](04.69-multilevel-switch-command-class-version-1.md#4693-multilevel-switch-report-command) If queried after receiving a Set command, the Target Value field MUST advertise the target value specified in the Set command. The Target Value may change at a later time due to local control or a Multilevel Switch Stop Level Change command. -If the device is in a motion controlled transition, the Target Value field MUST advertise the value 0x00 or 0x63. Duration (8 bits) +If the device is in a motion controlled transition, the Target Value field MUST advertise the value 0x00 or 0x63. + +Duration (8 bits) The Duration field SHOULD advertise the time needed to reach the Target Value at the actual transition [rate. The encoding of the Duration field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.62-multilevel-toggle-switch-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.73-multilevel-toggle-switch-command-class-version-1-deprecated.md similarity index 52% rename from docs/specs/command-class-specification/04-command-class-definitions/04.62-multilevel-toggle-switch-command-class-version-1-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.73-multilevel-toggle-switch-command-class-version-1-deprecated.md index 3a50721..9c8d9f8 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.62-multilevel-toggle-switch-command-class-version-1-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.73-multilevel-toggle-switch-command-class-version-1-deprecated.md @@ -1,11 +1,11 @@ -# 4.62 Multilevel Toggle Switch Command Class, version 1 [DEPRECATED] +# 4.73 Multilevel Toggle Switch Command Class, version 1 [DEPRECATED] THIS COMMAND CLASS HAS BEEN DEPRECATED @@ -13,16 +13,16 @@ A device MAY implement this command class, but it is RECOMMENDED that new implem The Multilevel Toggle Switch Command Class is used for multilevel toggle-style actuator devices. -## 4.62.1 Multilevel Toggle Switch Set Command +## 4.73.1 Multilevel Toggle Switch Set Command This command is used to set the level in a device that supports the multilevel switch functionality. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE MULTILEVEL SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE MULTILEVEL SET _ _ _ | | | | | | | | -## 4.62.2 Multilevel Toggle Switch Get Command +## 4.73.2 Multilevel Toggle Switch Get Command This command is used to request the state of the load controlled by the device. @@ -30,35 +30,35 @@ The Multilevel Toggle Switch Report Command MUST be returned in response to this This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE MULTILEVEL GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE MULTILEVEL GET _ _ _ | | | | | | | | -## 4.62.3 Multilevel Toggle Switch Report Command +## 4.73.3 Multilevel Toggle Switch Report Command This command is used to advertise the level of a toggle switch. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE MULTILEVEL REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE MULTILEVEL REPORT _ _ _ | | | | | | | | +| Value | | | | | | | | Value (8 bits) The value MAY be 0x00 (off/disable) or 0xFF (on/enable). The field MAY carry values from 1 to 99. -## 4.62.4 Multilevel Toggle Switch Start Level Change Command +## 4.73.4 Multilevel Toggle Switch Start Level Change Command This command is used to inform a multilevel toggle switch, that it should start changing the level. The speed that the switch increases or decreases the level with is implementation specific. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE MULTILEVEL START LEVEL CHANGE _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Roll Over | | | Reser- ved | | | Ignore Start Level | | | Reserved | | | | | | | | | | | | | | | -| Start Level | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE MULTILEVEL START LEVEL CHANGE _ _ _ _ _ | | | | | | | | +| Roll Over | Reser- ved | Ignore Start Level | Reserved | | | | | +| Start Level | | | | | | | | Roll Over (1 bit) @@ -76,11 +76,11 @@ Start Level (8 bits) The Start Level field contains the initial level that the switch should assume when it start to change the level. -## 4.62.5 Multilevel Toggle Switch Stop Level Change Command +## 4.73.5 Multilevel Toggle Switch Stop Level Change Command This command is used to inform a multilevel toggle switch, that it should stop changing the level. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE MULTILEVEL STOP LEVEL CHANGE _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SWITCH TOGGLE MULTILEVEL _ _ _ _ | | | | | | | | +| Command = SWITCH TOGGLE MULTILEVEL STOP LEVEL CHANGE _ _ _ _ _ | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.01-terminology.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.01-terminology.md similarity index 67% rename from docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.01-terminology.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.01-terminology.md index b95fc13..752dd6f 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.01-terminology.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.01-terminology.md @@ -1,11 +1,11 @@ -# 4.63.1 Terminology +# 4.74.1 Terminology Sensors may be designed for several purposes. A multilevel sensor advertises measurements or readings. A notification sensor sends event or state notifications. @@ -13,33 +13,31 @@ This Command Class is used for notification sensors. The Multilevel Sensor Comma Notifications are categorized into logical groups called Notification Types. A Notification is denoted with its type and event/state: {Notification Type::event/state}. A node may send Notifications from several Notification Types. -An event only has a meaning in the moment it happens. An event does not indicate the value of a state [variable. An example is given in Figure 12](04.63.01-terminology.md#4631-terminology) +An event only has a meaning in the moment it happens. An event does not indicate the value of a state [variable. An example is given in Figure 15](04.74.01-terminology.md#4741-terminology) -![Figure 12, Event notifications inform only about instantaneous situations](assets/img-10ce66b311.png) +![Figure 15, Event notifications inform only about instantaneous situations](assets/img-10ce66b311.png) -A state variable may assume two or more states. Some state variables are returned to their idle state via a generic “State idle” Notification. +A state variable may assume two or more states. Some state variables are returned to their idle state via a generic “State idle” Notification. For example, a controlling node receiving a {Smoke alarm::Smoke detected} Notification will consider that the state has not changed until it receives a {Smoke alarm::State idle(Smoke detected)} [Notification. An illustration is given in Figure 16.](04.74.01-terminology.md#4741-terminology) -For example, a controlling node receiving a {Smoke alarm::Smoke detected} Notification will consider that the state has not changed until it receives a {Smoke alarm::State idle(Smoke detected)} Notification. [An illustration is given in Figure 13.](04.63.01-terminology.md#4631-terminology) +![Figure 16, Binary state variable with generic “State idle” Notification](assets/img-a5a0d9d7be.png) -![Figure 13, Binary state variable with generic “State idle” Notification](assets/img-a5a0d9d7be.png) +The “State idle” notification may also be used to return a multi-value state variable to its idle state. An [example is given inFigure 17.](04.74.01-terminology.md#4741-terminology) -The “State idle” notification may also be used to return a multi-value state variable to its idle state. An [example is given in Figure 14.](04.63.01-terminology.md#4631-terminology) +![Figure 17, Multi-value state variable with generic “State idle” Notification](assets/img-de17561660.png) -![Figure 14, Multi-value state variable with generic “State idle” Notification](assets/img-de17561660.png) +[Some state variables use a specific Notification defined for each state change. Figure 18 shows an](04.74.01-terminology.md#4741-terminology) example of such a state variable. -[Some state variables use a specific Notification defined for each state change. Figure 15 shows an](04.63.01-terminology.md#4631-terminology) example of such a state variable. - -![Figure 15, Binary state variable with specific idle state Notification](assets/img-fb25e9706c.png) +![Figure 18, Binary state variable with specific idle state Notification](assets/img-fb25e9706c.png) Some notifications are complemented with event/state parameters. For example, the {System::System software failure} Notification may be accompanied with the manufacturer’s failure/error codes as event parameters. Event/state parameters may also affect state variables and their states. For example, the Notification {Irrigation::Schedule started} takes a 1-byte parameter which identifies the Schedule ID that is started. In that case, each state variable is identified using the state parameters, thus creating a state variable array. -[An illustration is given in Figure 16, where the same Notifications with different parameters advertise the](04.63.01-terminology.md#4631-terminology) state of different state variables. +[An illustration is given in Figure 19, where the same Notifications with different parameters advertise](04.74.01-terminology.md#4741-terminology) the state of different state variables. -![Figure 16, State variable array defined by additional Event/State Parameters](assets/img-be382647c3.png) +![Figure 19, State variable array defined by additional Event/State Parameters](assets/img-be382647c3.png) -[A complete list of Notifications (including state variables, event parameters, etc.) is given in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[A complete list of Notifications (including state variables, event parameters, etc.) is given in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) A notification node operates either in Push or in Pull mode. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.02-compatibility-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.02-compatibility-considerations.md similarity index 55% rename from docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.02-compatibility-considerations.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.02-compatibility-considerations.md index ccca022..58148ee 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.02-compatibility-considerations.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.02-compatibility-considerations.md @@ -1,53 +1,53 @@ -# 4.63.2 Compatibility considerations +# 4.74.2 Compatibility considerations -## 4.63.2.1 Notifications and Command Class version +## 4.74.2.1 Notifications and Command Class version -New Notification Types and Notifications have been added to each new version of this Command Class. A node MUST implement as a minimum the Notification Command Class version associated with the [Notifications it sends. The minimum required version for each Notification is specified in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +New Notification Types and Notifications have been added to each new version of this Command Class. CC:0071.03.00.21.001 A node MUST implement as a minimum the Notification Command Class version associated with the [Notifications it sends. The minimum required version for each Notification is specified in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -## 4.63.2.2 Push mode requirements +## 4.74.2.2 Push mode requirements A node supporting the Notification Command Class SHOULD implement Push mode. -A Push node MUST implement the Association Command Class. - -A Push node SHOULD advertise Association Groups through the Association Group Information (AGI) Command Class. +A Push node MUST implement the Association Command Class. A Push node SHOULD advertise Association Groups through the Association Group Information (AGI) Command Class. A Z-Wave Plus Push node MUST:  Provide all supported Notifications via the Lifeline Association group.  Advertise Association Groups through the Association Group Information (AGI) Command Class. -## 4.63.2.3 Pull mode requirements +## 4.74.2.3 Pull mode requirements -Earlier text revisions presented inconsistencies and undefined behaviors for Pull nodes. Thus, existing Pull nodes may behave differently than expected by a controlling node. A node supporting the Notification Command Class SHOULD NOT implement Pull mode. CC:0071.03.00.22.003 +Earlier text revisions presented inconsistencies and undefined behaviors for Pull nodes. Thus, existing Pull nodes may behave differently than expected by a controlling node. A node supporting the Notification Command Class SHOULD NOT implement Pull mode. -A Pull node MAY reorder Notifications according to priority so that the first detected event is not the first to be reported. A Pull node SHOULD NOT reorder states of the same state variable in the event queue. For example, the “Program in progress” and “Program completed” Notifications SHOULD stay in the same order. +A Pull node MAY reorder Notifications according to priority so that the first detected event is not the CC:0071.03.00.22.004 first to be reported. A Pull node SHOULD NOT reorder states of the same state variable in the event queue. For example, the “Program in progress” and “Program completed” Notifications SHOULD stay in the same order. A Pull node having its queue full SHOULD remove the oldest notification entry from the queue. Persistent notifications SHOULD carry a sequence number. -## 4.63.2.4 Multi Channel considerations +## 4.74.2.4 Multi Channel considerations If several End Points within a Multi Channel device support the Notification Command Class, they MUST all operate in the same mode (i.e. either all End Points operate in Push mode or all End Points operate in Pull mode). -4.63.2.4.1 Multi Channel Push nodes +4.74.2.4.1 Multi Channel Push nodes + +While End Points MAY send identical notifications via the Root Device Lifeline Group, the Root Device [MUST NOT send identical Notifications on behalf of multiple End Points. Illustrations are given in Figure 20 and Figure 21.](04.74.02-compatibility-considerations.md#47424-multi-channel-considerations) -While End Points MAY send identical notifications via the Root Device Lifeline Group, the Root Device [MUST NOT send identical Notifications on behalf of multiple End Points. Illustrations are given in Figure](04.63.02-compatibility-considerations.md#46324-multi-channel-considerations) CC:0071.03.00.21.005 [17 and Figure 18.](04.63.02-compatibility-considerations.md#46324-multi-channel-considerations) +![Figure 20, Multi Channel device aggregating Notifications (Lifeline group)](assets/img-db9abf0d3d.png) -![Figure 17, Multi Channel device aggregating Notifications (Lifeline group)](assets/img-db9abf0d3d.png) +![Figure 21, Multi Channel device with End Point notification overlap (Lifeline group)](assets/img-2ed45acc64.png) -![Figure 18, Multi Channel device with End Point notification overlap (Lifeline group)](assets/img-2ed45acc64.png) +A Multi Channel node with identical End Points issuing the same binary state notification with generic CC:0071.03.00.23.003 state idle Notification MAY be an exception and issue binary Notifications representing the state all End Points. -A Multi Channel node with identical End Points issuing the same binary state notification with generic state idle Notification MAY be an exception and issue binary Notifications representing the state all End Points. If doing so, the Root Device MUST issue the active state notification if any of the End Points has the active binary state and MUST issue the event inactive Notification when all End Points are back to the “State idle”. +If doing so, the Root Device MUST issue the active state notification if any of the End Points has the active binary state and MUST issue the event inactive Notification when all End Points are back to the “State idle”. -![Figure 19, Notification representing all End Points for Binary State with generic State Idle notification](assets/img-c52ce0b218.png) +![Figure 22, Notification representing all End Points for Binary State with generic State Idle notification](assets/img-c52ce0b218.png) Z-Wave Plus Multi Channel devices MUST send End Point Push notifications via the Root Device Lifeline Association Group (if notifications are not identical). @@ -55,21 +55,25 @@ A controlling node SHOULD create a Multi Channel Association to the Lifeline gro Individual End Point Notifications can be enabled/disabled by sending a Multi Channel encapsulated Notification Set Command to an End Point, even when End Point Notifications are actually sent via the Root Device Lifeline group. -## 4.63.2.5 State idle +## 4.74.2.5 State idle Every Notification Type has the same generic Notification 0x00 “State idle”, (also known as “Event Inactive” in older specification text) which was introduced in version 4. The Notification allows the device to advertise that a state variable returned to its idle state. -A Push sensor MAY send repeated state Notifications without sending any “State idle” Notification to indicate that a given state is still active. For instance, a smoke sensor can send a “Smoke Detected” Notification every five minutes to indicate that the state variable has not returned to idle (refer to [Figure 13).](04.63.01-terminology.md#4631-terminology) - -Notification Command Class, version 8 increases the requirement level for the use of the “State idle” [Notification from OPTIONAL to REQUIRED. Refer to 4.63.2.11.](04.63.02-compatibility-considerations.md#463211-version-8) +A Push sensor MAY send repeated state Notifications without sending any “State idle” Notification to indicate that a given state is still active. For instance, a smoke sensor can send a “Smoke Detected” Notification every five minutes to indicate that the state variable has not returned to idle (refer to [Figure 16.).](04.74.01-terminology.md#4741-terminology) Notification Command Class, version 8 increases the requirement level for the use of the “State idle” CC:0071.08.00.21.001 [Notification from OPTIONAL to REQUIRED. Refer to 4.74.2.11.](04.74.02-compatibility-considerations.md#474211-version-8) -A supporting node SHOULD NOT send a “State idle” notification for an event or for a state variable to [which state idle does not apply. Refer to [17] for state variables to which the “State idle” notification](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) applies +A supporting node SHOULD NOT send a “State idle” notification for an event or for a state variable to [which state idle does not apply. Refer to [18] for state variables to which the “State idle” notification](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) applies -## 4.63.2.6 Version 3 [DEPRECATED] +## 4.74.2.6 Version 3 [DEPRECATED] The Notification Command Class version 3 is an extension of the Alarm Command Class version 2 and adds the following: - [Additional Notifications (refer to [18])](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command)  Interview process includes Events (Event Supported Get / Event Supported Report)  Sequence field added for collection management of reports  The queue empty status (=0xFE) for Pull nodes. A Pull node can now advertise Notification Status = “no pending notifications” + [Additional Notifications (refer to [18])](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + + Interview process includes Events (Event Supported Get / Event Supported Report) + + Sequence field added for collection management of reports + + The queue empty status (=0xFE) for Pull nodes. A Pull node can now advertise Notification Status = “no pending notifications” Commands not mentioned in this version are unchanged from Alarm Command Class version 1 and/or Alarm Command Class version 2. @@ -77,42 +81,38 @@ The CC identifier for Notification CC V3 is the same as the Alarm CC V1 and V2. An implementation supporting Alarm CC V1 fields MUST map proprietary alarm types and levels to a similar Notification Type and Notification CC V3 where possible. In addition, all Alarm CC V1 alarm types and levels MUST be described in the product manual. -## 4.63.2.7 Version 4 [DEPRECATED] +## 4.74.2.7 Version 4 [DEPRECATED] Version 4 of this Command Class introduces the following: - [Additional Notifications (refer to [18])](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command)  Event/State = 0x00 (State idle) for a given Notification Type to indicate that all state variables of that Notification Type returned to idle  The Zensor Net Source Node ID field has been discontinued. It is now a reserved field.  Clarification to expected behavior in regards to: V1 and V2 Alarm Get Command handling o o Notification Status field description Notification Type = 0xFF, “Return first detected notification on supported list” o Event = 0xFE in Event Supported Report Command, which must not be advertised. o The support for state idle (event/state=0x00) cannot be advertised in the Event Supported Get Command and version 4 nodes will appear to use reserved values for version 3 controlling nodes. + [Additional Notifications (refer to [18])](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + + Event/State = 0x00 (State idle) for a given Notification Type to indicate that all state variables of that Notification Type returned to idle  The Zensor Net Source Node ID field has been discontinued. It is now a reserved field.  Clarification to expected behavior in regards to: V1 and V2 Alarm Get Command handling o Notification Status field description o Notification Type = 0xFF, “Return first detected notification on supported list” o Event = 0xFE in Event Supported Report Command, which must not be advertised. o -[A version 4 node MUST comply with the rules outlined in Table 81 and Table 82.](04.63.02-compatibility-considerations.md#46327-version-4-deprecated) +The support for state idle (event/state=0x00) cannot be advertised in the Event Supported Get Command and version 4 nodes will appear to use reserved values for version 3 controlling nodes. -[Table 81 outlines the required behavior when receiving an Alarm Get command, Version 1. Table 82 outlines the required behavior when receiving an Alarm Get command, Version 2.](04.63.02-compatibility-considerations.md#46327-version-4-deprecated) The version of an Alarm Get Command can be determined from the command length. +[A version 4 node MUST comply with the rules outlined in Table 87 and Table 88. Table 87 outlines the required behavior when receiving an Alarm Get command, Version 1. Table 88 outlines the required behavior when receiving an Alarm Get command, Version 2.](04.74.02-compatibility-considerations.md#47427-version-4-deprecated) The version of an Alarm Get Command can be determined from the command length. -Table 81, Required behavior when receiving Alarm Get, version 1 +Table 87, Required behavior when receiving Alarm Get, version 1 -| | Received Command: V1, ALARM GET (Alarm Type = x) _ | | | | -| --- | --- | --- | --- | --- | -| | V1 Alarm Type | | Response | | -| | supported (x)? | | | | -| YES | | | V1, ALARM REPORT (Alarm Type = x, Alarm Level = level) _ | | -| NO | | | V1, ALARM REPORT (Alarm Type = 0x00, Alarm Level = 0x00) _ | | +| Received Command: V1, ALARM GET (Alarm Type = x) _ | | +| --- | --- | +| V1 Alarm Type supported (x)? | Response | +| YES | V1, ALARM REPORT (Alarm Type = x, Alarm Level = level) _ | +| NO | V1, ALARM REPORT (Alarm Type = 0x00, Alarm Level = 0x00) _ | -Table 82, Required behavior when receiving Alarm Get, version 2 +Table 88, Required behavior when receiving Alarm Get, version 2 | Received Command: V2, ALARM GET (Alarm Type = x, Z-Wave Alarm Type = y) _ | | | | --- | --- | --- | -| Z-Wave Alarm Type supported (y)? | | Response | -| | V1 Alarm Type | | -| | supported (x)? | | -| | | | +| Z-Wave Alarm Type supported (y)? | V1 Alarm Type supported (x)? | Response | | NO | NO | NO RESPONSE | | NO | YES | V2, ALARM REPORT ( _ Alarm Type = x Alarm Level = level Reserved = 0x00 Z-Wave Alarm Status = 0x00 Z-Wave Alarm Type = 0x00 Z-Wave Alarm Event = 0x00 Number of Event Param = 0x00 ) | -| YES or y = 0xFF | YES/NO | Notifications newer than V2, idle states or empty queues MUST be represented with the unknown notification (Notification event/state field set to 0xFE). If no state is detected (push nodes) or no event/state queued (pull nodes), the Notification Type MUST be set to one of the supported Notification Type in response to a Get (Type = 0xFF) Push nodes: A supporting node MUST return the current states compatible with V2. Table 84 shows a Push node example returning responses to different V2 Alarm Get Commands. Pull nodes: A supporting node MUST return only V2 notifications from its queue when receiving a V2 Alarm Get Command. A supporting node MUST set the status to 0x00 and event to 0xFE when its queue is empty. Table 85 shows a Pull node example returning responses to different V2 Alarm Get Commands. | - -CC:0071.04.00.21.003 nodes), the Notification Type MUST be set to one of the supported +| YES or y = 0xFF | YES/NO | Notifications newer than V2, idle states or empty queues MUST be represented with the unknown notification (Notification event/state field set to 0xFE). If no state is detected (push nodes) or no event/state queued (pull nodes), the Notification Type MUST be set to one of the supported Notification Type in response to a Get (Type = 0xFF) Push nodes: A supporting node MUST return the current states compatible with V2. Table 90 shows a Push node example returning responses to different V2 Alarm Get Commands. Pull nodes: A supporting node MUST return only V2 notifications from its queue when receiving a V2 Alarm Get Command. A supporting node MUST set the status to 0x00 and event to 0xFE when its queue is empty. Table 91 shows a Pull node example returning responses to different V2 Alarm Get Commands. | -[Table 84 and Table 85 show the responses of a node supporting Notification Types and Notifications described in Table 83:](04.63.02-compatibility-considerations.md#46327-version-4-deprecated) +[Table 90 and Table 91 show the responses of a node supporting Notification Types and Notifications described in Table 89:](04.74.02-compatibility-considerations.md#47427-version-4-deprecated) -Table 83, V2 Alarm Get node capabilities example +Table 89, V2 Alarm Get node capabilities example | Node capabilities | | | --- | --- | @@ -120,76 +120,66 @@ Table 83, V2 Alarm Get node capabilities example | 0x01: Smoke Alarm | 0x01: Smoke detected 0x03: Smoke alarm test 0x06: Alarm silenced | | 0x03: CO2 Alarm | 0x01: Carbon dioxide detected | -Table 84, Push node responses to V2 Alarm Get (example) +Table 90, Push node responses to V2 Alarm Get (example) | Received Get | | Current states at the receiving node | | | Returned response | | | | --- | --- | --- | --- | --- | --- | --- | --- | -| V1 | Type | | | | | Status | | -| | | Smoke Alarm:: | Smoke Alarm:: | CO2 Alarm:: | | | Event/ | -| Alarm | | | | | Type | | | -| | | Sensor status | Alarm status | Sensor status | | | State | -| Type | | | | | | | | -| | | | | | | | | +| V1 Alarm Type | Type | Smoke Alarm:: Sensor status | Smoke Alarm:: Alarm status | CO2 Alarm:: Sensor status | Type | Status | Event/ State | | -* | 0x01 | Idle | Idle | - | 0x01 | 0x00 or 0xFF | 0xFE | | - | 0x01 | Smoke detected (V2) | Idle | - | 0x01 | 0x00 or 0xFF | 0x01 | | - | 0x01 | Smoke detected (V2) | Alarm silenced (V8) | - | 0x01 | 0x00 or 0xFF | 0x01 | | - | 0x01 | Idle | Smoke alarm test (V3) | - | 0x01 | 0x00 or 0xFF | 0xFE | | 0x00 | 0x02 | - | - | - | No Report | | | -| 0x01 | 0x02 | - | - | - | No Report, unless V1 alarm is supported. Refer to Table 82 | | | +| 0x01 | 0x02 | - | - | - | No Report, unless V1 alarm is supported. Refer to Table 88 | | | | - | 0xFF | Idle | Idle | Idle | 0x01 or 0x03** | 0x00 or 0xFF | 0xFE | | - | 0xFF | Smoke detected (V2) | Idle | Idle | 0x01 | 0x00 or 0xFF | 0x01 | | - | 0xFF | Smoke detected (V2) | Alarm silenced (V8) | Idle | 0x01 | 0x00 or 0xFF | 0x01 | | - | 0xFF | Idle | Smoke alarm test (V3) | Idle | 0x01 | 0x00 or 0xFF | 0xFE | | - | 0xFF | Smoke detected (V2) | Idle | Carbon dioxide detected (V2) | 0x01 or 0x03** | 0x00 or 0xFF | 0x01 | -*) The symbol ‘-’ indicates that the value has no impact on the V2 fields of the returned response **) It is up to the node to decide which Notification Type to report. Table 85, Pull node responses to V2 Alarm Get (example) +*) The symbol ‘-’ indicates that the value has no impact on the V2 fields of the returned response **) It is up to the node to decide which Notification Type to report. Table 91, Pull node responses to V2 Alarm Get (example) | Received Get | | Before returning a report | Returned response | | | After returning a report | | --- | --- | --- | --- | --- | --- | --- | -| V1 | Type | | | Status | | Node’s queue | -| | | | | | Event/ | | -| Alarm | | Node’s queue | Type | | | | -| | | | | | State | | -| Type | | | | | | | -| | | | | | | | +| V1 Alarm Type | Type | Node’s queue | Type | Status | Event/ State | Node’s queue | | -* | 0x01 | Empty | 0x01 | 0x00 | 0xFE | Empty | | - | 0x01 | Carbon dioxide detected (V2) Smoke detected (V2) | 0x01 | 0x00 | 0x01 | Carbon dioxide detected (V2) | | - | 0x01 | Alarm silenced (V8) Smoke detected (V2) | 0x01 | 0x00 | 0x01 | Alarm silenced (V8) | | - | 0x01 | Alarm silenced (V8) | 0x01 | 0x00 | 0xFE | Alarm silenced (V8) | | 0x00 | 0x02 | - | No Report | | | - | -| 0x01 | 0x02 | - | No Report, unless V1 alarm is supported. Refer to Table 82 | | | - | +| 0x01 | 0x02 | - | No Report, unless V1 alarm is supported. Refer to Table 88 | | | - | | - | 0xFF | Empty | 0x01 or 0x03** | 0x00 | 0xFE | Empty | | - | 0xFF | Carbon dioxide detected (V2) Smoke detected (V2) | 0x03 | 0x00 | 0x01 | Smoke detected (V2) | | - | 0xFF | Alarm silenced (V8) | 0x01 | 0x00 | 0xFE | Alarm silenced (V8) | *) The symbol ‘-’ indicates that the value has no impact on the V2 fields of the returned response **) It is up to the node to decide which Notification Type to report. -## 4.63.2.8 Version 5 [DEPRECATED] +## 4.74.2.8 Version 5 [DEPRECATED] -[Version 5 of this Command Class introduces additional Notifications (refer to [18]) and the event/state](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) parameters for the special purpose State idle 0x00, allowing to specify which state variable returned to idle. +[Version 5 of this Command Class introduces additional Notifications (refer to [18]) and the event/state](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) parameters for the special purpose State idle 0x00, allowing to specify which state variable returned to idle. A version 4 controlling node will conclude that all state variables have returned to idle when a version 5 node advertises that a single state variable has returned to idle. -## 4.63.2.9 Version 6 [DEPRECATED] +## 4.74.2.9 Version 6 [DEPRECATED] -[Version 6 of this Command Class introduces additional Notifications (refer to [18])](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[Version 6 of this Command Class introduces additional Notifications (refer to [18])](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Version 6 clarifies how to use the ‘User Code Report’ Event Parameter. The User Code Report Command is used as Event Parameter for the Notification {Access Control::Keypad Lock/Unlock Operation} Command. -[An example of Notification Event/State Parameter encapsulation is given in 4.63.6.1](04.63.06-notification-report-command.md#46361-event-state-parameter-encapsulation) +[An example of Notification Event/State Parameter encapsulation is given in 4.74.6.1](04.74.06-notification-report-command.md#47461-event-state-parameter-encapsulation) -## 4.63.2.10 Version 7 [DEPRECATED] +## 4.74.2.10 Version 7 [DEPRECATED] -[Version 7 of this Command Class introduces additional Notifications (refer to [18]).](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[Version 7 of this Command Class introduces additional Notifications (refer to [18]).](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -## 4.63.2.11 Version 8 +## 4.74.2.11 Version 8 It is RECOMMENDED that new nodes support version 8 of this Command Class. -Requirements for backwards compatibility with version 2 nodes introduced in version 4 have been found to be ambiguous and challenging to be observed correctly by newer nodes. Therefore, it is OPTIONAL [for a version 8 node to comply Table 81 and Table 82 when receiving a V2 Get Command.](04.63.02-compatibility-considerations.md#46327-version-4-deprecated) +Requirements for backwards compatibility with version 2 nodes introduced in version 4 have been found to be ambiguous and challenging to be observed correctly by newer nodes. Therefore, it is CC:0071.08.00.23.001 [OPTIONAL for a version 8 node to comply with Table 88 when receiving a V2 Get Command.](04.74.02-compatibility-considerations.md#47427-version-4-deprecated) -[Version 8 of this Command Class introduces additional Notifications (refer to [18]).](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[Version 8 of this Command Class introduces additional Notifications (refer to [18]).](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Version 8 increases the requirement level for the use of the “State idle” Notification from OPTIONAL to REQUIRED. -Supporting nodes implementing version 8 or newer of the Notification Command Class MUST issue a “State idle” Notification when a state variable returns to idle. For instance, the {Smoke alarm::Smoke Detected} Notification MUST be followed by a {Smoke alarm::State idle(Smoke detected)} Notification [when the smoke is no longer detected by the sensor. (refer to Figure 13).](04.63.01-terminology.md#4631-terminology) +Supporting nodes implementing version 8 or newer of the Notification Command Class MUST issue a “State idle” Notification when a state variable returns to idle. For instance, the {Smoke alarm::Smoke Detected} Notification MUST be followed by a {Smoke alarm::State idle(Smoke detected)} Notification [when the smoke is no longer detected by the sensor. (refer to Figure 16).](04.74.01-terminology.md#4741-terminology) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.03-interoperability-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.03-interoperability-considerations.md similarity index 58% rename from docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.03-interoperability-considerations.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.03-interoperability-considerations.md index ee0d84e..cfaa2a3 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.03-interoperability-considerations.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.03-interoperability-considerations.md @@ -1,20 +1,20 @@ -# 4.63.3 Interoperability considerations +# 4.74.3 Interoperability considerations -## 4.63.3.1 Push nodes Basic control +## 4.74.3.1 Push nodes Basic control For Push nodes, it is RECOMMENDED to implement additional association groups for relevant Notifications, which issue a Basic Set Command. It allows configuring a device to control other nodes directly, e.g., turn on lights when motion is detected and turn off when there is no more motion. -## 4.63.3.2 Event flood +## 4.74.3.2 Event flood -Certain sensors may trigger repeatedly within a short amount of time. It is RECOMMENDED to [implement timers to arbitrate the transmission of notifications. Illustrations are given in Figure 20 and Figure 21.](04.63.03-interoperability-considerations.md#46332-event-flood) +Certain sensors may trigger repeatedly within a short amount of time. It is RECOMMENDED to [implement timers to arbitrate the transmission of notifications. Illustrations are given in Figure 23 and Figure 24.](04.74.03-interoperability-considerations.md#47432-event-flood) -![Figure 20, recommended timer mechanism for sending notifications (1)](assets/img-17ed9bdd33.png) +![Figure 23, recommended timer mechanism for sending notifications (1)](assets/img-17ed9bdd33.png) -![Figure 21, recommended timer mechanism for sending notifications (2)](assets/img-13ece31554.png) +![Figure 24, recommended timer mechanism for sending notifications (2)](assets/img-13ece31554.png) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.04-notification-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.04-notification-set-command.md new file mode 100644 index 0000000..1d92894 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.04-notification-set-command.md @@ -0,0 +1,54 @@ + +# 4.74.4 Notification Set Command + +Push nodes: + +This command is used to enable or disable the unsolicited transmission of a specific Notification Type. + +Pull nodes: + +This command is used to clear a persistent Notification in the notification queue. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = NOTIFICATION SET _ | | | | | | | | +| Notification Type | | | | | | | | +| Notification Status | | | | | | | | + +Notification Type (8 bits) + +[This field is used to specify a Notification Type. Assigned values are defined in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +A sending node MUST specify a Notification Type that is supported by a receiving node. + +A receiving node MUST ignore the command if this field is set to a non-supported Notification Type or if this field set to 0xFF. + +Notification Status (8 bits) + +Push nodes: + +This field is used to set the Status of a Notification Type. [This field MUST comply with Table 92.](04.74.04-notification-set-command.md#4744-notification-set-command) + +Table 92, Notification Set::Notification Status (push mode) + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Unsolicited messages MUST be disabled for the specified Notification Type | 2 | +| 0xFF | Unsolicited messages MUST be enabled for the specified Notification Type | 2 | + +CC:0071.03.06.11.005 0xFF Unsolicited messages MUST be enabled for the specified Notification Type 2 All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +A receiving node MAY deny the deactivation of a specific Notification Type. In that case, the receiving node MUST respond to this command with an Application Rejected Request Command. CC:0071.03.06.11.008 Thus, if a node can deny the deactivation of a Notification Type, the node MUST implement the Application Status CC. A sending node should be aware that a receiving node may return a response to the Set Command and thus SHOULD apply a back-off timer before sending a subsequent command. + +Pull nodes: + +A sending node MUST set this field to 0x00 to indicate that a persistent Notification for the specified Notification Type MUST be cleared in the receiving node’s queue. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.05-notification-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.05-notification-get-command.md similarity index 52% rename from docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.05-notification-get-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.05-notification-get-command.md index 01d8865..8a6e9b0 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.05-notification-get-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.05-notification-get-command.md @@ -1,31 +1,31 @@ -# 4.63.5 Notification Get Command +# 4.74.5 Notification Get Command Push nodes: -This command is used to request if the unsolicited transmission of a specific Notification Type is enabled. Some supporting nodes will also advertise a current state in response to this command. +This command is used to request if the unsolicited transmission of a specific Notification Type is enabled. + +Some supporting nodes will also advertise a current state in response to this command. Pull nodes: This command is used to retrieve the next Notification from the receiving node’s queue. -[The Notification Report Command MUST be returned in response to this command unless this command](04.63.06-notification-report-command.md#4636-notification-report-command) is to be ignored. Refer to the fields description. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. +The Notification Report Command MUST be returned in response to this command unless this command is to be ignored. Refer to the fields description. This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = NOTIFICATION GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| V1 Alarm Type | | | | | | | | | | | | | | | | | | | | | | | | -| Notification Type | | | | | | | | | | | | | | | | | | | | | | | | -| Notification Event / State | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = NOTIFICATION GET _ | | | | | | | | +| V1 Alarm Type | | | | | | | | +| Notification Type | | | | | | | | +| Notification Event / State | | | | | | | | V1 Alarm Type (8 bits) @@ -33,15 +33,19 @@ The use of this field depends on the V1 Alarm field advertised in the Alarm Type A sending node MAY specify a V1 Alarm Type if the receiving node supports the actual alarm type. A sending node MUST specify the value 0x00 if the receiving node does not support V1 alarms. -[The receiving node behavior SHOULD comply with Table 81 and Table 82.](04.63.02-compatibility-considerations.md#46327-version-4-deprecated) Notification Type (8 bits) +[The receiving node behavior SHOULD comply with Table 87 and Table 88.](04.74.02-compatibility-considerations.md#47427-version-4-deprecated) CC:0071.03.04.12.001 + +Notification Type (8 bits) -[This field is used to specify a Notification Type. Assigned values are defined in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) +[This field is used to specify a Notification Type. Assigned values are defined in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) -This field MUST be set to a Notification Type that is supported by the receiving node or to 0xFF. A receiving node MUST ignore the command if this field is different than 0xFF and set to a non- supported Notification Type. +This field MUST be set to a Notification Type that is supported by the receiving node or to 0xFF. + +A receiving node MUST ignore the command if this field is different than 0xFF and set to a non- supported Notification Type. Push nodes: -The value 0xFF indicates to the receiving node that it MUST select a supported Notification Type and SHOULD advertise the current state of one of its state variables within the chosen Notification Type. CC:0071.03.04.12.002 +The value 0xFF indicates to the receiving node that it MUST select a supported Notification Type and SHOULD advertise the current state of one of its state variables within the chosen Notification Type. A supported Notification Type value indicates that the receiving node MUST advertise the unsolicited transmission status for the requested Notification Type and MAY advertise the current state of one of its state variables within the Notification Type. @@ -49,11 +53,9 @@ Pull nodes: The value 0xFF indicates to the receiving node that it MUST retrieve the next Notification in its queue. -A Notification Type value indicates to the receiving node that it SHOULD retrieve the next Notification in its Notification queue matching the specified Notification Type value. - -Notification Event / State (8 bits) +A Notification Type value indicates to the receiving node that it SHOULD retrieve the next Notification in its Notification queue matching the specified Notification Type value. Notification Event / State (8 bits) -This field is used to optionally specify a Notification Event/State within the Notification Type. Assigned [values are defined in [18]. This field allows receiving nodes to differentiate between V2 Alarm Get](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) Command and V3 or newer Notification Get Command. +This field is used to optionally specify a Notification Event/State within the Notification Type. Assigned [values are defined in [18]. This field allows receiving nodes to differentiate between V2 Alarm Get](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) Command and V3 or newer Notification Get Command. If the Notification Type is set to 0xFF, this field MUST be set to 0x00 by a sending node and SHOULD be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.06-notification-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.06-notification-report-command.md new file mode 100644 index 0000000..8622858 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.06-notification-report-command.md @@ -0,0 +1,161 @@ + +# 4.74.6 Notification Report Command + +Push nodes: + +This command is used for two purposes: + + If this command is returned in response to a Notification Get Command, this command advertises if the unsolicited transmission of the advertised Notification Type is enabled and optionally advertises a currently active state.  If this command is sent unsolicited, it advertises an event or state Notification. + +The use of the command’s fields is the same in both cases. Pull nodes: + +This command is used by a sending node to return a Notification from its queue or indicate that its queue is empty. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = NOTIFICATION REPORT _ | | | | | | | | +| V1 Alarm Type | | | | | | | | +| V1 Alarm Level | | | | | | | | +| Reserved | | | | | | | | +| Notification Status | | | | | | | | +| Notification Type | | | | | | | | +| Notification Event / State | | | | | | | | +| Sequence | Reserved | | Event / State Parameters Length | | | | | +| Event /State Parameter 1 (optional) | | | | | | | | +| ... | | | | | | | | +| Event / State Parameter N (optional) | | | | | | | | +| Sequence Number (optional) | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +V1 Alarm Type (8 bits) & V1 Alarm Level (8 bits) + +These fields carry the proprietary Alarm Type and Alarm Level fields originally introduced with Alarm Command Class, Version 1. V1 Alarm Type and V1 Alarm Level fields MUST be specified in the product CC:0071.03.05.11.002 manual. + +If the V1 Alarm Type is not supported, these fields MUST be set to 0x00. + +Notification Status (8 bits) + +Push nodes: + +This field is used to advertise the status of the Notification Type indicated in this command. + +[This field MUST comply with Table 93.](04.74.06-notification-report-command.md#4746-notification-report-command) + +Table 93, Notification Report::Notification Status (push nodes) + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Unsolicited transmissions are disabled for the specified Notification Type | 2 | +| 0xFF | Unsolicited transmissions are enabled for the specified Notification Type | 2 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Pull nodes: + +This field is used to advertise the status of the sending node’s Notification queue. + +[This field MUST comply with Table 94](04.74.06-notification-report-command.md#4746-notification-report-command) + +Table 94, Notification Report::Notification Status (pull nodes) + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | This command carries a valid Notification returned from the queue. There may be more Notifications queued up. This Notification MAY be persistent. | 2 | +| 0xFE | This command does not carry any valid Notification and the event queue is empty | 3 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Notification Type (8 bits) + +[This field is used to advertise the Notification Type. Assigned values are defined in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +A sending node MUST set this field to the Notification Type of the actual Notification. + +Notification Event / State (8 bits) + +This field is used to specify a Notification Event/State for the advertised Notification Type. Assigned [values are defined in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +A node advertising a Notification MUST set this field to the actual Notification event/state. + +Sequence (1 bit) + +This field is used to advertise the presence of the “Sequence Number” field. + +The value 0 MUST indicate that no “Sequence Number” field is appended after the “Event / State Parameter” field. The value 1 MUST indicate that a “Sequence Number” field is appended after the “Event / State Parameter” field. + +Event / State Parameters Length (5 bits) + +This field is used to advertise the length in bytes of the Event / State Parameters field. + +The value 0 MUST indicate that no Event / State Parameter field is appended after the Event Parameters Length field. Values in the range 1..31 MUST indicate the length of the Event / State Parameter field appended after the Event / State Parameters Length field. + +Event / State Parameter (N bytes) + +The Event / State Parameter field is used to specify associated parameters to a Notification. [Parameters for each Event/State Notification are defined in [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +This field MAY carry an encapsulated command. In this case, the field MUST include the complete CC:0071.03.05.11.00C command structure, i.e. Command Class, Command and all mandatory command fields. + +If a node encapsulates a command in this field, the corresponding Command Class MUST be supported by the node and advertised in the Node Information Frame (NIF) or S0/S2 Supported Command Report. + +This field MUST be omitted if the “Event Parameter Length” field is set to 0. + +[4.74.6.1 provides an example of Event Parameter encapsulation.](04.74.06-notification-report-command.md#47461-event-state-parameter-encapsulation) + +Sequence Number (8 bits) + +This field is used to advertise a sequence number for the actual Notification. This command MAY carry a Sequence Number field. + +This field MUST be omitted if the Sequence flag is set to 0. + +The first sequence number for each distinct Notification MUST be 1. A sending node MUST increment the sequence number for a Notification each time it issues a Notification Report for that given Notification. + +The Sequence Number range MUST be in the range 0..255. The value after 255 MUST be 0. + +Example: + +1. Notification {Smoke Alarm::Smoke Detected}, …, Seq. Number = 254 2. Notification {Smoke Alarm::Smoke Detected}, …, Seq. Number = 255 3. Notification {Heat Alarm::Overheat Detected}, …, Seq. Number = 6 4. Notification {Smoke Alarm::Smoke Detected}, …, Seq. Number = 0 5. Etc. + +## 4.74.6.1 Event / State parameter encapsulation + +Event / State parameter encapsulation of commands MUST comprise the entire command, starting from the Command Class identifier. + +For example, a “User Code Report” is used as Event / State Parameter in a “Keypad Lock/Unlock Operation”. The “User Code Report” has the following format: + + Command Class = = 0x63 COMMAND_CLASS_USER_CODE  Command = = 0x03 USER_CODE_REPORT  User Identifier = 0x01  User ID Status = 0x01  User Code = 0x30, 0x30, 0x30, 0x30 + +The complete User Code Report therefore comprises the following Bytes: [0x63, 0x03, 0x01, 0x01, 0x30, 0x30, 0x30, 0x30]. + +[Another example with the Node naming and location Command class is given in Table 95.](04.74.06-notification-report-command.md#47461-event-state-parameter-encapsulation) Table 95, Notification Report::Event / State parameter encapsulation (example) + +| Notification Report Command fields | | Value | Explanation | +| --- | --- | --- | --- | +| 1 | COMMAND CLASS NOTIFICATION _ _ | 0x71 | Notification CC id | +| 2 | NOTIFICATION REPORT _ | 0x05 | Notification Report command id | +| 3 | V1 Alarm Type | 0x00 | Not implemented | +| 4 | V1 Alarm Level | 0x00 | Not implemented | +| 5 | Reserved | 0x00 | Reserved field | +| 6 | Notification Status | 0xFF | Unsolicited report is activated | +| 7 | Notification Type | 0x01 | Smoke Alarm | +| 8 | Notification Event | 0x01 | Smoke Detected | +| 9 | Sequence Number / Event Parameters Length | 0x1A | Sequence Number is appended / Event Parm Length = 10 | +| 10 | Event Parm 1 | 0x77 | Node Naming & Location CC id | +| 11 | Event Parm 2 | 0x06 | Node Location Report command id | +| 12 | Event Parm 3 | 0x00 | Cmd Parm: Char = ASCII | +| 13 | Event Parm 4 | 0x4B | Cmd Parm: Node Location Char 1 = K | +| 14 | Event Parm 5 | 0x49 | Cmd Parm: Node Location Char 2 = I | +| 15 | Event Parm 6 | 0x54 | Cmd Parm: Node Location Char 3 = T | +| 16 | Event Parm 7 | 0x43 | Cmd Parm: Node Location Char 4 = C | +| 17 | Event Parm 8 | 0x48 | Cmd Parm: Node Location Char 5 = H | +| 18 | Event Parm 9 | 0x45 | Cmd Parm: Node Location Char 6 = E | +| 19 | Event Parm 10 | 0x4E | Cmd Parm: Node Location Char 7 = N | +| 20 | Sequence Number | 0x0F | Sequence Number = 15 | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.07-notification-supported-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.07-notification-supported-get-command.md similarity index 57% rename from docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.07-notification-supported-get-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.07-notification-supported-get-command.md index 5015f00..76bf849 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.07-notification-supported-get-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.07-notification-supported-get-command.md @@ -1,11 +1,11 @@ -# 4.63.7 Notification Supported Get Command +# 4.74.7 Notification Supported Get Command This command is used to request supported Notification Types. @@ -13,7 +13,7 @@ The Notification Supported Report Command MUST be returned in response to this c This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = NOTIFICATION SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = NOTIFICATION SUPPORTED GET _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.08-notification-supported-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.08-notification-supported-report-command.md new file mode 100644 index 0000000..5a1139f --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.08-notification-supported-report-command.md @@ -0,0 +1,47 @@ + +# 4.74.8 Notification Supported Report Command + +This command is used to advertise supported Notification Types. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = NOTIFICATION SUPPORTED REPORT _ _ | | | | | | | | +| V1 Alarm | Reserved | | Number of Bit Masks | | | | | +| Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Bit Mask N | | | | | | | | + +V1 Alarm (1 bit) + +This field is used to indicate if the node implements proprietary Alarms from version 1. + +The value 0 MUST indicate that the device implements only Notification CC V2 or newer Notification Types. The value 1 MUST indicate that the device implements Notification CC V2 Notification Types as well as proprietary Alarm CC V1 Alarm Types and Alarm Levels. + +Number of Bit Masks (5 bits) + +This field MUST advertise the length in bytes of the Bit Mask field. The value MUST be in the range 1..31. Bit Mask (N bytes) + +The Bit Mask field describes the supported Notification Types by the node. The length of this field in CC:0071.03.08.11.004 bytes MUST match the value advertised in the Number of Bit Masks field. + + Bit 0 in Bit Mask 1 is not allocated to any Notification Type and MUST be set to zero. + + Bit 1 in Bit Mask 1 indicates if Notification Type = Smoke Alarm (0x01) is supported. + + Bit 2 in Bit Mask 1 indicates if Notification Type = CO Alarm (0x02) is supported. + + Bit 3 in Bit Mask 1 indicates if Notification Type = CO Alarm (0x03) is supported 2 + + … + +[For Notification Types, refer to [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If the Notification Type is supported, the corresponding bit MUST be set to 1. If the Notification Type is not supported, the corresponding bit MUST be set to 0. + +The Notification Type values 0x00 and 0xFF are special-purpose values. Reserved values and special- purpose values MUST NOT be advertised in the Bit Mask field by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.09-event-supported-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.09-event-supported-get-command.md new file mode 100644 index 0000000..d1949ed --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.09-event-supported-get-command.md @@ -0,0 +1,26 @@ + +# 4.74.9 Event Supported Get Command + +This command is used to request the supported Notifications for a specified Notification Type. + +The Event Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The CC:0071.03.01.11.003 Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = EVENT SUPPORTED GET _ _ | | | | | | | | +| Notification Type | | | | | | | | + +Notification Type (8 bits) + +[For Notifications Types, refer to [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +If a node receives an unsupported Notification Type or a special-purpose value, the receiving node MUST respond with Event Supported Report Command with the Notification Type specified in the this command and the Number of Bit Masks field set to 0. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.10-event-supported-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.10-event-supported-report-command.md new file mode 100644 index 0000000..b193635 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/04.74.10-event-supported-report-command.md @@ -0,0 +1,52 @@ + +# 4.74.10 Event Supported Report Command + +This command is used to advertise supported events/states for a specified Notification Type. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | +| Command = EVENT SUPPORTED REPORT _ _ | | | | | | | | +| Notification Type | | | | | | | | +| Reserved | | | Number of Bit Masks | | | | | +| Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Bit Mask N | | | | | | | | + +Notification Type (8 bits) + +[For Notifications Types, refer to [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Number of Bit Masks (5 bits) + +This field is used to advertise the length (in bytes) of the Bit Mask field. + +The value MUST be in the range 0..31. The value 0 MUST indicate that the Notification Type is not supported. + +Bit Mask (N bytes) + +This field is used to advertise the supported Events/States for the actual advertised Notification Type. The length of this field (in bytes) MUST match the value advertised in the Number of Bit Masks field. CC:0071.03.02.11.002 This field MUST be omitted if the “Number of Bit Masks” field is set to 0. + +The bit value ‘1’ MUST indicate that the actual Event/State is supported. The bit value ‘0’ MUST indicate that the actual Event/State is not supported. + +Example: Notification Type = Heat Alarm (0x04): + + Bit 0 in Bit Mask 1 field is not allocated to any event and must therefore be set to zero. + + Bit 1 in Bit Mask 1 field indicates support for Overheat detected (0x01). + + Bit 2 in Bit Mask 1 field indicates support for Overheat, unknown loc. (0x02). + + Bit 3 in Bit Mask 1 field indicates support for Rapid temp rise (0x03). + + … + +[For Notification Types and their Events/States, refer to [18].](../04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +The Event/State values 0x00 and 0xFE are special-purpose values. Reserved values and special-purpose CC:0071.03.02.11.004 values MUST NOT be advertised in the Bit Mask field by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/index.md new file mode 100644 index 0000000..fd57e85 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.74-notification-command-class-version-3-8/index.md @@ -0,0 +1,29 @@ + +# 4.74 Notification Command Class, version 3-8 + +THIS COMMAND CLASS VERSIONS 3-7 HAVE BEEN DEPRECATED + +A device MAY implement version 3 to 7, but it is RECOMMENDED that new implementations comply CC:0071.03.00.12.001 with Notification Command Class, version 8 + +Pull Mode has been deprecated; it is RECOMMENDED that new implementations support Push Mode + +The Notification Command Class is used to advertise events or states, such as movement detection, door open/close or system failure. The Notification Command Class supersedes the Alarm Command Class. + +## Contents + +- [4.74.1 Terminology](04.74.01-terminology.md) +- [4.74.2 Compatibility considerations](04.74.02-compatibility-considerations.md) +- [4.74.3 Interoperability considerations](04.74.03-interoperability-considerations.md) +- [4.74.4 Notification Set Command](04.74.04-notification-set-command.md) +- [4.74.5 Notification Get Command](04.74.05-notification-get-command.md) +- [4.74.6 Notification Report Command](04.74.06-notification-report-command.md) +- [4.74.7 Notification Supported Get Command](04.74.07-notification-supported-get-command.md) +- [4.74.8 Notification Supported Report Command](04.74.08-notification-supported-report-command.md) +- [4.74.9 Event Supported Get Command](04.74.09-event-supported-get-command.md) +- [4.74.10 Event Supported Report Command](04.74.10-event-supported-report-command.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.75-prepayment-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.75-prepayment-command-class-version-1.md new file mode 100644 index 0000000..b9f158e --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.75-prepayment-command-class-version-1.md @@ -0,0 +1,143 @@ + +# 4.75 Prepayment Command Class, version 1 + +The Prepayment Command Class defines the Commands necessary to implement a Z-Wave encapsulation of Prepayment data and to distribute prepayment information between devices + +## 4.75.1 Prepayment Balance Get Command + +This command is used to request the balance of the Prepayment. + +The Prepayment Balance Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | | +| Command = PREPAYMENT BALANCE GET _ _ | | | | | | | | | +| Balance Type | | | Reserved | | | | | | + +Balance Type (2 bits) + +The field specifies which balance type is requested in the response report. The available balance types may be requested using the Prepayment Supported Get Command. + +Table 96, Prepayment Balance Get::Balance Type encoding + +| Value | Balance Type | +| --- | --- | +| 0x00 | Utility Balance | +| 0x01 | Monetary Balance | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.75.2 Prepayment Balance Report Command + +This command is used to report the current balances. + +The report includes the following main elements: + + Balance  Debt  Emergency Credit + +The elements MAY be given in monetary values or in utility units depending on the Balance Type field. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | +| Command = PREPAYMENT BALANCE REPORT _ _ | | | | | | | | +| Balance Type | | Meter type | | | | | | +| Balance Precision | | | Scale | | | | | +| Balance Value 1 | | | | | | | | +| Balance Value 2 | | | | | | | | +| Balance Value 3 | | | | | | | | +| Balance Value 4 | | | | | | | | +| Debt Precision | | | Reserved | | | | | +| Debt 1 | | | | | | | | +| Debt 2 | | | | | | | | +| Debt 3 | | | | | | | | +| Debt 4 | | | | | | | | +| Emer. Credit Precision | | | Reserved | | | | | +| Emer. Credit 1 | | | | | | | | +| Emer. Credit 2 | | | | | | | | +| Emer. Credit 3 | | | | | | | | +| Emer. Credit 4 | | | | | | | | +| Currency 1 | | | | | | | | +| Currency 2 | | | | | | | | +| Currency 3 | | | | | | | | +| Debt Recovery Percentage | | | | | | | | + +Balance Type (2 bits) + +The field specifies which type of balance is given in the report. + +[All available Balance Types may be found in the section 4.75.1 Prepayment Balance Get Command.](04.75-prepayment-command-class-version-1.md#4751-prepayment-balance-get-command) + +Meter Type (6 bits) + +Meter Type specifies the type of metering device the command originates. This field MUST be encoded [according to the Meter Types defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Scale (5 bits) + +The Scale used to indicate the scale (unit) of the balance, debt and emergency credit value in the report. Scale field only used for a report of type “Utility Balance”, for other reports set the scale to 0x1F. The Scale parameter is of the variable type Meter Scale [; refer to 4.62.13 Meter Table Current Data](04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md#46213-meter-table-current-data-report-command) Report Command. + +Currency (3 bytes) + +This field advertises the currency code. Reports of the type “Monetary Balance” MUST advertise currency codes complying with ISO 4217. Other report types MUST advertise a currency code of “XXX”. + +Table 97, Prepayment Balance Report::Currency examples + +| Currency Code | Currency 1 | Currency 2 | Currency 3 | +| --- | --- | --- | --- | +| Pound sterling (ISO 4217) | G | B | P | +| US Dollar (ISO 4217) | U | S | D | +| No Currency | X | X | X | + +Balance, Debt and Emergency Credit Precision (3 bits) + +The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Balance, Debt and Emergency Credit (32 bits) + +The Balance, Debt and Emergency Credit fields MUST be encoded as 32-bit signed integers. The first [byte MUST carry most significant byte. Table 10, Signed field encoding (two’s complement representation) shows signed decimal values together with their hexadecimal equivalents.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) + +Debt Recovery Percentage (8 bits) + +The Debt Recovery Percentage indicates the percentage of the payment that is for debt recovery. This can take the value from 0 – 50%, the value is always given with a precision of 0 decimal places. The value 0xFF indicates that this field is unspecified. + +This field is only used for only used for a report of type “Monetary Balance”. For other reports this field MUST be set to 0xFF (unspecified). + +## 4.75.3 Prepayment Supported Get Command + +The Prepayment Supported Get Command is used to request type of Balance Reports that are available in the device. + +The Prepayment Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | +| Command = PREPAYMENT SUPPORTED GET _ _ | | | | | | | | + +## 4.75.4 Prepayment Supported Report Command + +The Prepayment Supported Report Command reports the types of Balance Reports that are available in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | +| Command = Command = PREPAYMENT SUPPORTED REPORT _ _ | | | | | | | | +| Reserved | | | | Bit Mask Balance Types Supported | | | | + +Bit Mask - Balance Types Supported (8 bits) + +The Bit Mask - Balance Types Supported byte describes the type of Balance Reports that are available in the device. + +Bit 0 in Bit Mask is used to indicate if the Balance Report Type “Utility Balance” is supported, 0 indicating not supported and 1 indicating supported. Bit 1 in the Bit Mask is used to indicate if the Balance Report Type “Monetary Balance” is available in the device, 0 indicating not supported and 1 indicating supported. + +[All available Balance Types may be found in the section 4.75.1 Prepayment Balance Get Command.](04.75-prepayment-command-class-version-1.md#4751-prepayment-balance-get-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.76-prepayment-encapsulation-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.76-prepayment-encapsulation-command-class-version-1.md new file mode 100644 index 0000000..56faa4a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.76-prepayment-encapsulation-command-class-version-1.md @@ -0,0 +1,26 @@ + +# 4.76 Prepayment Encapsulation Command Class, version 1 + +The Prepayment Encapsulation Command Class is used to smartcard preinstalled security mechanisms. + +## 4.76.1 Prepayment Encapsulation Command + +This command is used to encapsulate Smart card related data communication (e.g. between a Card reader and Meter), allowing the smartcard preinstalled security mechanisms to be applied transparently to Z-Wave. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PREPAYMENT ENCAPSULATION _ _ _ | | | | | | | | +| Command = CMD ENCAPSULATION _ | | | | | | | | +| Data 1 | | | | | | | | +| ... | | | | | | | | +| Data N | | | | | | | | + +Data (N bytes) + +This field contains prepayment smart card data. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.77-proprietary-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.77-proprietary-command-class-version-1-deprecated.md new file mode 100644 index 0000000..a4b030c --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.77-proprietary-command-class-version-1-deprecated.md @@ -0,0 +1,64 @@ + +# 4.77 Proprietary Command Class, version 1 [DEPRECATED] + +THIS COMMAND CLASS HAS BEEN DEPRECATED + +A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Manufacturer Proprietary Command Class. If implementing this command class, it is RECOMMENDED that the Manufacturer Proprietary Command Class is also implemented. The Proprietary Command Class is used to transfer data between devices. The data content MUST be vendor specific and commands MUST NOT provide any value-add with respect to the Home Automation application in general. + +## 4.77.1 Proprietary Set Command + +This command is used to transfer data to a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROPRIETARY _ _ | | | | | | | | +| Command = PROPRIETARY SET _ | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | + +Data (N bytes) + +The data fields may be used to set various data in the device. The number of data fields transmitted MUST be determined from the length field in the frame. + +## 4.77.2 Proprietary Get Command + +This command is used to request data from a device. + +The Proprietary Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROPRIETARY _ _ | | | | | | | | +| Command = PROPRIETARY GET _ | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | + +Data (N bytes) + +Refer to explanation under the Proprietary Set Command. + +## 4.77.3 Proprietary Report Command + +This command is used to retrieve various data from a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROPRIETARY _ _ | | | | | | | | +| Command = PROPRIETARY REPORT _ | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | + +Data (N bytes) + +Refer to explanation under the Proprietary Set Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.78-protection-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.78-protection-command-class-version-1.md new file mode 100644 index 0000000..65e772d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.78-protection-command-class-version-1.md @@ -0,0 +1,61 @@ + +# 4.78 Protection Command Class, version 1 + +The Protection Command Class version 1 used to protect a device against unintentional control by e.g. a child. + +## 4.78.1 Protection Set Command + +This command is used to set the protection state in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION SET _ | | | | | | | | +| Protection State | | | | | | | | + +Protection State (8 bits) + +The Protection State field used to set the protection state of the device. Table 98, Protection Set::Protection State encoding + +| Protection State | Description | +| --- | --- | +| 0x00 | Unprotected - The device is not protected, and may be operated normally via the user interface. | +| 0x01 | Protection by sequence - The device is protected by altering the way the device normally is operated into a more complicated sequence of actions, e.g. if a device normally is controlled by a single press of a button on the device it might be changed to require 3 rapid presses on a button to control it. | +| 0x02 | No operation possible - It is not possible at all to control a device directly via the user interface. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Control via Z-Wave is always possible independently of the protection state. + +## 4.78.2 Protection Get Command + +This Command is used to request the protection state from a device. + +The Protection Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION GET _ | | | | | | | | + +## 4.78.3 Protection Report Command + +This command is used to report the protection state of a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION REPORT _ | | | | | | | | +| Protection State | | | | | | | | + +Protection State (8 bits) + +Refer to explanation under Protection Get Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.79-protection-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.79-protection-command-class-version-2.md new file mode 100644 index 0000000..98df767 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.79-protection-command-class-version-2.md @@ -0,0 +1,210 @@ + +# 4.79 Protection Command Class, version 2 + +The Protection Command Class version 2 is extended to specify whether a device may be controlled via RF Commands or not. When a video recorder is powered by an outlet that can be controlled by RF the user would like to prevent the video recorder from being turned off when it is recording her/his favorite show. In this case the Protection Command Class version 2 may be used to protect the outlet from being turned off by setting the outlet in “No RF Control” state. + +The following Commands have been added or changed in version 2. The Commands not mentioned remain unchanged. + +This Command Class is intended for convenience applications. The Command Class SHOULD NOT be used for safety critical applications. + +## 4.79.1 Protection Set Command + +This command is used to set the protection state in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION SET _ | | | | | | | | +| Reserved | | | | Local Protection State | | | | +| Reserved | | | | RF Protection State | | | | + +Local Protection State (4 bits) + +The Local Protection State field used to set the protection state of the device. Table 99, Protection Set::Local Protection State encoding + +| Local Protection State | Description | +| --- | --- | +| 0 | Unprotected - The device is not protected, and may be operated normally via the user interface. | +| 1 | Protection by sequence - The device is protected by altering the way the device normally is operated into a more complicated sequence of actions, e.g. if a device normally is controlled by a single press of a button on the device it might be changed to require 3 rapid presses on a button to control it. | +| 2 | No operation possible - It is not possible at all to control a device directly via the user interface. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Note: Local Protection can only protect a device from “normal operation”. This means only the operation that is intended by the application of the device. It is NOT allowed to protect the device from network functionalities. The device cannot be protected from being put into learn mode nor from sending out the NIF. + +RF Protection State (4 bits) + +The RF Protection State field used to set the RF protection state of the device. In the case where a device set into a RF Protection State which instructs the device not to answer to a “normal operation” Command, the device MUST return the Application Rejected Request Command (Status = 0) of the Application Status Command Class. Refer to the Application Status Command Class. + +Table 100, Protection Set::RF Protection State + +| RF Protection State | Description | +| --- | --- | +| 0 | Unprotected - The device MUST accept and respond to all RF Commands. | +| 1 | No RF control - all runtime Commands are ignored by the device. The device MUST still respond with status on requests. | +| 2 | No RF response at all. The device will not even reply to status requests. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Note: – It is only possible to un-protect the device with the Protection Set Command. It is not allowed ignore Protection Commands. If a device is excluded from the network, the protection states MUST be reset. + +## 4.79.2 Protection Report Command + +This command is used to report the protection state of a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION REPORT _ | | | | | | | | +| Reserved | | | | Local Protection State | | | | +| Reserved | | | | RF Protection State | | | | + +[For field description, refer to 4.79.1 Protection Set Command.](04.79-protection-command-class-version-2.md#4791-protection-set-command) + +## 4.79.3 Protection Supported Get Command + +This command is used to query supported protection capabilities. + +The Protection Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION SUPPORTED GET _ _ | | | | | | | | + +## 4.79.4 Protection Supported Report Command + +This command is used to advertise supported protection capabilities. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION SUPPORTED REPORT _ _ | | | | | | | | +| Reserved | | | | | | Exclusive Control | Timeout | +| Local Protection State Byte 1 | | | | | | | | +| Local Protection State Byte 2 | | | | | | | | +| RF Protection State Byte 1 | | | | | | | | +| RF Protection State Byte 2 | | | | | | | | + +Local Protection State Byte (2 bytes) + +[The list of all Local Protection States may be found in section 4.79.1. The two bytes MUST be](04.79-protection-command-class-version-2.md#4791-protection-set-command) interpreted as bit masks where byte 1 bit 0 represent Local Protection State 0, byte 1 bit 1 represent Protection State 1, byte 2 bit 0 represent Protection State 8 etc. + +RF Protection State Byte (2 bytes) + +[The list of all RF Protection States may be found in section 4.79.1. The two bytes MUST be interpreted](04.79-protection-command-class-version-2.md#4791-protection-set-command) as bit masks where byte 1 bit 0 represent RF Protection State 0, byte 1 bit 1 represent Protection State 1, byte 2 bit 0 represent Protection State 8 etc. + +Exclusive Control (1 bit) + +When this bit is set to 1 the device support Exclusive Control. When Exclusive Control is supported the device MUST support the Commands Protection Exclusive Control Set, Get and Report described below. + +Timeout (1 bit) + +When this bit is set to 1 the device supports a timeout for RF Protection State. When the timeout is supported the device MUST support the Commands Protection Timeout Set, Get and Report described below. + +## 4.79.5 Protection Exclusive Control + +The Protection Exclusive Control is an optional feature. The Commands in this chapter can only be implemented if the device supporting Protection Command Class version 2 announces support for Exclusive Control in the Protection Supported Report Command. + +### 4.79.5.1 Protection Exclusive Control Set Command + +This command is used to set the NodeID of a Z-Wave device that can override the protection state in a protected device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION EC SET _ _ | | | | | | | | +| NodeID | | | | | | | | + +NodeID + +The NodeID that has exclusive control can override the RF protection state of the device and can control it regardless of the protection state. Commands from any other nodes in the network may be restricted by the RF protection state. In that case, the Application Rejected Request Command MUST be returned. + +All of the Protection Command Class commands will be accepted and processed regardless of whether or not a node has exclusive control. Factory default setting of the NodeID for exclusive control MUST be set to 0. To reset the exclusive control state in a device an Exclusive Control Set Command with NodeID 0 as parameter MUST be send to the device. + +### 4.79.5.2 Protection Exclusive Control Get Command + +This command is used to request a Protection Exclusive Control Report Command from the device. + +The Protection Exclusive Control Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION EC GET _ _ | | | | | | | | + +### 4.79.5.3 Protection Exclusive Control Report Command + +This command is used to return the NodeID of a Z-Wave device that has exclusive control over this device in protection mode. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION EC REPORT _ _ | | | | | | | | +| NodeID | | | | | | | | + +NodeID + +[See description under the Protection Exclusive Control Set Command section 4.79.5.1.](04.79-protection-command-class-version-2.md#47951-protection-exclusive-control-set-command) + +## 4.79.6 Protection Timeout + +The Protection Timeout is an optional feature. The Commands in this section MAY be implemented if the device supporting Protection Command Class version 2 announces support for Timeout in the Protection Supported Report Command. + +### 4.79.6.1 Protection Timeout Set Command + +This command is used to set the timeout for protection mode in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION TIMEOUT SET _ _ | | | | | | | | +| Timeout | | | | | | | | + +Timeout + +The timeout describes the time that a device MUST remain in RF Protection mode. Factory default setting for the Timeout parameter MUST be 0x00. This field MUST be encoded [according to Table 101.](04.79-protection-command-class-version-2.md#47961-protection-timeout-set-command) + +Table 101, Protection Timeout Set::Timeout encoding + +| Timeout | Description | +| --- | --- | +| 0x00 | No timer is set. All “normal operation” Commands MUST be accepted. | +| 0x01-0x3C | Timeout is set from 1 second (0x01) to 60 seconds (0x3C) in 1-second resolution. | +| 0x41-0xFE | Timeout is set from 2 minutes (0x41) to 191 minutes (0xFE) in 1-minute resolution. | +| 0xFF | No Timeout – The Device will remain in RF Protection mode infinitely. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +### 4.79.6.2 Protection Timeout Get Command + +This command is used to request a Protection Timeout Report Command from the device. + +The Protection Timeout Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION TIMEOUT GET _ _ | | | | | | | | + +### 4.79.6.3 Protection Timeout Report Command + +This command is used to return the remaining time that a device will remain in protection mode. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | +| Command = PROTECTION TIMEOUT REPORT _ _ | | | | | | | | +| Timeout | | | | | | | | + +Timeout + +[This field indicates the remaining timeout set in the Node. It MUST be encoded as described in Table 101](04.79-protection-command-class-version-2.md#47961-protection-timeout-set-command) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.80-pulse-meter-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.80-pulse-meter-command-class-version-1-deprecated.md new file mode 100644 index 0000000..6a3414a --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.80-pulse-meter-command-class-version-1-deprecated.md @@ -0,0 +1,44 @@ + +# 4.80 Pulse Meter Command Class, version 1 [DEPRECATED] + +THIS COMMAND CLASS HAS BEEN DEPRECATED + +A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Meter Command Class. If implementing this command class, it is RECOMMENDED that the Meter Command Class is also implemented. + +The Pulse Meter Command Class defines the Commands necessary to implement the pulse meter functionality. The Pulse Meter Command Class is intended for all kinds of meters that generate pulses, such as gas and water meters. + +## 4.80.1 Pulse Meter Get Command + +This command is used to request the number of pulses that has been counted. + +The Pulse Meter Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER PULSE _ _ _ | | | | | | | | +| Command = METER PULSE GET _ _ | | | | | | | | + +## 4.80.2 Pulse Meter Report Command + +This command is used to report the number of pulses detected. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS METER PULSE _ _ _ | | | | | | | | +| Command = METER PULSE REPORT _ _ | | | | | | | | +| Pulse Count 1 | | | | | | | | +| Pulse Count 2 | | | | | | | | +| Pulse Count 3 | | | | | | | | +| Pulse Count 4 | | | | | | | | + +Pulse Count (32 bits) + +The Pulse Count field contains the number of pulses generated by the meter. The first byte is the most significant byte. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.70-rate-table-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.81-rate-table-configuration-command-class-version-1.md similarity index 61% rename from docs/specs/command-class-specification/04-command-class-definitions/04.70-rate-table-configuration-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.81-rate-table-configuration-command-class-version-1.md index 0c31232..b2da949 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.70-rate-table-configuration-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.81-rate-table-configuration-command-class-version-1.md @@ -1,11 +1,11 @@ -# 4.70 Rate Table Configuration Command Class, version 1 +# 4.81 Rate Table Configuration Command Class, version 1 The Rate Table Configuration Command Class defines the parameter sets for a range of rates. @@ -15,23 +15,23 @@ Every rate is described as a combination of time, maximum consumption, maximum d  Time: Time of day. E.g. 7.15am to 9.20am  Maximum Consumption: E.g. 200kWh. This allows the Utility Supplier to provide special rates for ‘utility conserving’ end users.  Maximum Demand: E.g. 4000W. This allows the Utility Supplier to provide special rates for end- users which manages to keep the ‘peak’ demand under ‘control’.  DCP Rate ID: E.g. DCP Rate ID = 16. This allows the Utility Supplier to provide special rates for end-users participating in DCP event with a specific DCP Rate ID. -## 4.70.1 Rate Table Set Command +## 4.81.1 Rate Table Set Command This command adds a rate parameter set to a given rate parameter set identifier. -| | 7 | | | 6 | | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL CONFIG _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | Rate Type | | | | | Number of Rate Char. | | | | | | | | | | | | | | | -| Rate Character 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Character N | | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute 2 | | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL CONFIG _ _ _ _ | | | | | | | | | +| Command = RATE TBL SET _ _ | | | | | | | | | +| Rate Parameter Set ID | | | | | | | | | +| Reserved | | Rate Type | | Number of Rate Char. | | | | | +| Rate Character 1 | | | | | | | | | +| … | | | | | | | | | +| Rate Character N | | | | | | | | | +| Start Hour Local Time | | | | | | | | | +| Start Minute Local Time | | | | | | | | | +| Duration Minute 1 | | | | | | | | | +| Duration Minute 2 | | | | | | | | | The following part of the command is OPTIONAL depending on the parameters supported. Use the Rate Table Supported Get Command to obtain supported parameters beside the default above. A not supported parameter is not included into the command layout. @@ -54,9 +54,11 @@ The following part of the command is OPTIONAL depending on the parameters suppor Rate Parameter Set ID (8 bits) -The Rate Parameter Set ID indicates the requested parameter set. Rate Type (2 bits) +The Rate Parameter Set ID indicates the requested parameter set. -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](04.47-meter-command-class-version-2.md#4475-meter-report-command) +Rate Type (2 bits) + +[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 69.](04.56-meter-command-class-version-2.md#4566-meter-report-command) Reserved @@ -76,9 +78,7 @@ Specify the number of complete hours that have passed since midnight (00..23) in Start Minute Local Time (8 bits) -Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. - -Duration Minute (16 bits) +Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. Duration Minute (16 bits) Specify the duration in minutes (1..1440) since the start in local time. The value 1440 indicates that the parameter set applies the entire day. @@ -88,7 +88,9 @@ The precision field describes what the precision of the value is. The number ind Consumption Scale (5 bits) -The Consumption Scale used to indicate the scale (unit) is applicable for the rate. The Consumption Scale parameter is of the variable type Meter Scale [; refer to 4.52.13 Meter Table Current Data Report](04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) Command. Minimum / Maximum Consumption Value (4 * 8 bits) +The Consumption Scale used to indicate the scale (unit) is applicable for the rate. The Consumption Scale parameter is of the variable type Meter Scale [; refer to 4.62.13 Meter Table Current Data Report](04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md#46213-meter-table-current-data-report-command) Command. + +Minimum / Maximum Consumption Value (4 * 8 bits) The Minimum / Maximum Consumption Value are a 32 bit unsigned field. The first byte is the most significant byte. @@ -100,7 +102,7 @@ The first block from 0 kWh to 200 kWh is charged at 2 USD/kWh and all other unit Rate1: Min Consumption value = 0kWh, Max Consumption Value = 200kWh Rate2: Min Consumption value = 200kWh, Max Consumption Value = 2147483648kWh -NOTE [: The actual charge is set using the Tariff Table Configuration Command Class, version 1.](04.89-tariff-table-configuration-command-class-version-1.md#489-tariff-table-configuration-command-class-version-1) +NOTE: The actual charge is set using the Tariff Table Configuration Command Class, version 1. NOTICE: The device receiving the Rate Table Report MUST show the value even though the Scale is not supported. @@ -110,32 +112,30 @@ The Maximum Demand Precision field describes what the precision of the value is. Max. Demand Scale (5 bits) -The Maximum Demand Scale field describes what unit is applicable for the rate. The Maximum Demand Scale parameter is of the variable type Meter Scale [; refer to 4.52.13 Meter Table Current Data Report](04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) Command. +The Maximum Demand Scale field describes what unit is applicable for the rate. The Maximum Demand Scale parameter is of the variable type Meter Scale [; refer to 4.62.13 Meter Table Current Data](04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md#46213-meter-table-current-data-report-command) Report Command. Max. Demand Value (4 * 8 bits) The Maximum Demand Value is a 32 bit unsigned field. The first byte is the most significant byte. -The maximum demand value 0xFFFFFFFF is reserved and represents an unlimited maximum demand value. - -NOTICE: The device receiving the Rate Table Report MUST show the value even though the Scale is not supported. +The maximum demand value 0xFFFFFFFF is reserved and represents an unlimited maximum demand value. NOTICE: The device receiving the Rate Table Report MUST show the value even though the Scale is not supported. DCP Rate ID (8 bits) The DCP Rate ID addresses the Demand Control Plan parameters, which will overrule other parameter sets defined in the Rate Table Command Class. A DCP Rate ID equal to zero disables Demand Control Plan mapping. -## 4.70.2 Rate Table Remove Command +## 4.81.2 Rate Table Remove Command This command is used to remove rate parameter set(s). -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL CONFIG _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL REMOVE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | Rate Parameter Set IDs | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL CONFIG _ _ _ _ | | | | | | | | +| Command = RATE TBL REMOVE _ _ | | | | | | | | +| Reserved | | Rate Parameter Set IDs | | | | | | +| Rate Parameter Set ID 1 | | | | | | | | +| ... | | | | | | | | +| Rate Parameter Set ID N | | | | | | | | Reserved diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.82-rate-table-monitor-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.82-rate-table-monitor-command-class-version-1.md new file mode 100644 index 0000000..3c7cbb9 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.82-rate-table-monitor-command-class-version-1.md @@ -0,0 +1,392 @@ + +# 4.82 Rate Table Monitor Command Class, version 1 + +The Rate Table Monitor Command Class defines the parameter sets for a range of rates. + +## 4.82.1 Rate Table Supported Get Command + +This command is used to request the number of rates and parameter sets supported by the Rate Table Command Class. + +The Rate Table Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL SUPPORTED GET _ _ _ | | | | | | | | + +## 4.82.2 Rate Table Supported Report Command + +This command is used to advertise the number of rates and parameter sets supported. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = Command = RATE TBL SUPPORTED REPORT _ _ _ | | | | | | | | +| Rates Supported | | | | | | | | +| Parameter Set Supported Bit Mask 1 | | | | | | | | +| Parameter Set Supported Bit Mask 2 | | | | | | | | + +Rates Supported (8 bits) + +Number of rates supported (1..255). Parameter Set Supported Bit Mask 1, 2 (16 bits) + +The Bit Mask field describes the supported parameter set in addition to the default-supported parameter set. The default parameter set comprises of Rate Parameter Set ID, Rate text, Start time and Duration. + +It is possible to extend the default parameter set as follows: + +Table 102, Rate Table Supported Report::Parameter Set Supported Bit Mask encoding + +| Parameter Set Supported | Bit Map | Description | +| --- | --- | --- | +| 1 | Bit 0 | Reserved | +| 1 | Bit 1 | Supports Block tariffs if the bit is 1 and the opposite if 0. Block tariffs assign blocks of energy at a set cost, for example in a two block tariff the first block say from 0 kWh to 200 kWh is charged at X currency per unit(kWh) all other units consumed over 200kWh will be charged at Y currency per unit for the billing period. | +| 1 | Bit 2 | Supports Maximum demand tariffs if the bit is 1 and the opposite if 0. Maximum demand tariffs are based on the maximum load that is measured for example 20kw over an averaging period. The charge is based on the max load; hence a 30kW maximum demand would be more costly than a 20kW maximum demand. | +| 1 | Bit 3 | Supports Subscribed demand tariffs if the bit is 1 and the opposite if 0. This type of tariff is used in France and Italy primarily; the standing charge is calculated from the maximum load, for example 10A = 10 currency/month, 20A = 20 currency / month. | +| 1 | Bit 4 | Supports Demand Control Plan mapping (DCP ID) if the bit is 1 and the opposite if 0. | + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +## 4.82.3 Rate Table Get Command + +This command is used to request the rate parameter set for a given rate parameter set identifier. + +The Rate Table Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL GET _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. + +## 4.82.4 Rate Table Report Command + +This command reports rate parameter set for a given rate parameter set identifier. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL _ _ _ | | | | | | | | | +| Command = RATE TBL REPORT _ _ | | | | | | | | | +| Rate Parameter Set ID | | | | | | | | | +| Reserved | | Rate Type | | Number of Rate Char. | | | | | +| Rate Character 1 | | | | | | | | | +| … | | | | | | | | | +| Rate Character N | | | | | | | | | +| Start Hour Local Time | | | | | | | | | +| Start Minute Local Time | | | | | | | | | +| Duration Minute 1 | | | | | | | | | +| Duration Minute 2 | | | | | | | | | + +The following part of the command is OPTIONAL depending on the parameters supported. Use the Rate Table Supported Get Command to obtain supported parameters beside the default above. A not supported parameter is removed from the command layout. + +| Consumption Precision 1 | Consumption Scale 1 | +| --- | --- | +| Min. Consumption Value 1 | | +| Min. Consumption Value 2 | | +| Min. Consumption Value 3 | | +| Min. Consumption Value 4 | | +| Max. Consumption Value 1 | | +| Max. Consumption Value 2 | | +| Max. Consumption Value 3 | | +| Max. Consumption Value 4 | | +| Max. Demand Precision 1 | Max. Demand Scale 1 | +| Max. Demand Value 1 | | +| Max. Demand Value 2 | | +| Max. Demand Value 3 | | +| Max. Demand Value 4 | | +| DCP Rate ID | | + +[Refer to description of fields under the Rate Table Set Command (section 4.81.1).](04.81-rate-table-configuration-command-class-version-1.md#4811-rate-table-set-command) + +## 4.82.5 Rate Table Active Rate Get Command + +This command is used to retrieve the rate currently active in the meter. + +The Rate Table Active Rate Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL ACTIVE RATE GET _ _ _ _ | | | | | | | | + +## 4.82.6 Rate Table Active Rate Report Command + +This command is used to advertise the rate parameter set ID of the rate currently active in the meter. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL ACTIVE RATE REPORT _ _ _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID of the rate currently active in the meter. + +## 4.82.7 Rate Table Current Data Get Command + +This command is used to request a number of time stamped values (current) in physical units according to the dataset mask. + +The Rate Table Current Data Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL CURRENT DATA GET _ _ _ _ | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Dataset Requested 1 | | | | | | | | +| Dataset Requested 2 | | | | | | | | +| Dataset Requested 3 | | | | | | | | + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. + +Dataset Requested (24 bits) + +The dataset requested parameter indicates which data is requested by the command. This field MUST [be encoded according to the Meter Datasets defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +## 4.82.8 Rate Table Current Data Report Command + +This command is used to report a number of time stamped values (current) in physical units in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL CURRENT DATA REPORT _ _ _ _ | | | | | | | | +| Reports to Follow | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Dataset 1 | | | | | | | | +| Dataset 2 | | | | | | | | +| Dataset 3 | | | | | | | | +| Year 1 | | | | | | | | +| Year 2 | | | | | | | | +| Month | | | | | | | | +| Day | | | | | | | | +| Hour Local Time | | | | | | | | +| Minute Local Time | | | | | | | | +| Second Local Time | | | | | | | | +| Current Precision 1 | | | Current Scale 1 | | | | | +| Current Value 1,1 | | | | | | | | +| Current Value 1,2 | | | | | | | | +| Current Value 1,3 | | | | | | | | +| Current Value 1,4 | | | | | | | | +| … | | | | | | | | +| Current Precision N | | | Current Scale N | | | | | +| Current Value N,1 | | | | | | | | +| Current Value N,2 | | | | | | | | +| Current Value N,3 | | | | | | | | +| Current Value N,4 | | | | | | | | + +Reports to Follow (8 bits) + +This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. + +Dataset (24 bits) + +The dataset parameter indicates which data is included in the report. This field MUST be encoded [according to the Meter Dataset defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. + +Day (8 bits) + +Specify the day of the month between 01 and 31. + +Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00..23) in local time. + +Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. + +Second Local Time (8 bits) + +Specify the number of complete seconds since the start of the minute (00..59) in local time. The value 60 used to keep UTC from wandering away is not supported. + +Precision (N * 3 bits) + +The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Current Scale (N*5 bits) + +The Current Scale is used to indicate the scale (unit) of the following value. This field MUST be encoded [according to the Meter Dataset and Scales defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Current Value (N * 32 bits) + +The Current Value advertises a value corresponding to the Dataset Requested field of the Get Command. The field MUST be encoded as a 32-bit signed integer. The first byte (Value 1) MUST carry [most significant byte. Table 10, Signed field encoding (two’s complement representation) shows signed](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) decimal values together with their hexadecimal equivalents. + +NOTICE: The device receiving the Rate Table Current Data Report MUST show the value even though the Scale is not supported. + +## 4.82.9 Rate Table Historical Data Get Command + +This command is used to request a number of time stamped values (historical) in physical units according to rate type, dataset mask and time interval. + +The Rate Table Historical Data Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL HISTORICAL DATA GET _ _ _ _ | | | | | | | | +| Maximum Reports | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Dataset Requested 1 | | | | | | | | +| Dataset Requested 2 | | | | | | | | +| Dataset Requested 3 | | | | | | | | +| Start Year 1 | | | | | | | | +| Start Year 2 | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour Local Time | | | | | | | | +| Start Minute Local Time | | | | | | | | +| Start Second Local Time | | | | | | | | +| Stop Year 1 | | | | | | | | +| Stop Year 2 | | | | | | | | +| Stop Month | | | | | | | | +| Stop Day | | | | | | | | +| Stop Hour Local Time | | | | | | | | +| Stop Minute Local Time | | | | | | | | +| Stop Second Local Time | | | | | | | | + +Maximum Reports (8 bits) + +The maximum reports parameter is used to indicate the maximum number of reports to return based on the get. Reports are always returned with the most recently recorded value first. If set to 0x00 the meter will return all reports based on the request. + +Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. + +Dataset Requested (24 bits) + +The dataset requested parameters indicate data requested. This field MUST be encoded according to [the Meter Dataset defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Start/Stop Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Start/Stop Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that an accumulated value is not determined yet. + +Start/Stop Day (8 bits) + +Specify the day of the month between 01 and 31. + +Start/Stop Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00..23) in local time. + +Start/Stop Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. + +Start/Stop Second Local Time (8 bits) + +Specify the number of complete seconds since the start of the minute (00..59) in local time. The value 60 used to keep UTC from wandering away is not supported. + +## 4.82.10 Rate Table Historical Data Report Command + +This command is used to report a number of time stamped values (historical) in physical units in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | +| Command = RATE TBL HISTORICAL DATA REPORT _ _ _ _ | | | | | | | | +| Reports to Follow | | | | | | | | +| Rate Parameter Set ID | | | | | | | | +| Dataset 1 | | | | | | | | +| Dataset 2 | | | | | | | | +| Dataset 3 | | | | | | | | +| Year 1 | | | | | | | | +| Year 2 | | | | | | | | +| Month | | | | | | | | +| Day | | | | | | | | +| Hour Local Time | | | | | | | | +| Minute Local Time | | | | | | | | +| Second Local Time | | | | | | | | +| Historical Precision 1 | | | Historical Scale 1 | | | | | +| Historical Value 1,1 | | | | | | | | +| Historical Value 1,2 | | | | | | | | +| Historical Value 1,3 | | | | | | | | +| Historical Value 1,4 | | | | | | | | +| … | | | | | | | | +| Historical Precision N | | | Historical Scale N | | | | | +| Historical Value N,1 | | | | | | | | +| Historical Value N,2 | | | | | | | | +| Historical Value N,3 | | | | | | | | +| Historical Value N,4 | | | | | | | | + +Reports to follow (8 bits) + +This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. Rate Parameter Set ID (8 bits) + +The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. + +Dataset (24 bits) + +The dataset parameter indicates which data is included in the report. This field MUST be encoded [according to the Meter Dataset defined in [21].](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +Year 1, 2 (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. + +Day (8 bits) + +Specify the day of the month between 01 and 31. + +Hour Local Time (8 bits) + +Specify the number of complete hours that have passed since midnight (00..23) in local time. + +Minute Local Time (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. + +Second Local Time (8 bits) + +Specify the number of complete seconds since the start of the minute (00..59) in local time. The value 60 used to keep UTC from wandering away is not supported. + +Historical Precision (N * 3 bits) + +The Historical Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. + +Historical Scale (N * 5 bits) + +The Historical Scale used to indicate the scale (unit) of the following value. The Historical Scale parameter is of the variable type Meter Scale [; refer to 4.62.13 Meter Table Current Data Report](04.62-meter-table-monitor-command-class-version-1/04.62.13-meter-table-current-data-report-command.md#46213-meter-table-current-data-report-command) Command. + +Historical Value (N * 32 bits) + +The Historical Value is a 32 bit signed field defined by dataset requested field. The first byte (Value 1) is the most significant byte. shows signed decimal values together with their hexadecimal equivalents. + +NOTICE: The device receiving the Rate Table Historical Data Report MUST show the value even though the Scale is not supported. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.83-scene-activation-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.83-scene-activation-command-class-version-1.md new file mode 100644 index 0000000..a86ed76 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.83-scene-activation-command-class-version-1.md @@ -0,0 +1,52 @@ + +# 4.83 Scene Activation Command Class, version 1 + +The Scene Activation Command Class used for launching scenes in a number of actuator nodes e.g. another scene-controlling unit, a multilevel switch, a binary switch etc. + +## 4.83.1 Compatibility considerations + +A node supporting this Command Class MUST also support the Scene Actuator Configuration Command Class. + +This command class requires an initial configuration of the scenes to be launched by the Scene Actuator Configuration Set. + +Since a common identifier that is sent out, multicast addressing may be used. Multicast addressing may eliminate the potential popping effect which could be the result if individual Set Commands were send out to a large number of nodes distributed over a vast area. The multicast transmission MUST be followed by individual singlecast transmissions to ensure all the nodes have received the command. + +## 4.83.2 Scene Activation Set Command + +This command is used to activate the setting associated to the scene ID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE ACTIVATION _ _ _ | | | | | | | | +| Command = SCENE ACTIVATION SET _ _ | | | | | | | | +| Scene ID | | | | | | | | +| Dimming Duration | | | | | | | | + +Scene ID (8 bits) + +This field is used to specify the Scene ID that the receiving node MUST activate + +This field MUST be in the range 1..255. + +Dimming Duration (8 bits) + +This field MUST specify the time that the transition from the current level to the target level (indicated by the Scene ID) should take. + +Supporting actuator nodes without duration capabilities MUST ignore this field. + +Supporting actuator nodes with a duration capabilities SHOULD respect the indicated dimming duration to reach the target level. + +[This field MUST be encoded according to Table 103.](04.83-scene-activation-command-class-version-1.md#4832-scene-activation-set-command) Table 103, Scene Activation Set:: Dimming Duration encoding + +| Value | Description | +| --- | --- | +| 0x00 | Instantly | +| 0x01..0x7F | Obtain dimming durations from 1 second (0x01) to 127 seconds (0x7F) in 1-second resolution | +| 0x80..0xFE | Specify dimming durations from 1 minute (0x80) to 127 minutes (0xFE) in 1-minute resolution. | +| 0xFF | Specify dimming duration configured by the Scene Actuator Configuration Set and Scene Controller Configuration Set Command depending on device used. | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.84-scene-actuator-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.84-scene-actuator-configuration-command-class-version-1.md new file mode 100644 index 0000000..ef5f059 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.84-scene-actuator-configuration-command-class-version-1.md @@ -0,0 +1,123 @@ + +# 4.84 Scene Actuator Configuration Command Class, version 1 + +The Scene Actuator Configuration Command Class is used to configure scenes settings for a node supporting an actuator Command Class, e.g. a multilevel switch, binary switch etc. + +## 4.84.1 Compatibility considerations + +A node supporting this Command Class MUST support 255 Scene IDs (Scene ID 1 to 255). The Scene ID 0 MUST NOT be supported.. + +## 4.84.2 Scene Actuator Configuration Set Command + +This command is used to associate the specified scene ID to the defined actuator settings. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE ACTUATOR CONF _ _ _ _ | | | | | | | | +| Command = SCENE ACTUATOR CONF SET _ _ _ | | | | | | | | +| Scene ID | | | | | | | | +| Dimming Duration | | | | | | | | +| Over- ride | Reserved | | | | | | | +| Level | | | | | | | | + +Scene ID (8 bits) + +This field is used to specify the Scene ID to be associated with the current actuator settings. + +This field MUST be in the range 1..255. + +Dimming Duration (8 bits) + +This field MUST specify the time it MUST take to reach the target level associated to the actual Scene ID. A receiving node always starts from current level. The dimming duration MUST be the same independently of the number of levels to be changed. + +Supporting actuator nodes without duration capabilities MUST ignore this field. + +Supporting actuator nodes with duration capabilities SHOULD respect the indicated duration to reach the target level. + +[This field MUST be encoded according to Table 7, Actuator Command Class Duration Set encoding.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) + +Override (1 bit) + +This field is used to specify if the current actuator settings MUST be used as settings for the actual Scene ID. + +If this field is set to 0, the current actuator settings at the supporting nodeMUST be associated to the actual Scene ID. In this case, the Level field MUST be ignored. + +If this field is set to 1, the value indicated by the Level field MUST be associated to the actual Scene ID. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Level (8 bits) + +This field is used to specify the actuator setting that MUST be used as setting for the actual Scene ID. This field MUST correspond and be interpreted as the Value field of the Basic Set Command. i.e. the supporting node receiving a Scene Activation Set for the actual Scene ID specified in this command MUST react as if it had received a Basic Set Command with the Value field set to the value indicated by this field. + +## 4.84.3 Scene Actuator Configuration Get Command + +This command is used to request the settings for a given scene identifier or for the scene currently active. + +The Scene Actuator Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE ACTUATOR CONF _ _ _ _ | | | | | | | | +| Command = SCENE ACTUATOR CONF GET _ _ _ | | | | | | | | +| Scene ID | | | | | | | | + +Scene ID (8 bits) + +This field is used to specify the requested Scene ID settings. Values in the range 1..255 MUST indicate that the receiving node MUST return settings associated to the actual Scene ID.. + +The value 0 MUST indicate that the current active scene (if any). + +## 4.84.4 Scene Actuator Configuration Report Command + +This command is used to advertise the settings associated to a scene identifier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE ACTUATOR CONF _ _ _ _ | | | | | | | | +| Command = SCENE ACTUATOR CONF REPORT _ _ _ | | | | | | | | +| Scene ID | | | | | | | | +| Level | | | | | | | | +| Dimming Duration | | | | | | | | + +Scene ID (8 bits) + +This field is used to specify the actual Scene ID for which the settings are being advertised. + +Values in the range 1..255 MUST indicate an actual Scene ID. + +The value 0 MUST indicate that no scene is currently active at the sending node and no scene setting is advertised in this command. In this case, the Level and Dimming Duration fields SHOULD be ignored. + +Level (8 bits) + +This field is used to advertise the actuator setting that MUST be used by the node when activating the actual Scene ID. + +The value advertised by the sending node MUST correspond to the format of the Value field when returning a Basic Report Command. + +Dimming Duration (8 bits) + +This field MUST specify the time it MUST take to reach the target level associated to the actual Scene ID.. + +Supporting actuator nodes without duration capabilities MUST ignore this field and SHOULD set it to 0x00. + +Supporting actuator nodes with duration capabilities SHOULD respect the indicated duration to reach the target level. + +[This field MUST be encoded according to Table 104.](04.84-scene-actuator-configuration-command-class-version-1.md#4844-scene-actuator-configuration-report-command) Table 104, Scene Actuator Configuration Report::Dimming Duration encoding + +| Dimming Duration | Description | +| --- | --- | +| 0x00 | Instantly | +| 0x01..0x7F | Dimming durations from 1 second (0x01) to 127 seconds (0x7F) in 1-second resolution | +| 0x80..0xFE | Specify dimming durations from 1 minute (0x80) to 127 minutes (0xFE) in 1-minute resolution. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.74-scene-controller-configuration-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.85-scene-controller-configuration-command-class-version-1.md similarity index 57% rename from docs/specs/command-class-specification/04-command-class-definitions/04.74-scene-controller-configuration-command-class-version-1.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.85-scene-controller-configuration-command-class-version-1.md index 883f4cf..00998b3 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.74-scene-controller-configuration-command-class-version-1.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.85-scene-controller-configuration-command-class-version-1.md @@ -1,33 +1,33 @@ -# 4.74 Scene Controller Configuration Command Class, version 1 +# 4.85 Scene Controller Configuration Command Class, version 1 The Scene Controller Configuration Command Class is used to configure nodes launching scenes using their association groups -## 4.74.1 Compatibility Considerations +## 4.85.1 Compatibility Considerations -A node supporting this Command Class MUST support 255 scene IDs. Implemented Scene IDs MUST be in a consecutive range starting from 1. +A node supporting this Command Class MUST support 255 scene IDs (Scene ID 1 to 255). The Scene ID 0 MUST NOT be supported.. A node supporting this Command Class MUST support the Association Command Class, version 1 or newer. A node supporting this Command Class MUST issue Scene Activation Set Command via its association groups. -## 4.74.2 Scene Controller Configuration Set Command +## 4.85.2 Scene Controller Configuration Set Command This command is used to configure settings for a given physical item on the device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE CONTROLLER CONF _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE CONTROLLER CONF SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Group ID | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dimming Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE CONTROLLER CONF _ _ _ _ | | | | | | | | +| Command = SCENE CONTROLLER CONF SET _ _ _ | | | | | | | | +| Group ID | | | | | | | | +| Scene ID | | | | | | | | +| Dimming Duration | | | | | | | | Group ID (8 bits) @@ -43,11 +43,11 @@ This field is used to specify the Scene ID that MUST be associated with the actu Values in the range 1..255 MUST indicate that the receiving node MUST associate the Scene ID and Dimming Duration values to the actual Association Group ID. The supporting node MUST set the Scene ID value indicated by this field in the Scene Activation Set Command when issuing it via the actual Group ID. -The value 0 MUST indicate that the receiving node MUST disable an associated scene for the specified Group ID. Dimming Duration (8 bits) +The value 0 MUST indicate that the receiving node MUST disable an associated scene for the specified Group ID. -This field is used to specify what value the supporting node MUST set in the Dimming Duration field of the Scene Activation Set Command when issuing it via the actual Group ID. +Dimming Duration (8 bits) This field is used to specify what value the supporting node MUST set in the Dimming Duration field of the Scene Activation Set Command when issuing it via the actual Group ID. -## 4.74.3 Scene Controller Configuration Get Command +## 4.85.3 Scene Controller Configuration Get Command This command is used to request the settings for a given association grouping identifier or the active settings. @@ -55,11 +55,11 @@ The Scene Controller Configuration Report Command MUST be returned in response t This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE CONTROLLER CONF _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE CONTROLLER CONF GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Group ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE CONTROLLER CONF _ _ _ _ | | | | | | | | +| Command = SCENE CONTROLLER CONF GET _ _ _ | | | | | | | | +| Group ID | | | | | | | | Group ID (8 bits) @@ -71,17 +71,17 @@ The value 0 MUST indicate that the receiving node MUST return the currently acti A node receiving a non-supported group or having no currently active Group Identifier SHOULD return a report for Group ID 0. -## 4.74.4 Scene Controller Configuration Report Command +## 4.85.4 Scene Controller Configuration Report Command This command is used to advertise the current scene controller settings. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE CONTROLLER CONF _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE CONTROLLER CONF REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Group ID | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dimming Duration | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCENE CONTROLLER CONF _ _ _ _ | | | | | | | | +| Command = SCENE CONTROLLER CONF REPORT _ _ _ | | | | | | | | +| Group ID | | | | | | | | +| Scene ID | | | | | | | | +| Dimming Duration | | | | | | | | Group ID (8 bits) @@ -91,7 +91,9 @@ Scene ID (8 bits) This field is used to specify the Scene ID that is associated with the actual grouping identifier. -Value in the range 1..255 MUST indicate the actual Scene ID setting for the specified grouping identifier. The value 0 MUST indicate that the Group ID/Scene ID is disabled. +Value in the range 1..255 MUST indicate the actual Scene ID setting for the specified grouping identifier. + +The value 0 MUST indicate that the Group ID/Scene ID is disabled. Dimming Duration (8 bits) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.01-terminology.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.01-terminology.md similarity index 58% rename from docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.01-terminology.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.01-terminology.md index bb59d9f..cf46f72 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.01-terminology.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.01-terminology.md @@ -1,11 +1,11 @@ -# 4.75.1 Terminology +# 4.86.1 Terminology A schedule or regular schedule is a delayed execution of one or more commands for a given duration. The commands used in a schedule are typically “Set” type commands, affecting actuating resources or states. @@ -19,30 +19,28 @@ Several schedules can overlap and be active simultaneously. Supporting nodes can optionally support enabling and disabling schedules. By default, a schedule is enabled when being created. When a schedule is disabled, it will never become active, even if the start time condition is met. It allows a controlling node to quickly enable/disable schedules without erasing the schedules configuration from the supporting nodes. -When all schedules are inactive, the supporting node is said to be operating in Normal Mode. Regardless of whether any schedule is active, Normal Mode’s states are permanently affected by direct commands (issued without Schedule encapsulation). State changes triggered by schedules do not affect Normal [Mode. An illustration is given in Figure 28](04.75.01-terminology.md#4751-terminology) +When all schedules are inactive, the supporting node is said to be operating in Normal Mode. Regardless of whether any schedule is active, Normal Mode’s states are permanently affected by direct commands (issued without Schedule encapsulation). State changes triggered by schedules do not affect Normal Mode. -![Figure 28. Simple daily schedules (example)](assets/img-41477511d5.png) +![Figure 25. Simple daily schedules (example)](assets/img-21f86f8019.png) Direct commands affecting the states of a currently active schedule will cause those states to go back to normal mode and the corresponding normal mode states/values to be permanently changed. -![Figure 29. Receiving a direct command during daily schedules (example)](assets/img-9c7dfcaef5.png) +![Figure 26. Receiving a direct command during daily schedules (example)](assets/img-daecc43c03.png) There are 2 types of special schedules. If a Fall Back Schedule is created, it takes over the role of the Normal Mode. The Fall Back Schedule is activated when all other schedules are inactive. Fall Back Schedule is used to define default settings or states for the normal mode -If an Override Schedule is created, it suspends all other schedules. An override schedule may have a start time or start immediately. An override schedule may have a duration, run until stopped or run until [another regular schedule starts. An example is given in Figure 30](04.75.01-terminology.md#4751-terminology) +If an Override Schedule is created, it suspends all other schedules. An override schedule may have a start time or start immediately. An override schedule may have a duration, run until stopped or run until another regular schedule starts. An example is given in the figure below -![Figure 30. Daily schedules and an “Advance” Override Schedule (example)](assets/img-f87775eaf2.png) +![Figure 27. Daily schedules and an “Advance” Override Schedule (example)](assets/img-078228618f.png) -[An overview of the Schedule types and priorities is given in Table 99](04.75.01-terminology.md#4751-terminology) +[An overview of the Schedule types and priorities is given in Table 105](04.86.01-terminology.md#4861-terminology) Table 105. Schedule CC terminology and priority -Table 99. Schedule CC terminology and priority - -| | Priority | | | Term | | | Description | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| (highest) | | | Direct command | | | Affects device state immediately. Permanently affects Normal Mode. | | | -| (higher) | | | Override Schedule (Schedule ID = 0xFF) | | | All other schedules are suspended as long as the override schedule is active. | | | -| (normal) | | | Regular Schedule(s) (Schedule ID in [1..Supported number of schedules]) | | | One or more schedules defining intended behavior. | | | -| (lower) | | | Fall Back Schedule (Schedule ID = 0xFE) | | | Fall Back Schedule becomes active when no other schedule is currently active. If the Fall Back Schedule is defined, Normal Mode is never reached, unless receiving direct commands | | | -| (lowest) | | | Normal Mode | | | No schedules are currently active. | | | +| Priority | Term | Description | +| --- | --- | --- | +| (highest) | Direct command | Affects device state immediately. Permanently affects Normal Mode. | +| (higher) | Override Schedule (Schedule ID = 0xFF) | All other schedules are suspended as long as the override schedule is active. | +| (normal) | Regular Schedule(s) (Schedule ID in [1..Supported number of schedules]) | One or more schedules defining intended behavior. | +| (lower) | Fall Back Schedule (Schedule ID = 0xFE) | Fall Back Schedule becomes active when no other schedule is currently active. If the Fall Back Schedule is defined, Normal Mode is never reached, unless receiving direct commands | +| (lowest) | Normal Mode | No schedules are currently active. | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.02-interoperability-considerations.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.02-interoperability-considerations.md similarity index 76% rename from docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.02-interoperability-considerations.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.02-interoperability-considerations.md index 98935eb..d59b7f5 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.02-interoperability-considerations.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.02-interoperability-considerations.md @@ -1,11 +1,11 @@ -# 4.75.2 Interoperability considerations +# 4.86.2 Interoperability considerations A schedule causes a temporary state change that only applies to the duration of the schedule. The state value(s) of the Normal Mode MUST NOT be affected by any command executed as part of a schedule. @@ -13,13 +13,17 @@ The state value(s) of the Normal Mode MUST be restored when the affecting Schedu Schedules are set with a start time, which requires the supporting node to be aware of the current date and/or time. It is RECOMMENDED to support the Clock Command Class or the Time Command Class in order to allow a controlling node to verify or configure correct date/time settings at the supporting node. -## 4.75.2.1 Override Schedule +## 4.86.2.1 Override Schedule -When the Override Schedule is active, all regular schedules MUST be suspended. When the Override Schedule ends, all suspended schedules MUST resume the state they would have had if the Override Schedule had not been activated. +When the Override Schedule is active, all regular schedules MUST be suspended. -If the Override Schedule is created with a duration type not set to Override, a receiving node SHOULD respect the specified duration for the Override Schedule. A supporting node MUST respect the specified duration for all regular schedules. +When the Override Schedule ends, all suspended schedules MUST resume the state they would have had if the Override Schedule had not been activated. -## 4.75.2.2 Fall Back Schedule +If the Override Schedule is created with a duration type not set to Override, a receiving node SHOULD respect the specified duration for the Override Schedule. + +A supporting node MUST respect the specified duration for all regular schedules. + +## 4.86.2.2 Fall Back Schedule If no Fall Back Schedule is set, a supporting node MUST return to Normal Mode when no schedule is currently active. @@ -27,7 +31,7 @@ If a Fall Back Schedule is set, a supporting node MUST:  Activate the Fall Back Schedule when no other schedule is active.  De-activate the Fall Back Schedule if any other schedule becomes active.  Direct commands state changes MUST be active until the start of a new schedule affecting the same state values. -## 4.75.2.3 Multi Channel considerations +## 4.86.2.3 Multi Channel considerations A Multi Channel device may support different schedule types and command classes for each Multi Channel End Point. An example is a central heating boiler with a thermostat for room heating and another thermostat for water heating. Each system may implement regular weekday+time schedules as well as an override schedule for manual intervention. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.03-schedule-supported-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.03-schedule-supported-get-command.md new file mode 100644 index 0000000..ff32de9 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.03-schedule-supported-get-command.md @@ -0,0 +1,21 @@ + +# 4.86.3 Schedule Supported Get Command + +This command is used to query the schedule functionalities supported by a node. + +The Schedule Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SUPPORTED GET _ _ | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.04-schedule-supported-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.04-schedule-supported-report-command.md similarity index 58% rename from docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.04-schedule-supported-report-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.04-schedule-supported-report-command.md index 1ca8e0a..986150a 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.04-schedule-supported-report-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.04-schedule-supported-report-command.md @@ -1,29 +1,27 @@ -# 4.75.4 Schedule Supported Report Command +# 4.86.4 Schedule Supported Report Command This command is used to advertise the schedule functionalities supported by a node. -| | 7 | | 6 | | | 5 | | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule IDs | | | | | | | | | | | | | | | | | | | | | | | | -| Support Enable/ Disable | | | Fall- back Support | | | | Start Time Support | | | | | | | | | | | | | | | | | -| Number of supported CC | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC 1 | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | | | Command 1 | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC N | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | | | Command N | | | | | -| Override Support | | | Supported Override Types | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | | +| Number of Supported Schedule IDs | | | | | | | | | +| Support Enable/ Disable | Fall- back Support | | Start Time Support | | | | | | +| Number of supported CC | | | | | | | | | +| Supported CC 1 | | | | | | | | | +| Reserved | | | | | | | Supported Command 1 | | +| … | | | | | | | | | +| Supported CC N | | | | | | | | | +| Reserved | | | | | | | Supported Command N | | +| Override Support | Supported Override Types | | | | | | | | Number of Supported Schedule IDs (8 bits) @@ -39,19 +37,17 @@ Special Schedule IDs MUST NOT be included in the number advertised in this field This field is used to advertise the start time options supported for regular schedules by a node. -Regular schedules MUST support the advertised start time options. The Override Schedule SHOULD support the advertised start time options. - -[This field MUST be treated as a bitmask and MUST be encoded according to Table 100](04.75.04-schedule-supported-report-command.md#4754-schedule-supported-report-command) +Regular schedules MUST support the advertised start time options. The Override Schedule SHOULD support the advertised start time options. [This field MUST be treated as a bitmask and MUST be encoded according to Table 106](04.86.04-schedule-supported-report-command.md#4864-schedule-supported-report-command) -Table 100. Start Time Support encoding +Table 106. Start Time Support encoding -| | Bit | | | Indicates support for | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Start now. Refer to 4.75.4.1 | | | 1 | | | -| 1 | | | Start Hour and Minute. Refer to 4.75.4.2 | | | 1 | | | -| 2 | | | Calendar time. Refer to 4.75.4.3 | | | 1 | | | -| 3 | | | Weekdays. Refer to 4.75.4.4 | | | 1 | | | -| 4..5 | | | Reserved | | | N/A | | | +| Bit | Indicates support for | Version | +| --- | --- | --- | +| 0 | Start now. Refer to 4.86.4.1 | 1 | +| 1 | Start Hour and Minute. Refer to 4.86.4.2 | 1 | +| 2 | Calendar time. Refer to 4.86.4.3 | 1 | +| 3 | Weekdays. Refer to 4.86.4.4 | 1 | +| 4..5 | Reserved | N/A | Each bit indicates the support for a given Start Time option. @@ -59,13 +55,13 @@ The value 1 MUST indicate that the node supports the corresponding start time op While support is advertised as a bitmask, the actual functionality is triggered by different combinations of Schedule Set start time fields. The following subsections outline the mandatory supported combinations when advertising support for the corresponding option. -## 4.75.4.1 Start Time option: Start now +## 4.86.4.1 Start Time option: Start now The start now option is used to make a configured schedule start immediately (upon reception of the Schedule Set Command). A node that supports the start now option, MUST support the creation of a schedule starting immediately when all start time fields are left unspecified. -## 4.75.4.2 Start Time option: Hour and Minute +## 4.86.4.2 Start Time option: Hour and Minute The start hour and minute option is used to make a schedule start at a specified time of the day. @@ -73,15 +69,15 @@ If Start Hour and Start Minute are specified, node supporting this option MUST a A node supporting the Hour and Minute start option MUST support the creation of a schedule with the following start time fields’ combination: - Every day @ Hour:Minute (YYMMDD = 0xFF, 0x00, 0x00, Weekdays = 0x00, HH:MM = Hour:Minute) + Every day @ Hour:Minute (YYMMDD = 0xFF, 0x00, 0x00, Weekdays = 0x00, HH:MM = Hour:Minute) A node that also supports the Weekdays start option MUST support the creation of a schedule with the following start time fields’ combination:  Same weekday(s) every week @ Hour:Minute (YYMMDD = 0xFF, 0x00, 0x00, Weekdays = weekdays, HH:MM = Hour:Minute) -A node that also supports the Weekdays start option MUST support the creation of a schedule with the following start time fields’ combination:  Same weekday(s) every week @ Hour:Minute (YYMMDD = 0xFF, 0x00, 0x00, Weekdays = weekdays, HH:MM = Hour:Minute) A node that also supports the Calendar Time start option MUST support the creation of a schedule with the following start time fields’ combination:  Same day every month @ Hour:Minute (YYMMDD = 0xFF, 0x00, day, Weekdays = 0x00, HH:MM = Hour:Minute) +A node that also supports the Calendar Time start option MUST support the creation of a schedule with the following start time fields’ combination:  Same day every month @ Hour:Minute (YYMMDD = 0xFF, 0x00, day, Weekdays = 0x00, HH:MM = Hour:Minute)  Same day every year @ Hour:Minute (YYMMDD = 0xFF, month, day, Weekdays = 0x00, HH:MM = Hour:Minute)  One specific date in a specific year @ Hour:Minute (YYMMDD = year, month, day, Weekdays = 0x00, HH:MM = Hour:Minute) -## 4.75.4.3 Start Time option: Calendar time +## 4.86.4.3 Start Time option: Calendar time The calendar time option is used to make a schedule start at a specified date. @@ -89,7 +85,7 @@ If Start Year, Start Month and Start Day are specified, node supporting this opt A node that supports the Calendar Time option MUST support the creation of a schedule with the following start time fields’ combination:  Same day every month @ 00:00 (YYMMDD = 0xFF, 0x00, day, Weekdays = 0x00, HH:MM = 0x1F, 0x3F)  Same day every year @ 00:00 (YYMMDD = 0xFF, month, day, Weekdays = 0x00, HH:MM = 0x1F, 0x3F)  One specific date in a specific year @ 00:00 (YYMMDD = year, month, day, Weekdays = 0x00, HH:MM = 0x1F, 0x3F) -## 4.75.4.4 Start Time option: Weekday +## 4.86.4.4 Start Time option: Weekday The start weekday option is used to make a schedule start at on specified weekdays. @@ -101,11 +97,15 @@ Fall Back Support (1 bit) This bit is used to advertise the support of the Fall Back Schedule (Schedule ID = 0xFE). -The bit MUST be set to 1 if the node supports the Fall Back Schedule. The bit MUST be set to 0 if the node does not support the Fall Back Schedule. Support Enable/Disable (1 bit) +The bit MUST be set to 1 if the node supports the Fall Back Schedule. The bit MUST be set to 0 if the node does not support the Fall Back Schedule. + +Support Enable/Disable (1 bit) This bit is used to advertise the support for enabling/disabling set/used schedules via the Schedule State Set Command. -The bit MUST be set to 0 if the node supports enabling/disabling schedules. The bit MUST be set to 1 if the node does not support enabling/disabling schedules. +The bit MUST be set to 0 if the node supports enabling/disabling schedules. + +The bit MUST be set to 1 if the node does not support enabling/disabling schedules. A node that does not support enabling/disabling schedules MUST consider every set/used schedule ID as enabled. @@ -121,22 +121,20 @@ Supported CC (N * 8 bits) This field is used to advertise the list of Command Classes that can be scheduled by the node. -The length of this field MUST be according to the Number of supported CC field value. - -A sending node MUST support every Command Class advertised in this field. A sending node SHOULD NOT advertise the Supervision Command Class in this field. A sending node MUST NOT advertise the following encapsulation Command Classes: +The length of this field MUST be according to the Number of supported CC field value. A sending node MUST support every Command Class advertised in this field. A sending node SHOULD NOT advertise the Supervision Command Class in this field. A sending node MUST NOT advertise the following encapsulation Command Classes:  S0/S2 Command Class  Transport Service Command Class  Multi Channel Command Class  Multi Command Command Class Supported Command (N * 2 bits) -This field MUST advertise the supported commands for the actual command class entry. This field MUST [comply with Table 101.](04.75.04-schedule-supported-report-command.md#47544-start-time-option-weekday) +This field MUST advertise the supported commands for the actual command class entry. This field [MUST comply with Table 107.](04.86.04-schedule-supported-report-command.md#48644-start-time-option-weekday) -Table 101. Supported Command +Table 107. Supported Command -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Both Set and Get Commands are supported | | | 1 | | | -| 0x01 | | | Only Set Commands are supported | | | 1 | | | -| 0x02 | | | Only Get Commands are supported | | | 1 | | | -| 0x03 | | | Reserved | | | N/A | | | +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | Both Set and Get Commands are supported | 1 | +| 0x01 | Only Set Commands are supported | 1 | +| 0x02 | Only Get Commands are supported | 1 | +| 0x03 | Reserved | N/A | Certain command classes commands do not contain the string “Set” or “Get” in their name. Nodes MUST consider all commands mandating to return a response to be of type “Get” and all other commands to be of type “Set”. @@ -154,12 +152,12 @@ This field is used to advertise the supported Override Schedule duration types. A receiving node MUST ignore this bit mask if the Override Schedule is not supported by the sending node. -[This field MUST be treated as a bitmask and MUST be encoded according to Table 102.](04.75.04-schedule-supported-report-command.md#47544-start-time-option-weekday) +[This field MUST be treated as a bitmask and MUST be encoded according to Table 108.](04.86.04-schedule-supported-report-command.md#48644-start-time-option-weekday) -Table 102. Schedule Supported Report::Supported Override Types encoding +Table 108. Schedule Supported Report::Supported Override Types encoding -| | Bit | | | Name | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Advance | | | The override schedule MUST run until the start of the next regular schedule. | | | 1 | | | -| 1 | | | Run forever | | | The override schedule MUST run until the schedule is removed | | | 1 | | | -| 2..6 | | | Reserved | | | Reserved | | | N/A | | | +| Bit | Name | Description | Version | +| --- | --- | --- | --- | +| 0 | Advance | The override schedule MUST run until the start of the next regular schedule. | 1 | +| 1 | Run forever | The override schedule MUST run until the schedule is removed | 1 | +| 2..6 | Reserved | Reserved | N/A | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.05-schedule-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.05-schedule-set-command.md similarity index 56% rename from docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.05-schedule-set-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.05-schedule-set-command.md index 96b8aab..4a069fb 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.05-schedule-set-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.05-schedule-set-command.md @@ -1,45 +1,51 @@ -# 4.75.5 Schedule Set Command +# 4.86.5 Schedule Set Command -This command is used to create a new schedule or modify an existing schedule. This command MUST enable the schedule if a new schedule is created. This command MUST NOT change the enabled/disabled state of existing schedules. +This command is used to create a new schedule or modify an existing schedule. + +This command MUST enable the schedule if a new schedule is created. + +This command MUST NOT change the enabled/disabled state of existing schedules. If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| Reserved | | | | | | | | | | Start Day of Month | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Reserved | | | | | | Start Minute | | | | | | | | | | | | | | | | | | -| Duration Byte 1 MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 LSB | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE SET _ | | | | | | | | | +| Schedule ID | | | | | | | | | +| Reserved | | | | | | | | | +| Start Year | | | | | | | | | +| Reserved | | | | | Start Month | | | | +| Reserved | | | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | | +| Duration Type | | | Start Hour | | | | | | +| Reserved | | Start Minute | | | | | | | +| Duration Byte 1 MSB | | | | | | | | | +| Duration Byte 2 LSB | | | | | | | | | +| Reports to Follow | | | | | | | | | +| Number of Cmd to Follow | | | | | | | | | +| Cmd Length 1 | | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte 1 - N | | | | | | | | | +| … | | | | | | | | | +| Cmd Length P | | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte P - N | | | | | | | | | Reserved -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Schedule ID (8 bits) +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Schedule ID (8 bits) This field is used to indicate which Schedule ID is being set. @@ -53,15 +59,17 @@ If this field is set to 0xFF: If this field is set to 0xFE: - The sending node SHOULD set the start time fields and duration fields to 0x00.  The receiving node MUST ignore the start time fields and duration fields + The sending node SHOULD set the start time fields and duration fields to 0x00. + + The receiving node MUST ignore the start time fields and duration fields -## 4.75.5.1 Start time fields +## 4.86.5.1 Start time fields The schedule start time is defined by the following fields:  Start Year  Start Month  Start Day of Month  Start Weekday  Start Hour  Start Minute -[A receiving node MUST support the start time fields combinations indicated in sections 4.75.4.1, 4.75.4.2](04.75.04-schedule-supported-report-command.md#47541-start-time-option-start-now) [4.75.4.3 and 4.75.4.4 if the corresponding start time option is supported.](04.75.04-schedule-supported-report-command.md#47543-start-time-option-calendar-time) +[A receiving node MUST support the start time fields combinations indicated in sections 4.86.4.1,](04.86.04-schedule-supported-report-command.md#48641-start-time-option-start-now) [4.86.4.2 4.86.4.3 and 4.86.4.4 if the corresponding start time option is supported.](04.86.04-schedule-supported-report-command.md#48642-start-time-option-hour-and-minute) If none of the start time fields are specified, the schedule MUST start immediately if the start now option is supported. In this case, the schedule MUST NOT be activated again at a later time unless receiving another Schedule Set Command. @@ -87,7 +95,7 @@ Start Day of Month (5 bits) This field is used to set the day of month for which the schedule is to start. This field MUST be in the range 0..31. -Values in the range 1..31 MUST indicate the actual start day of the month. If the specified value does not exist in the actual Year/Month tuple (28/29/30 day month), a receiving node MAY ignore this command. +Values in the range 1..31 MUST indicate the actual start day of the month. If the specified value does not exist in the actual Year/Month tuple (28/29/30 day month), a receiving node MAY ignore this CC:0053.01.03.13.001 command. The value 0x00 MUST be used to indicate that the day of the month is unspecified. @@ -95,25 +103,27 @@ This field MUST be ignored and treated as unspecified by a receiving node advert Start Weekday (7 bits) -This field is used to set one or more weekdays for which the schedule is to start. This field MUST be [treated a as bitmask and MUST be encoded according to Table 103.](04.75.05-schedule-set-command.md#47551-start-time-fields) +This field is used to set one or more weekdays for which the schedule is to start. This field MUST be CC:0053.01.03.11.01A [treated a as bitmask and MUST be encoded according to Table 109.](04.86.05-schedule-set-command.md#48651-start-time-fields) -Table 103. Weekday bitmask encoding +Table 109. Weekday bitmask encoding -| | Bit | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Monday | | | 1 | | | -| 1 | | | Tuesday | | | 1 | | | -| 2 | | | Wednesday | | | 1 | | | -| 3 | | | Thursday | | | 1 | | | -| 4 | | | Friday | | | 1 | | | -| 5 | | | Saturday | | | 1 | | | -| 6 | | | Sunday | | | 1 | | | +| Bit | Description | Version | +| --- | --- | --- | +| 0 | Monday | 1 | +| 1 | Tuesday | 1 | +| 2 | Wednesday | 1 | +| 3 | Thursday | 1 | +| 4 | Friday | 1 | +| 5 | Saturday | 1 | +| 6 | Sunday | 1 | + +The value 1 MUST indicate that the specified Schedule ID MUST start on the corresponding day. -The value 1 MUST indicate that the specified Schedule ID MUST start on the corresponding day. The value 0 MUST indicate that the specified Schedule ID MUST NOT start on the corresponding day. +The value 0 MUST indicate that the specified Schedule ID MUST NOT start on the corresponding day. -If any of the Start Year, Start Month or Start Day of Month field is specified, this field MUST be set to 0x00 by a sending node and MUST be ignored by a receiving node. +If any of the Start Year, Start Month or Start Day of Month field is specified, this field MUST be set to 0x00 by a sending node and MUST be ignored by a receiving node. This field MUST be ignored and treated as unspecified by a receiving node advertising no support for the Weekday start time option in the Schedule Supported Report Command. -This field MUST be ignored and treated as unspecified by a receiving node advertising no support for the Weekday start time option in the Schedule Supported Report Command. Start Hour (5 bits) +Start Hour (5 bits) This field is used to set the hour for which the schedule is to start. This field MUST be in the range 0..23 or set to 0x1F. @@ -133,7 +143,7 @@ The value 0x3F (63) MUST be used to indicate that the start minute is unspecifie This field MUST be ignored and treated as unspecified by a receiving node advertising no support for the hour and minute start time option in the Schedule Supported Report Command. -## 4.75.5.2 Duration fields +## 4.86.5.2 Duration fields The schedule duration is defined by the following fields: @@ -141,16 +151,16 @@ The schedule duration is defined by the following fields: Duration Type (3 bits) -This field is used to indicate how to interpret the duration field. This field MUST be encoded according to [Table 104.](04.75.05-schedule-set-command.md#47552-duration-fields) +This field is used to indicate how to interpret the duration field. This field MUST be encoded according [to Table 110.](04.86.05-schedule-set-command.md#48652-duration-fields) -Table 104. Duration Type encoding +Table 110. Duration Type encoding -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | The duration field is expressed in Minutes | | | 1 | | | -| 0x01 | | | The duration field is expressed in Hours | | | 1 | | | -| 0x02 | | | The duration field is expressed in Days | | | 1 | | | -| 0x03 | | | Override: The duration field is indicating the Override Type. This value MUST NOT be used if the Schedule ID field is not set to 0xFF | | | 1 | | | +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | The duration field is expressed in Minutes | 1 | +| 0x01 | The duration field is expressed in Hours | 1 | +| 0x02 | The duration field is expressed in Days | 1 | +| 0x03 | Override: The duration field is indicating the Override Type. This value MUST NOT be used if the Schedule ID field is not set to 0xFF | 1 | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Duration (16 bits) @@ -158,19 +168,19 @@ This field is used to specify the duration of the schedule being set. The Durati If the Duration Type field is not set to Override (0x03), this field MUST indicate the duration of the actual schedule. The Duration Type field indicates the unit of this field. -If the Duration Type field is set to Override (0x03), the LSB of this field MUST be encoded according to [Table 105 and the MSB of this field MUST be set to 0x00.](04.75.05-schedule-set-command.md#47552-duration-fields) +If the Duration Type field is set to Override (0x03), the LSB of this field MUST be encoded according to [Table 111 and the MSB of this field MUST be set to 0x00.](04.86.05-schedule-set-command.md#48652-duration-fields) -Table 105. Override Types duration +Table 111. Override Types duration -| | Name | | | Duration value (LSB) | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Advance | | | 0x01 | | | The override schedule MUST run until the start of the next regular schedule. | | | 1 | | | -| Run forever | | | 0x02 | | | The override schedule MUST run until it is removed | | | 1 | | | -| Reserved | | | 0x03..0x07 | | | Reserved | | | N/A | | | +| Name | Duration value (LSB) | Description | Version | +| --- | --- | --- | --- | +| Advance | 0x01 | The override schedule MUST run until the start of the next regular schedule. | 1 | +| Run forever | 0x02 | The override schedule MUST run until it is removed | 1 | +| Reserved | 0x03..0x07 | Reserved | N/A | -CC:0053.01.03.11.02E Run forever 0x02 The override schedule MUST run until it is 1 +Run forever 0x02 The override schedule MUST run until it is 1 CC:0053.01.03.11.02E -## 4.75.5.3 Command and other fields +## 4.86.5.3 Command and other fields Reports to Follow (8 bits) @@ -194,7 +204,9 @@ This field is used to set the commands to be executed during the actual Schedule This field MUST carry a complete command including Command Class identifier, Command identifier and the required parameter bytes. -The length of each Cmd Byte entry MUST be according to the corresponding Cmd Length field entry. The number of Cmd Byte entries MUST be according to the Number of Cmd to Follow field. +The length of each Cmd Byte entry MUST be according to the corresponding Cmd Length field entry. + +The number of Cmd Byte entries MUST be according to the Number of Cmd to Follow field. If a schedule includes commands mandating to return a response, responses MUST be returned to the node that has set the schedule. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.06-schedule-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.06-schedule-get-command.md new file mode 100644 index 0000000..307f685 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.06-schedule-get-command.md @@ -0,0 +1,26 @@ + +# 4.86.6 Schedule Get Command + +This command is used to request the configuration for a specific schedule ID. + +The Schedule Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE GET _ | | | | | | | | +| Schedule ID | | | | | | | | + +Schedule ID (8 bits) + +This field MUST carry the requested Schedule ID. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.07-schedule-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.07-schedule-report-command.md new file mode 100644 index 0000000..2d44b48 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.07-schedule-report-command.md @@ -0,0 +1,60 @@ + +# 4.86.7 Schedule Report Command + +This command is used to report the configuration for a specific schedule. + +| 7 | 6 | 5 | 4 | | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE REPORT _ | | | | | | | | | +| Schedule ID | | | | | | | | | +| Reserved | | | | | | | | | +| Start Year | | | | | | | | | +| Active ID _ | | | | | Start Month | | | | +| Reserved | | | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | | +| Duration Type | | | Start Hour | | | | | | +| Reserved | | Start Minute | | | | | | | +| Duration Byte 1 | | | | | | | | | +| Duration Byte 2 | | | | | | | | | +| Report to Follow | | | | | | | | | +| Number of Cmd to Follow | | | | | | | | | +| Cmd Length 1 | | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte 1 – N | | | | | | | | | +| … | | | | | | | | | +| Cmd Length P | | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte P - N | | | | | | | | | + +[Fields not described below are described in the Schedule Set Command; refer to 4.86.5.](04.86.05-schedule-set-command.md#4865-schedule-set-command) + +Schedule ID (8 bits) + +This field is used to indicate the advertised Schedule ID. + +If this command is advertising an unused or unsupported Schedule ID, all parameters until Number of Cmd to Follow MUST be set to 0x00. The Cmd Length and Cmd Byte fields MUST be omitted. Active_ID (4 bits) + +This field is used to advertise the status for the requested Schedule ID. This field MUST be encoded [according to Table 113.](04.86.11-schedule-state-report-command.md#48611-schedule-state-report-command) + +Duration (16 bits) + +This field is used to advertise either the configured duration for a schedule or how much time is left before the schedule becomes inactive. + +The Duration Type, Start Time and Schedule ID fields MUST be inspected before interpreting this field. [This field MUST advertise a value according to Table 112.](04.86.07-schedule-report-command.md#4867-schedule-report-command) + +Table 112. Duration field usage + +| Duration Type | Schedule ID | Start time | Advertised duration | +| --- | --- | --- | --- | +| Time (0x00..0x02) | Regular | Specified start time | Configured duration | +| Time (0x00..0x02) | Regular or Override | Start now | Remaining time | +| Override (0x03) | Override (0xFF) | Start now | Configured override type (Table 111) | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.08-schedule-remove-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.08-schedule-remove-command.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.08-schedule-remove-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.08-schedule-remove-command.md index 59e99a8..41c3fb0 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.08-schedule-remove-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.08-schedule-remove-command.md @@ -1,19 +1,19 @@ -# 4.75.8 Schedule Remove Command +# 4.86.8 Schedule Remove Command This command is used to request the removal of one or all Schedules in a device. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REMOVE _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE REMOVE _ | | | | | | | | +| Schedule ID | | | | | | | | Schedule ID (8 bits) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.09-schedule-state-set-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.09-schedule-state-set-command.md similarity index 58% rename from docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.09-schedule-state-set-command.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.09-schedule-state-set-command.md index 8982453..cec5ca5 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.09-schedule-state-set-command.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.09-schedule-state-set-command.md @@ -1,28 +1,30 @@ -# 4.75.9 Schedule State Set Command +# 4.86.9 Schedule State Set Command This command is used to enable or disable a schedule. This command MUST be ignored by a node advertising no support for Enabling/Disabling schedules in the Schedule Supported Report Command. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule State | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE STATE SET _ _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule State | | | | | | | | Schedule ID (8 bits) This field is used to indicate the schedule that is to be enabled or disabled. -The value 0x00 MUST cause the receiving node to change the state for all schedules, except for the Override Schedule. Values in the range 0x01..[number of supported schedules] and 0xFE MUST indicate the actual schedule ID which state is to be updated. +The value 0x00 MUST cause the receiving node to change the state for all schedules, except for the Override Schedule. + +Values in the range 0x01..[number of supported schedules] and 0xFE MUST indicate the actual schedule ID which state is to be updated. The value 0xFF MUST be ignored by a receiving node. Override schedules cannot be enabled/disabled and may only be removed using the Schedule Remove Command. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.10-schedule-state-get-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.10-schedule-state-get-command.md new file mode 100644 index 0000000..2d1b957 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.10-schedule-state-get-command.md @@ -0,0 +1,21 @@ + +# 4.86.10 Schedule State Get Command + +This command is used to request the status of all schedules supported by a node. + +The Schedule State Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE STATE GET _ _ | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.11-schedule-state-report-command.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.11-schedule-state-report-command.md new file mode 100644 index 0000000..b793cae --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/04.86.11-schedule-state-report-command.md @@ -0,0 +1,65 @@ + +# 4.86.11 Schedule State Report Command + +This command is used to advertise the status of all schedules supported by a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE STATE REPORT _ _ | | | | | | | | +| Number of Supported Schedule ID | | | | | | | | +| Reports to Follow | | | | | | | Override | +| Active ID 2 _ | | | | Active ID 1 _ | | | | +| … | | | | | | | | +| Active ID N _ | | | | Active ID N-1 _ | | | | + +. + +Number of Supported Schedule ID (8 bits) + +This field is used to advertise the number of supported regular schedule IDs. This field’s value MUST be the same as the value advertised in the Schedule Supported Report Command. + +Override (1 bit) + +This field MUST be used to advertise the status of the Override Schedule (ID = 0xFF). + +If the Override Schedule is active, this bit MUST be set to 1. If the Override Schedule is inactive, this bit MUST be set to 0. Reports to Follow (7 bits) + +The length of the Active_ID field may be larger than the maximum available Z-Wave MAC frame size. + +This field MUST be used to advertise the number of commands following this command in order to advertise the status of all Schedules IDs. + +A controlling node SHOULD use this value to detect missing reports. + +Active_ID (N * 4 bits) + +This field is used to advertise the status for each supported schedule ID. Four bits units are used for each Schedule ID to indicate the status. It means that: + + Bits 0 to 3 in Active_ID byte 1 represent Schedule ID = 1  Bits 4 to 7 in Active_ID byte 1 represent Schedule ID = 2  Bits 0 to 3 in Active_ID byte 2 represent Schedule ID = 3  … + +The size of this field MUST be the smallest number of bytes needed to advertise the number of supported Schedule IDs advertised in this command. + +If several Reports are returned (using the Reports to follow field), the first Report advertises Schedule CC:0053.01.09.11.007 ID 1 to Schedule ID N and the subsequent report MUST be interpreted as representing Schedule ID starting from N+1. + +[Each 4 bits unit MUST be encoded according to Table 113.](04.86.11-schedule-state-report-command.md#48611-schedule-state-report-command) Table 113. Active_ID encoding + +| Hex | Description | Detailed description | Version | +| --- | --- | --- | --- | +| 0x00 | Not used | The Schedule ID is not used. (not set/configured) or unsupported | 1 | +| 0x01 | [DEPRECATED] Override + Not used | [DEPRECATED] A sending node SHOULD NOT use this status. It is RECOMMENDED to use 0x00 instead. A receiving node MUST interpret this status as Active ID = 0x00 (and the override field _ set to 1 for the Schedule State Report Command). | 1 | +| 0x02 | Not Active | The Schedule ID is used, enabled and currently not active. | 1 | +| 0x03 | Active | The Schedule ID is used, enabled and currently active. | 1 | +| 0x04 | Disabled | The Schedule ID is used and disabled. | 1 | +| 0x05 | Override + Active | The Schedule ID is used, enabled and should currently be active but it is suspended by the Override Schedule The override field MUST be set to 1 when using this status in the Schedule State Report Command. | 1 | +| 0x06 | [DEPRECATED] Override + Not Active | [DEPRECATED] A sending node SHOULD NOT use this status. It is RECOMMENDED to use 0x02 instead. A receiving node MUST interpret this status as Active ID = 0x02 (and the override field _ set to 1 for the Schedule State Report Command) | 1 | +| 0x07 | [DEPRECATED] Override + Disabled | [DEPRECATED] A sending node SHOULD NOT use this status. It is RECOMMENDED to use 0x04 instead. A receiving node MUST interpret this status as Active ID = 0x04 (and the override field _ set to 1 for the Schedule State Report Command) | 1 | + +CC:0053.01.09.11.00C interpret this status as Active_ID = 0x04 (and the override field + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/index.md new file mode 100644 index 0000000..8dd81b8 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.86-schedule-command-class-version-1/index.md @@ -0,0 +1,24 @@ + +# 4.86 Schedule Command Class, version 1 + +The Schedule Command Class allows scheduling the execution of commands for a given duration in a supporting device. It is a generic Command Class that may be used to schedule commands of any other Command Class. + +## Contents + +- [4.86.1 Terminology](04.86.01-terminology.md) +- [4.86.2 Interoperability considerations](04.86.02-interoperability-considerations.md) +- [4.86.3 Schedule Supported Get Command](04.86.03-schedule-supported-get-command.md) +- [4.86.4 Schedule Supported Report Command](04.86.04-schedule-supported-report-command.md) +- [4.86.5 Schedule Set Command](04.86.05-schedule-set-command.md) +- [4.86.6 Schedule Get Command](04.86.06-schedule-get-command.md) +- [4.86.7 Schedule Report Command](04.86.07-schedule-report-command.md) +- [4.86.8 Schedule Remove Command](04.86.08-schedule-remove-command.md) +- [4.86.9 Schedule State Set Command](04.86.09-schedule-state-set-command.md) +- [4.86.10 Schedule State Get Command](04.86.10-schedule-state-get-command.md) +- [4.86.11 Schedule State Report Command](04.86.11-schedule-state-report-command.md) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.87-schedule-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.87-schedule-command-class-version-2.md new file mode 100644 index 0000000..8c17345 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.87-schedule-command-class-version-2.md @@ -0,0 +1,325 @@ + +# 4.87 Schedule Command Class, version 2 + +The Schedule Command Class version 2 allows scheduling the execution of commands for a given duration in a supporting node. It is a generic command class that may be used to schedule commands from any other Command Class. + +## 4.87.1 Compatibility considerations + +The Schedule Command Class, version 2 is backwards compatible with version 1. + +A node supporting the Schedule Command Class, version 2 MUST also support version 1. + +Schedule Command Class, version 2 introduces the following: + + Schedule ID Blocks + + Clarification on using Schedule Command Class with Security + +All commands or fields not described in this version remain unchanged from version 1. + +### 4.87.1.1 Schedule ID Blocks + +In Schedule Command Class version 1, all Schedule IDs have to support the same Start Time Options, Override Types and supported commands. + +The Schedule ID Blocks allows a node to implement several Schedule ID pools sharing the same scheduling functionalities. + +Each Schedule ID Block MUST have its own range of Schedule ID’s. The ID for each Block MUST be in the range 1..[Number of Supported Schedule IDs]. + +Schedule ID Block = 1 is the default Block. A version 1 node MUST be assumed to be using Schedule ID block 1. + +### 4.87.1.2 Schedule Command Class with Security + +The Schedule Command Class may be implemented by secure devices. Depending on the type of device, a given Command Class may be supported only via secure communication or via secure as well as unsecure communication. + +The following command class categories may be considered: + + Always unsecure Examples of command classes which are always supported via unsecure communication – as well as via secure communication if the device is securely included (e.g Z-Wave Plus Info Command Class). + + Migrate to secure Examples of command classes which are supported via unsecure communication if the device is not securely included – but only via secure communication if the device is securely included. (e.g. Multilevel Switch or Association Command Class) + + Secure only: Examples of command classes which are supported only via secure communication. (e.g. Door Lock Command Class) To reflect the above mentioned dynamic support scenarios, a device MUST advertise the supported Command Classes for scheduling in a way that matches the current secure/non-secure supported Command Class lists found in the NIF and S0/S2 Commands Supported Report Commands. + +Clarification is added to the Schedule Supported Report Command and Schedule Set Command for proper reporting and configuration of unsecure and secure command classes scheduling. + +It is RECOMMENDED to support the Schedule Command Class only at the highest security level in order to avoid dynamic listing. + +## 4.87.2 Schedule Supported Get Command + +This command is used to query the properties of a node. + +The Schedule Supported Report Command MUST be returned in response to this command. + +If the receiving node supports S0 or S2 Command Class and this command is issued via non-secure communication, the receiving node MUST advertise Command Classes that can be scheduled but also supported at the received security level. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SUPPORTED GET _ _ | | | | | | | | +| Schedule ID Block | | | | | | | | + +Schedule ID Block (1 byte) + +This field is used to request a particular Schedule ID Block. + +If this field is set to 0x00, the receiving node MUST return the default Schedule ID Block (ID = 1). + +A node receiving a version 1 Schedule Supported Get Command (without the Schedule ID Block field) MUST return a response for the default Schedule ID Block (ID = 1). + +A node receiving a non-supported Schedule ID Block SHOULD return a report for the default Schedule ID Block. + +## 4.87.3 Schedule Supported Report Command + +This command is used to advertise the scheduling functionalities supported by a node for a given Schedule ID Block. + +| 7 | 6 | 5 | | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | | +| Number of Supported Schedule IDs | | | | | | | | | +| Support Enable/ Disable | Fall- back Support | | Start Time Support | | | | | | +| Number of supported CC | | | | | | | | | +| Supported CC 1 | | | | | | | | | +| Reserved | | | | | | | Supported Command 1 | | +| … | | | | | | | | | +| Supported CC N | | | | | | | | | +| Reserved | | | | | | | Supported Command N | | +| Override Support | Supported Override Types | | | | | | | | +| Schedule ID Block | | | | | | | | | +| Number of Supported Schedule Blocks | | | | | | | | | + +Fields not described below remain unchanged from version 1. + +All fields contained in this command advertise the scheduling supported functionalities for the actual Schedule ID Block. + +Schedule ID Block (8 bits) + +This field is used to indicate the actual Schedule ID Block for which the supported scheduling functionalities are advertised. + +The advertised supported functionalities SHOULD be different for every Schedule ID Block. Number of Schedule ID Blocks (8 bits) + +This field MUST advertise the total number of Schedule ID blocks supported by the node. + +This field MUST be in the range 1..255. + +The implemented Schedule ID Blocks MUST be in the range 1..[Number of Supported Schedule ID Blocks]. i.e. a node supporting 10 Schedules ID Blocks MUST accept Schedule ID Blocks values in the range 1..10. + +## 4.87.4 Schedule Set Command + +This command is used to create a new schedule or modify an existing schedule. + +This command MUST enable the schedule if a new schedule is created. This command MUST NOT change the enabled/disabled state of existing schedules + +If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. + +| 7 | 6 | 5 | 4 | | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE SET _ | | | | | | | | | +| Schedule ID | | | | | | | | | +| Schedule ID Block | | | | | | | | | +| Start Year | | | | | | | | | +| Reserved | | | | | Start Month | | | | +| Reserved | | | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | | +| Duration Type | | | Start Hour | | | | | | +| Reserved | | Start Minute | | | | | | | +| Duration Byte 1 MSB | | | | | | | | | +| Duration Byte 2 LSB | | | | | | | | | +| Reports to Follow | | | | | | | | | +| Number of Cmd to Follow | | | | | | | | | +| Cmd Length 1 | | | | | | | | | +| Cmd 1 Byte 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd 1 Byte 1 - N | | | | | | | | | +| … | | | | | | | | | +| Cmd Length P | | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte P - N | | | | | | | | | + +Fields not described below remain unchanged from version 1. Schedule ID Block (8 bits) + +This field is used to specify the Schedule ID Block in which the specified Schedule ID is being set. + +A node receiving a version 1 Schedule Set Command (with the Schedule ID Block field set to 0x00) MUST assume the default Schedule ID Block (ID = 0x01). + +## 4.87.5 Schedule Get Command + +This command is used to request the configuration for a specific schedule ID. + +The Schedule Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE GET _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule ID Block | | | | | | | | + +Fields not described below remain unchanged from version 1. + +Schedule ID Block (8 bits) + +This field is used to specify the requested Schedule ID Block. + +A node receiving a version 1 Schedule Get Command (without the Schedule ID Block field) MUST return a response for the default Schedule ID Block (ID = 1). + +## 4.87.6 Schedule Report Command + +This command is used to advertise the configuration for a specific schedule. + +| 7 | 6 | 5 | 4 | | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE REPORT _ | | | | | | | | | +| Schedule ID | | | | | | | | | +| Schedule ID Block | | | | | | | | | +| Start Year | | | | | | | | | +| Active ID _ | | | | | Start Month | | | | +| Reserved | | | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | | +| Duration Type | | | Start Hour | | | | | | +| Reserved | | Start Minute | | | | | | | +| Duration Byte 1 | | | | | | | | | +| Duration Byte 2 | | | | | | | | | +| Report to Follow | | | | | | | | | +| Number of Cmd to Follow | | | | | | | | | +| Cmd Length 1 | | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte 1 – N | | | | | | | | | +| … | | | | | | | | | +| Cmd Length P | | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte P - N | | | | | | | | | + +Fields not described below remain unchanged from version 1. + +Schedule ID Block (8 bits) + +This field is used to specify the advertised Schedule ID Block. + +## 4.87.7 Schedule Remove Command + +This command is used to request the removal of one or all Schedules in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE REMOVE _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule ID Block | | | | | | | | + +Schedule ID (8 bits) + +This field is used to indicate the schedule that is to be removed. + +If this field is set to 0x00, all schedules within the Schedule ID Block MUST be removed. + +If this field is set to 0xFE, the Fall Back Schedule MUST be removed (if defined for the Schedule ID Block). + +If this field is set to 0xFF, the Override Schedule MUST be removed (if defined for the Schedule ID Block). + +If this field is in the range 0x01..[Number of supported Schedules], the receiving node MUST remove the corresponding schedule in the Schedule ID Block. + +Schedule ID Block (8 bits) + +This field is used to indicate the Schedule ID Block in which a schedule is being removed. + +A node receiving a version 1 Schedule Set Command (without the Schedule ID Block field) MUST assume the default Schedule ID Block (ID = 0x01). + +A node receiving this command with Schedule ID = 0x00 and Schedule ID Block = 0x00 MUST remove all Schedule IDs in all Schedule ID Blocks + +A node receiving this command with Schedule ID = 0x00 and Schedule ID Block ≠ 0x00 MUST remove all Schedule IDs from the specified Schedule ID Block. + +A node receiving this command with Schedule ID ≠ 0x00 and Schedule ID Block = 0x00 MUST ignore the command + +## 4.87.8 Schedule State Set Command + +This command is used to enable or disable one or more schedules. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE STATE SET _ _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule State | | | | | | | | +| Schedule ID Block | | | | | | | | + +Fields not described below remain unchanged from version 1. + +Schedule ID Block (8 bits) + +This field is used to specify the Schedule ID Block in which one or more schedule are being enabled or disabled. + +This command MUST be ignored by a node advertising no support for Enabling/Disabling schedules in the Schedule Supported Report Command for the given Schedule ID Block. + +A node receiving a version 1 Schedule Set Command (without the Schedule ID Block field) MUST assume the default Schedule ID Block (ID = 0x01). + +A node receiving this command with Schedule ID = 0x00 and Schedule ID Block = 0x00 MUST enable/disable all Schedule IDs from all Schedule ID Blocks. + +A node receiving this command with Schedule ID = 0x00 and Schedule ID Block ≠ 0x00 MUST enable/disable all Schedule IDs from the specified Schedule ID Block. + +A node receiving this command with Schedule ID ≠ 0x00 and Schedule ID Block = 0x00 MUST ignore the command. + +## 4.87.9 Schedule State Get Command + +This command is used to request the status of all schedules within a Schedule ID Block supported by a node. + +The Schedule State Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE STATE GET _ _ | | | | | | | | +| Schedule ID Block | | | | | | | | + +Schedule ID Block (8 bits) + +This field is used to request a particular Schedule ID Block. + +A node receiving a version 1 Schedule Supported Get Command (without the Schedule ID Block field) MUST return a response for the default Schedule ID Block (ID = 1). + +## 4.87.10 Schedule State Report Command + +This command is used to advertise the status of all schedules supported by a device in a given Schedule ID block. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE STATE REPORT _ _ | | | | | | | | +| Number of Supported Schedule ID | | | | | | | | +| Reports to Follow | | | | | | | Override | +| Active ID 2 _ | | | | Active ID 1 _ | | | | +| … | | | | | | | | +| Active ID N _ | | | | Active ID N-1 _ | | | | +| Schedule ID Block | | | | | | | | + +Fields not described below remain unchanged from version 1. + +Number of Supported Schedule ID (8 bits) + +This field is used to advertise the number of supported regular schedule IDs for the actual Schedule ID Block. This field’s value MUST be the same as the value advertised in the Schedule Supported Report Command. + +Schedule ID Block (8 bits) + +This field is used to specify the Schedule ID Block in which all schedule states are advertised. + +If several Reports are returned (using the Reports to Follow field), this field MUST be present in every Report. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.88-schedule-command-class-version-3.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.88-schedule-command-class-version-3.md new file mode 100644 index 0000000..a749a9d --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.88-schedule-command-class-version-3.md @@ -0,0 +1,276 @@ + +# 4.88 Schedule Command Class, version 3 + +The Schedule Command Class, version 3 allows scheduling the execution of commands for a given duration in a supporting node. It is a generic command class that may be used to schedule commands of any other Command Class. + +## 4.88.1 Terminology + +The Schedule Command Class version 3 introduces new terminology, complementing the terminology introduced in The Schedule Command Class version 1: + +Regular schedules may be triggered repeatedly by two mechanisms. From version 1, a Repeating Schedule can be created by setting parts of the start time to unspecified values, e.g. if month is unspecified, the schedule can start the first day of each month. From version 3, Recurrence settings may specify additional periodical triggers, e.g. every second day measured from the most recent trigger of the regular schedule. + +## 4.88.2 Compatibility considerations + +The Schedule Command Class, version 3 is backwards compatible with version 2. + +A node supporting the Schedule Command Class, version 3 MUST also support version 2. + +The Schedule Command Class version 3 introduces the “Recurring Mode” start mode and “Time from now” start time option. + +The “Time from now” start time option allows to set a schedule to start a after a given time from the reception of the command. + +The “Recurring Mode” start mode allows to set a schedule to restart repeatedly at fixed intervals since the last activation, e.g. every second day or every 6 months since the last activation. + +The Active_ID advertised in the Schedule Report Command of versions 1 and 2 is now overloaded with the Recurrence Offset field. A new AID_RO_CTL flag in the Schedule Get Command controls which value is actually returned. + +All commands or fields not described in this version remain unchanged from version 2. + +## 4.88.3 Schedule Supported Report Command + +This command is used to advertise the scheduling functionalities supported by a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | +| Number of Supported Schedule IDs | | | | | | | | +| Support Enable/ Disable | Fall- back Support | Start Time Support | | | | | | +| Number of supported CC | | | | | | | | +| Supported CC 1 | | | | | | | | +| Reserved | | | | | | Supported Command 1 | | +| … | | | | | | | | +| Supported CC N | | | | | | | | +| Reserved | | | | | | Supported Command N | | +| Override Support | Supported Override Types | | | | | | | +| Schedule ID Block | | | | | | | | +| Number of Supported Schedule Blocks | | | | | | | | + +Fields not described below remain unchanged from version 2. + +Start Time Support (6 bits) + +This field is used to advertise the start time options supported by the sending node. + +Regular schedules MUST support the advertised start time options. The Override Schedule SHOULD support the advertised start time options. The Override Schedule MUST NOT support the Recurring Mode. [This field MUST be treated as a bitmask and MUST be encoded according to Table 114](04.88-schedule-command-class-version-3.md#4883-schedule-supported-report-command) + +Table 114. Start Time Support encoding + +| Category | Bit | Indicates support for | Version | +| --- | --- | --- | --- | +| Start Time option | 0 | Start now. Refer to 4.86.4.1 | 1 | +| | 1 | Start Hour and Minute. Refer to 4.86.4.2 | 1 | +| | 2 | Calendar time. Refer to 4.86.4.3 | 1 | +| | 3 | Weekdays. Refer to 4.86.4.4 | 1 | +| | 4 | Time from now. Refer to 4.88.3.1 | 3 | +| Start Time mode | 5 | Recurring Mode. Refer to 4.88.3.2 | 3 | + +Each bit indicates the support for a given Start Time option or mode. + +The value 1 MUST indicate that the node supports the corresponding start time option/mode. The value 0 MUST indicate that the node does not support the corresponding start time option/mode. + +While support is advertised as a bitmap, the actual functionality is triggered by different combinations of Schedule Set start time fields. The following subsections outline the mandatory supported combinations when advertising support for the corresponding option. + +### 4.88.3.1 Start Time option: Start from now + +The start now option is used to make a configured schedule start after the indicated time has elapsed from the reception of the Schedule Set Command. + +The Start from now option MUST cause a schedule to be activated at the specified relative time measured from the reception of the Schedule Set Command and run for the specified duration. + +A node supporting the Time from now option MUST support the creation of a schedule with the following start time fields’ combination: Relative = ‘1’ and YYMMDD = 0xFF, 0x00, Days, Weekdays = 0x00, HH:MM = Hours:Minutes + +A receiving node MUST ignore all combinations which do not comply with the one above if the Relative flag is set. A node supporting this option is NOT REQUIRED to support the Start hour and Minute option or Calendar time option even though it MUST be able to read the start day, start hour and start minutes fields when using this option. + +### 4.88.3.2 Start Time mode: Recurring Mode + +This mode is used to trigger a schedule repeatedly at fixed intervals. When using this mode, a schedule will start at the specified start time and will restart after a given time has elapsed since the last activation. + +The recurring mode is configured with the Recurrence Offset and Recurrence Mode fields of the Schedule Set Command. + +A node supporting the Recurring Mode MUST support at least one start time option. + +## 4.88.4 Schedule Set Command + +This command is used to create a new schedule or modify an existing schedule + +This command MUST enable the schedule if a new schedule is created. This command MUST NOT change the enabled/disabled state of existing schedules. + +If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SET _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule ID Block | | | | | | | | +| Start Year | | | | | | | | +| Recurrence Offset | | | | Start Month | | | | +| Res. | Recurrence Mode | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | +| Duration Type | | | Start Hour | | | | | +| Res. | Relative | Start Minute | | | | | | +| Duration Byte 1 MSB | | | | | | | | +| Duration Byte 2 LSB | | | | | | | | +| Reports to Follow | | | | | | | | +| Number of Cmd to Follow | | | | | | | | +| Cmd Length 1 | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | +| … | | | | | | | | +| Cmd Byte 1 - N | | | | | | | | +| … | | | | | | | | +| Cmd Length P | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | +| … | | | | | | | | +| Cmd Byte P - N | | | | | | | | + +Fields not described below remain unchanged from version 2. Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +### 4.88.4.1 Recurrence fields + +The recurrence settings of a schedule are set by the following fields: + + Recurrence Mode  Recurrence Offset + +These fields MUST be ignored by a node advertising no support for the Recurring Mode start time mode in the Schedule Supported Report Command. + +Recurrence mode (2 bits) + +This field is used to specify the unit of the Recurrence Offset field. + +[This field MUST comply with Table 115.](04.88-schedule-command-class-version-3.md#48841-recurrence-fields) + +Table 115. Recurrence Mode encoding + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | The recurrence Offset is expressed in Hours | 3 | +| 0x01 | The recurrence Offset is expressed in Days | 3 | +| 0x02 | The recurrence Offset is expressed in Weeks | 3 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +This field MUST be ignored if the Recurrence Offset field is set to 0. + +Recurrence Offset (4 bits) + +This field is used to specify the interval at which the recurring schedule will be triggered. + +[This field MUST be encoded according to Table 116 and MUST be interpreted together with the](04.88-schedule-command-class-version-3.md#48841-recurrence-fields) Recurrence Mode field. + +Table 116. Recurrence Offset encoding + +| Offset | Description | +| --- | --- | +| 0 | Recurrence Disabled | +| 1..15 | Repeat every 1..15 hour, day or week The unit (hour, day or week) is indicated by the Recurrence Mode field. | + +When a schedule starts due to its start time options, it MUST restart the current recurrence timer. It means that a schedule MUST start every time the start time condition is met and the recurrence offset MUST trigger the schedule to restart based on the last time it started. For example, a schedule set to start on the 1 st of each month with a 2 day recurrence offset MUST start on the 1, 3, 5 …, 27, 29, 31 and will start again the next month on the 1, 3, etc. st rd th th th st st rd + +A receiving node MUST accept a schedule set to start in the past if recurrence is enabled. In this case, the recurrence MUST trigger the schedule to restart based on the time it should have been started last. + +### 4.88.4.2 Start time fields + +The Schedule start time is defined by the following fields: + + Start Year  Start Month  Start Day of Month  Start Weekday  Start Hour  Start Minute  Relative + +[A receiving node MUST support the start time fields combinations indicated in sections 4.86.4.1,](04.86-schedule-command-class-version-1/04.86.04-schedule-supported-report-command.md#48641-start-time-option-start-now) [4.86.4.2 4.86.4.3, 4.86.4.4 and 4.88.3.1 if the corresponding start time option is supported.](04.86-schedule-command-class-version-1/04.86.04-schedule-supported-report-command.md#48642-start-time-option-hour-and-minute) + +If none of the start time fields are specified, the schedule MUST start immediately if the start now option is supported. In this case, the schedule MUST NOT be activated again at a later time unless receiving another Schedule Set Command. + +Relative (1 bit) + +This field is used to indicate if the schedule start time is using the start from now start option. + +The value 1 MUST indicate that the start time fields MUST be interpreted as the time left before the [schedule starts. In this case, the start time fields MUST be set and interpreted as indicated in 4.88.3.1](04.88-schedule-command-class-version-3.md#48831-start-time-option-start-from-now) and the schedule MUST NOT be activated again at a later time unless receiving another Schedule Set Command. + +The value 0 MUST indicate that the start time fields MUST be interpreted as an absolute start time for the schedule. + +## 4.88.5 Schedule Get Command + +This command is used to request the configuration for a specific schedule ID. + +The Schedule Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE GET _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule ID Block | | | | | | | | +| AID RO CTL _ _ | Reserved | | | | | | | + +Fields not described below remain unchanged from version 2. + +Active_ID / Recurrence Offset control (AID_RO_CTL) (1 bit) + +This field is used to request either the Active_ID or the Recurrence Offset value in the Schedule Report Command which is returned in response to this command. + +A receiving node MUST return a Schedule Report Command advertising the Active_ID of the Schedule if this field is set to 0. + +A receiving node MUST return a Schedule Report Command advertising the Recurrence Offset of the schedule if this field is set to 1. + +## 4.88.6 Schedule Report Command + +The Schedule Report Command is used to advertise the configuration for a specific schedule. + +| 7 | 6 | 5 | | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE REPORT _ | | | | | | | | | +| Schedule ID | | | | | | | | | +| Schedule ID Block | | | | | | | | | +| Start Year | | | | | | | | | +| Active ID/Recurrence Offset (AID RO) _ _ | | | | | Start Month | | | | +| AID RO C _ _ TL | Recurrence Mode | | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | | +| Duration Type | | | | Start Hour | | | | | +| Res. | Relative | | Start Minute | | | | | | +| Duration Byte 1 | | | | | | | | | +| Duration Byte 2 | | | | | | | | | +| Report to Follow | | | | | | | | | +| Number of Cmd to Follow | | | | | | | | | +| Cmd Length 1 | | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte 1 – N | | | | | | | | | +| … | | | | | | | | | +| Cmd Length P | | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte P - N | | | | | | | | | + +Fields not described below remain unchanged from version 2. + +Active_ID/Recurrence Offset (AID_RO) (4 bits) + +This field is used to advertise the Active_ID or the Recurrence Offset of the advertised schedule. + +[If this field carries the Active_ID value, this field MUST be encoded according to Table 113.](04.86-schedule-command-class-version-1/04.86.11-schedule-state-report-command.md#48611-schedule-state-report-command) [If this field carries the Recurrence Offset, this field MUST be encoded according to Table 116 and MUST](04.88-schedule-command-class-version-3.md#48841-recurrence-fields) be interpreted together with the Recurrence Mode field. + +Active_ID / Recurrence Offset control (AID_RO_CTL) (1 bit) + +This field is used to indicate whether the Active_ID or the Recurrence Offset value is advertised in the command. + +The value 0 MUST indicate that the Active_ID/Recurrence Offset (AID_RO) field carried the Active_ID value. + +The value 1 MUST indicate that the Active_ID/Recurrence Offset (AID_RO) field carried the Recurrence Offset value. + +Recurrence mode (2 bits) + +This field is used to specify the Recurrence Offset unit. + +This field MUST be ignored if the AID_RO_CTL field is set to 0. + +[This field MUST comply with Table 115 if the AID_RO_CTL field is set to 1.](04.88-schedule-command-class-version-3.md#48841-recurrence-fields) diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.89-schedule-command-class-version-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.89-schedule-command-class-version-4.md new file mode 100644 index 0000000..c0ce1f6 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.89-schedule-command-class-version-4.md @@ -0,0 +1,275 @@ + +# 4.89 Schedule Command Class, version 4 + +The Schedule Command Class, version 4 allows supporting nodes to advertise the list of commands they support for scheduling. + +## 4.89.1 Compatibility considerations + +The Schedule Command Class version 4 introduces the possibility to advertise the list of command supported for scheduling and explicitly allows scheduling extended command classes. The following commands are introduced: + + Schedule Supported Commands Get Command  Schedule Supported Commands Report Command + +The following functionalities become obsoleted: + + Redundant values in the Active_ID field encoding  The Report to Follow field. + +A supporting node no longer needs to be able to parse and handle several commands in order to set or report schedules or schedules states. Supporting nodes MUST use the Transport Service Command Class, version 2 in order to transmit long Z-Wave payloads. + +A node supporting the Schedule Command Class, version 4 MUST also support version 3. Commands and fields not mentioned in this version MUST remain unchanged from version 3. + +## 4.89.2 Schedule Supported Report Command + +This command is used to advertise the scheduling properties of a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SUPPORTED REPORT (0x02) _ _ | | | | | | | | +| Number of Supported Schedule IDs | | | | | | | | +| Support Enable/Di sable | Fall- back Support | Start Time Support | | | | | | +| Number of supported CC | | | | | | | | +| Supported CC 1 | | | | | | | | +| Reserved | | | | | | Supported Command 1 | | +| … | | | | | | | | +| Supported CC N | | | | | | | | +| Reserved | | | | | | Supported Command N | | + +| Override Support | Supported Override Types | +| --- | --- | +| Schedule ID Block | | +| Number of Supported Schedule Blocks | | + +All fields not described below remain unchanged from version 3. + +Supported Command (N * 2 bits) + +This field MUST advertise the supported commands for the command class entry. This field MUST [comply with Table 117.](04.89-schedule-command-class-version-4.md#4892-schedule-supported-report-command) + +Table 117. Schedule Supported Report v4::Supported Command + +| Value | Description | Version | +| --- | --- | --- | +| 0x00 | All Commands within the Command Class are supported | 1 | +| 0x01 | Only Set Commands are supported | 1 | +| 0x02 | Only Get Commands are supported | 1 | +| 0x03 | Custom list of commands are supported. | 4 | + +Certain command classes commands do not contain the string “Set” or “Get” in their name. Nodes MUST consider all commands mandating to return a response to be of type “Get” and all other commands to be of type “Set”. + +The length of this field in bytes MUST be according to the Number of supported CC field value. + +A supporting node MUST NOT advertise the 0x03 value if the list of supported command can be advertised with the other values. + +If a sending node advertises 0x03 for a given Schedule ID Block and Command Class, a controlling node SHOULD retrieve the exact list of supported commands using the Schedule Supported Commands Get Command. + +## 4.89.3 Schedule Supported Commands Get Command + +This command is used to query the list of commands that can be scheduled within for a given command class and Schedule ID Block. + +The Schedule Supported Commands Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SUPPORTED COMMANDS GET (0x0A) _ _ _ | | | | | | | | +| Schedule ID Block | | | | | | | | + +Schedule ID Block (8 bits) + +This field is used to request a particular Schedule ID Block. + +If a non-supported Schedule ID Block is specified, a receiving node SHOULD return a response for the Schedule ID block 1. + +## 4.89.4 Schedule Supported Commands Report Command + +This command is used to advertise the list of commands that can be scheduled within a given Schedule ID Block + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SUPPORTED COMMANDS REPORT (0x0B) _ _ _ | | | | | | | | +| Schedule ID Block | | | | | | | | +| Command Class List Length | | | | | | | | +| Command Class 1 (1 or 2 bytes) | | | | | | | | +| Supported Command List Length 1 | | | | | | | | +| Supported Command 1 – 1 | | | | | | | | +| … | | | | | | | | +| Supported Command 1 – K | | | | | | | | +| … | | | | | | | | +| Command Class N (1 or 2 bytes) | | | | | | | | +| Supported Command List Length N | | | | | | | | +| Supported Command N – 1 | | | | | | | | +| … | | | | | | | | +| Supported Command N – K | | | | | | | | + +Schedule ID Block (8 bits) + +This field is used to specify the requested Schedule ID Block. + +Command Class List Length (8 bit) + +This field is used to advertise the number of command classes contained in the command. + +This field MUST be set to the number of Command Class entries present in this command (represented by N in the command structure). + +Command Class (8 or 16 bits) + +This field is used to indicate the command class to which the advertised commands belong. This field MAY carry extended Command Classes Supported Command List Length (8 bits) + +This field is used to advertise how many commands are advertised in the current Command Class’ list. + +This field MUST be set to the number of Supported Commands present in the current Command Class entry (represented by K in the command structure). + +Supported Command (K bytes) + +This field is used to advertise the list of commands for the given Command Class entry that can be scheduled for the actual Schedule ID Block. + +The length of this field in bytes MUST be according to the corresponding Supported Command List Length field value. + +## 4.89.5 Schedule Set Command + +This command is used to create a new schedule or modify an existing schedule. + +This command MUST enable the schedule if a new schedule is created. + +This command MUST NOT change the enabled/disabled state of existing schedules + +If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. + +A controlling node using previous versions may try to schedule unsupported commands. In this case, a receiving node MUST ignore the Schedule Set Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | +| Command = SCHEDULE SET (0x03) _ | | | | | | | | +| Schedule ID | | | | | | | | +| Schedule ID Block | | | | | | | | +| Start Year | | | | | | | | +| Recurrence Offset | | | | Start Month | | | | +| Res. | Recurrence Mode | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | +| Duration Type | | | Start Hour | | | | | +| Res. | Relative | Start Minute | | | | | | +| Duration Byte 1 MSB | | | | | | | | +| Duration Byte 2 LSB | | | | | | | | +| Reports to Follow [OBSOLETED] | | | | | | | | +| Number of Cmd to Follow | | | | | | | | +| Cmd Length 1 | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | +| … | | | | | | | | +| Cmd Byte 1 - N | | | | | | | | +| … | | | | | | | | +| Cmd Length P | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | +| … | | | | | | | | +| Cmd Byte P - N | | | | | | | | + +Fields not described below remain unchanged from version 3. Reports to Follow (8 bits) [OBSOLETED] + +This field has been OBSOLETED: a sending node MUST use the Transport Service Command Class in order to set a schedule containing commands payload too large to fit in the Z-Wave MAC frame size. + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.89.6 Schedule Report Command + +The Schedule Report Command is used to advertise the configuration for a specific schedule. + +| 7 | 6 | 5 | | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE REPORT (0x05) _ | | | | | | | | | +| Schedule ID | | | | | | | | | +| Schedule ID Block | | | | | | | | | +| Start Year | | | | | | | | | +| Active ID/Recurrence Offset (AID RO) _ _ | | | | | Start Month | | | | +| AID RO C _ _ TL | Recurrence Mode | | | Start Day of Month | | | | | +| Res. | Start Weekday | | | | | | | | +| Duration Type | | | | Start Hour | | | | | +| Res. | Relative | | Start Minute | | | | | | +| Duration Byte 1 | | | | | | | | | +| Duration Byte 2 | | | | | | | | | +| Report to Follow [OBSOLETED] | | | | | | | | | +| Number of Cmd to Follow | | | | | | | | | +| Cmd Length 1 | | | | | | | | | +| Cmd Byte 1 - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte 1 – N | | | | | | | | | +| … | | | | | | | | | +| Cmd Length P | | | | | | | | | +| Cmd Byte P - 1 | | | | | | | | | +| … | | | | | | | | | +| Cmd Byte P - N | | | | | | | | | + +Fields not described below remain unchanged from version 3. Active_ID/Recurrence Offset (4 bits) + +This field is used to advertise the Active_ID or the Recurrence Offset of the advertised schedule. + +[If this field carries the Active_ID value, this field MUST be encoded according to Table 118.](04.89-schedule-command-class-version-4.md#4897-schedule-state-report-command) + +[If this field carries the Recurrence Offset, this field MUST be encoded according to Table 116 and MUST](04.88-schedule-command-class-version-3.md#48841-recurrence-fields) be interpreted together with the Recurrence Mode field. + +Reports to Follow (8 bits) [OBSOLETED] + +This field has been OBSOLETED: a sending node MUST use the Transport Service Command Class in order to report a schedule containing commands payload too large to fit in the Z-Wave MAC frame size. + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.89.7 Schedule State Report Command + +This command is used to advertise the status of all schedules supported by the specified schedule block. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | +| Command = SCHEDULE STATE REPORT (0x09) _ _ | | | | | | | | | +| Number of Supported Schedule ID | | | | | | | | | +| Reports to Follow [OBSOLETED] | | | | | | | Override | | +| Active ID 2 _ | | | | Active ID 1 _ | | | | | +| … | | | | | | | | | +| Active ID N _ | | | | Active ID N-1 _ | | | | | +| Schedule ID Block | | | | | | | | | + +Fields not described below remain unchanged from version 3. + +Reports to Follow (7 bits) [OBSOLETED] + +This field has been OBSOLETED: a sending node MUST use the Transport Service Command Class in order to advertise an Active_ID field too large to fit in the Z-Wave MAC frame size. + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Active_ID (N * 4 bits) + +The Active_ID field MUST be used to advertise the status for each supported schedule ID. Four bits are used for each Schedule ID to indicate the status. This means that : + + Bits 0 to 3 in Active_ID byte 1 represent Schedule ID = 1,.  Bits 4 to 7 in Active_ID byte 1 represent Schedule ID = 2  Bits 0 to 3 in Active_ID byte 2 represent Schedule ID = 3  … + +The size of this field MUST be the smallest number of bytes needed to advertise the number of supported Schedule IDs advertised in this command. + +[Each 4 bits unit MUST be encoded according to Table 118.](04.89-schedule-command-class-version-4.md#4897-schedule-state-report-command) + +Table 118. Active_ID encoding, version 4 + +| Hex | Description | Description | Version | +| --- | --- | --- | --- | +| 0x00 | Not used | The Schedule ID is not used (not set/configured) or unsupported. | 1 | +| 0x01 | [OBSOLETED] Override + Not used | [OBSOLETED] A sending node MUST NOT use this status and MUST use 0x00 instead (and the override field set to 1 for the Schedule State Report Command). | 4 | +| 0x02 | Not Active | The Schedule ID is used, enabled and currently not active. | 1 | +| 0x03 | Active | The Schedule ID is used, enabled and currently active. | 1 | +| 0x04 | Disabled | The Schedule ID is used and disabled. | 1 | +| 0x05 | Override + Active | The Schedule ID is used, enabled and should currently be active but it is suspended by the Override Schedule The override field MUST be set to 1 when using this status in the Schedule State Report Command | 1 | +| 0x06 | [OBSOLETED] Override + Not Active | [OBSOLETED] A sending node MUST NOT use this status and MUST use 0x02 instead. (and the override field set to 1 for the Schedule State Report Command). | 4 | +| 0x07 | [OBSOLETED] Override + Disabled | [OBSOLETED] A sending node MUST NOT use this status and MUST use 0x04 instead. (and the override field set to 1 for the Schedule State Report Command). | 4 | + +CC:0053.04.09.11.006 Override + Not A sending node MUST NOT use this status and MUST use 0x00 + +CC:0053.04.09.11.008 Override + Not A sending node MUST NOT use this status and MUST use 0x02 + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.79-schedule-entry-lock-command-class-version-1-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.90-schedule-entry-lock-command-class-version-1-deprecated.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.79-schedule-entry-lock-command-class-version-1-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.90-schedule-entry-lock-command-class-version-1-deprecated.md index e93f9a2..82c4462 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.79-schedule-entry-lock-command-class-version-1-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.90-schedule-entry-lock-command-class-version-1-deprecated.md @@ -1,11 +1,11 @@ -# 4.79 Schedule Entry Lock Command Class, version 1 [DEPRECATED] +# 4.90 Schedule Entry Lock Command Class, version 1 [DEPRECATED] THIS COMMAND CLASS HAS BEEN DEPRECATED @@ -19,18 +19,18 @@ Example: A homeowner has a Secure Keypad Door Lock and a dog that needs walking The Year Day schedule is an extended schedule that allows two points in time to be specified that is beyond a daily schedule. A particular slot can span weeks, months or years. Once the end point is reached that schedule slot is no longer valid because it is out of range. -Example: A homeowner is going away on vacation for two weeks. The homeowner could give the nd th neighbor a keypad code to the neighbor that would be active from April 2, 2008 to April 16 2008. The th code would be invalid after April 16 2008. +Example: A homeowner is going away on vacation for two weeks. The homeowner could give the neighbor a keypad code to the neighbor that would be active from April 2 nd, 2008 to April 16 th 2008. The code would be invalid after April 16 2008. th -## 4.79.1 Schedule Entry Lock Enable Set Command +## 4.90.1 Schedule Entry Lock Enable Set Command This command enables or disables schedules for a specified user code ID. It affects only the schedules associated with the specific user ID. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK ENABLE SET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Enabled | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK ENABLE SET _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Enabled | | | | | | | | User Identifier (8 bits) @@ -38,30 +38,30 @@ The User Identifier is used to recognize the user identity. A valid User Identif Enabled (8 bits) -Table 113, Schedule Entry Lock Enable Set:: Enabled encoding +Table 119, Schedule Entry Lock Enable Set:: Enabled encoding -| | Value | | Description | | -| --- | --- | --- | --- | --- | -| 0x00 | | | Schedule for the user identified is disabled | | -| 0x01 | | | Schedule for the user identified is enabled | | +| Value | Description | +| --- | --- | +| 0x00 | Schedule for the user identified is disabled | +| 0x01 | Schedule for the user identified is enabled | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. -## 4.79.2 Schedule Entry Lock Enable All Set Command +## 4.90.2 Schedule Entry Lock Enable All Set Command This command enables or disables all schedules for type Entry Lock. -| | 7 | 6 | | | 5 | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK ENABLE ALL SET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | -| Enabled | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK ENABLE ALL SET _ _ _ _ _ | | | | | | | | +| Enabled | | | | | | | | Enabled (8 bits) See description in Schedule Entry Lock Enable Set Command. -## 4.79.3 Schedule Entry Lock Supported Get Command +## 4.90.3 Schedule Entry Lock Supported Get Command This command is used to request the number of schedule slots each type of schedule the device supports for every user. @@ -69,21 +69,21 @@ The Schedule Entry Lock Supported Report Command MUST be returned in response to This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | 6 | | | 5 | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY TYPE SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY TYPE SUPPORTED GET _ _ _ _ | | | | | | | | -## 4.79.4 Schedule Entry Lock Supported Report Command +## 4.90.4 Schedule Entry Lock Supported Report Command This command is used to report the number of supported schedule slots an Entry Lock schedule device supports for each user in the system. It lists how many schedule slots there are for Week Days type and how many slots for the Year Day type. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY TYPE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Slots Week Day | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Slots Year Day | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY TYPE SUPPORTED REPORT _ _ _ | | | | | | | | +| Number of Slots Week Day | | | | | | | | +| Number of Slots Year Day | | | | | | | | Number of Slots Week Day (8 bits) @@ -93,7 +93,7 @@ Number of Slots Year Day (8 bits) A number from 0 – 255 that represents how many different schedule slots are supported for every user in the system for type Year Day. -## 4.79.5 Schedule Entry Lock Week Day Schedule Set Command +## 4.90.5 Schedule Entry Lock Week Day Schedule Set Command This command set or erase a weekday schedule for a identified user who already has valid user access code. @@ -101,27 +101,27 @@ When setting, the week day schedule is automatically enabled and the identified Note: Each user can only use one type of scheduling at a time. -| | 7 | | 6 | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK WEEK DAY SET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Set Action | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | -| Day of Week | | | | | | | | | | | | | | | | | | | | | | -| Start Hour | | | | | | | | | | | | | | | | | | | | | | -| Start Minute | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK WEEK DAY SET _ _ _ _ _ | | | | | | | | +| Set Action | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | +| Day of Week | | | | | | | | +| Start Hour | | | | | | | | +| Start Minute | | | | | | | | +| Stop Hour | | | | | | | | +| Stop Minute | | | | | | | | Set Action (8 bits) -Table 114, Schedule Entry Lock Week Day Schedule Set::Set Action encoding +Table 120, Schedule Entry Lock Week Day Schedule Set::Set Action encoding -| Set Action | | Description | | -| --- | --- | --- | --- | -| 0 | Erase the schedule slot | | | -| 1 | Modify the schedule slot for the identified user | | | +| Set Action | Description | +| --- | --- | +| 0 | Erase the schedule slot | +| 1 | Modify the schedule slot for the identified user | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. @@ -131,11 +131,11 @@ The User Identifier is used to recognize the user identity. A valid User Identif Schedule Slot ID (8 bits) -A value from 1 to Number of Slots Week Day Supported. +A value from 1 to Number of Slots Week Day Supported. Day of Week (8 bits) -Day of Week (8 bits) +A value from 0 to 6 where 0 is Sunday. -A value from 0 to 6 where 0 is Sunday. Start Hour (8 bits) +Start Hour (8 bits) A value from 0 to 23 representing the starting hour of the time fence. @@ -151,7 +151,7 @@ Stop Minute (8 bits) A value from 0 to 59 representing the stop minute of the time fence -## 4.79.6 Schedule Entry Lock Week Days Schedule Get Command +## 4.90.6 Schedule Entry Lock Week Days Schedule Get Command This command gets a week day schedule slot for a identified user and specified schedule slot ID. @@ -159,12 +159,12 @@ The Schedule Entry Lock Week Days Schedule Report Command MUST be returned in re This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK WEEK DAY GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK WEEK DAY GET _ _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | User Identifier (8 bits) @@ -174,64 +174,64 @@ Schedule Slot ID (8 bits) A value from 1 to Number of Slots Week Day Supported. -## 4.79.7 Schedule Entry Lock Week Day Schedule Report Command +## 4.90.7 Schedule Entry Lock Week Day Schedule Report Command This command returns week day schedule report for the requested schedule slot ID for identified user. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK WEEK DAY REPORT _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | -| Day of Week | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK WEEK DAY REPORT _ _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | +| Day of Week | | | | | | | | +| Start Hour | | | | | | | | +| Start Minute | | | | | | | | +| Stop Hour | | | | | | | | +| Stop Minute | | | | | | | | Refer to the description under the Schedule Set Week Day Schedule. Note: If a requested schedule slot is erased/empty, the time fields SHOULD be set to 0xFF. -## 4.79.8 Schedule Entry Lock Year Day Schedule Set Command +## 4.90.8 Schedule Entry Lock Year Day Schedule Set Command This command sets or erases a schedule slot for a identified user who already has valid user access code. The year day schedule represents two days, any time apart, where the specified user ID’s code is valid. When setting the schedule slot, the start parameters of the time fence needs to occur prior to the stop parameters and the year day schedule is automatically enabled for the identified user. When erasing, the user code does not change from year day scheduling. Note: Each user can only use one type of scheduling at a time. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK YEAR DAY SET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Set Action | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK YEAR DAY SET _ _ _ _ _ | | | | | | | | +| Set Action | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | +| Start Year | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour | | | | | | | | +| Start Minute | | | | | | | | +| Stop Year | | | | | | | | +| Stop Month | | | | | | | | +| Stop Day | | | | | | | | +| Stop Hour | | | | | | | | +| Stop Minute | | | | | | | | Set Action (8 bits) -Table 115, Schedule Entry Lock Year Day Schedule Set:: Set Action encoding +Table 121, Schedule Entry Lock Year Day Schedule Set:: Set Action encoding -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Erase the schedule slot | | | -| 0x01 | | | Modify the schedule slot for the identified user | | | +| Value | Description | +| --- | --- | +| 0x00 | Erase the schedule slot | +| 0x01 | Modify the schedule slot for the identified user | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. -User Identifier (8 bits) +User Identifier (8 bits) The User Identifier is used to recognize the user identity. A valid User Identifier MUST be a value starting from 1 to the maximum number of users supported by the device; refer to the User Code Command Class. If the user identifier is out of range, the command will be ignored -The User Identifier is used to recognize the user identity. A valid User Identifier MUST be a value starting from 1 to the maximum number of users supported by the device; refer to the User Code Command Class. If the user identifier is out of range, the command will be ignored Schedule Slot ID (8 bits) +Schedule Slot ID (8 bits) A value from 1 to Number of Slots Year Day Supported. @@ -275,7 +275,7 @@ Stop Minute (8 bits) A value from 0 to 59 representing the stop minute of the time fence -## 4.79.9 Schedule Entry Lock Year Day Schedule Get Command +## 4.90.9 Schedule Entry Lock Year Day Schedule Get Command This command gets a year/day schedule slot for an identified user and specified schedule slot ID. @@ -283,12 +283,12 @@ The Schedule Entry Lock Year Day Schedule Report Command MUST be returned in res This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK YEAR DAY GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK YEAR DAY GET _ _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | User Identifier (8 bits) @@ -298,26 +298,26 @@ Schedule Slot ID (8 bits) A value from 1 to Number of Slots Year Day Supported. -## 4.79.10 Schedule Entry Lock Year Day Schedule Report Command +## 4.90.10 Schedule Entry Lock Year Day Schedule Report Command This command returns year/day schedule report for the requested schedule slot ID for the identified user. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK YEAR DAY REPORT _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK YEAR DAY REPORT _ _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | +| Start Year | | | | | | | | +| Start Month | | | | | | | | +| Start Day | | | | | | | | +| Start Hour | | | | | | | | +| Start Minute | | | | | | | | +| Stop Year | | | | | | | | +| Stop Month | | | | | | | | +| Stop Day | | | | | | | | +| Stop Hour | | | | | | | | +| Stop Minute | | | | | | | | Refer to the description under Schedule Set Year Day Schedule command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.80-schedule-entry-lock-command-class-version-2-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.91-schedule-entry-lock-command-class-version-2-deprecated.md similarity index 58% rename from docs/specs/command-class-specification/04-command-class-definitions/04.80-schedule-entry-lock-command-class-version-2-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.91-schedule-entry-lock-command-class-version-2-deprecated.md index 89a7307..d929ace 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.80-schedule-entry-lock-command-class-version-2-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.91-schedule-entry-lock-command-class-version-2-deprecated.md @@ -1,23 +1,21 @@ -# 4.80 Schedule Entry Lock Command Class, version 2 [DEPRECATED] +# 4.91 Schedule Entry Lock Command Class, version 2 [DEPRECATED] THIS COMMAND CLASS HAS BEEN DEPRECATED A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Schedule Command Class. If implementing this command class, it is RECOMMENDED that the Schedule Command Class is also implemented. -The Schedule Entry Lock Command Class provides Z-Wave devices the capability to exchange scheduling information. The Schedule Entry Lock Type Commands are for controlling the schedules of an Entry Lock using schedule based user code Ids. The Entry Lock supports two types of schedules for each user ID supported in the device. The two schedule types are a time-fenced weekly schedule and a time-fenced one-time range schedule. When these schedules are configured and enabled, it allows the specified user ID’s code to be active during the time intervals configured in the scheduling slots. - -In Version 2 local time is used instead of UTC time, and Time Offset commands are added. +The Schedule Entry Lock Command Class provides Z-Wave devices the capability to exchange scheduling information. The Schedule Entry Lock Type Commands are for controlling the schedules of an Entry Lock using schedule based user code Ids. The Entry Lock supports two types of schedules for each user ID supported in the device. The two schedule types are a time-fenced weekly schedule and a time-fenced one-time range schedule. When these schedules are configured and enabled, it allows the specified user ID’s code to be active during the time intervals configured in the scheduling slots. In Version 2 local time is used instead of UTC time, and Time Offset commands are added. The commands not mentioned here remain the same as in version 1. -## 4.80.1 Schedule Entry Lock Time Offset Get Command +## 4.91.1 Schedule Entry Lock Time Offset Get Command This command is used to request time zone offset and daylight savings parameters. @@ -25,22 +23,22 @@ The Schedule Entry Lock Time Offset Report Command MUST be returned in response This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK TIME OFFSET GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK TIME OFFSET GET _ _ _ _ _ | | | | | | | | -## 4.80.2 Schedule Entry Lock Time Offset Set Command +## 4.91.2 Schedule Entry Lock Time Offset Set Command This command is used to set the current local TZO and DST offsets into an Entry Lock Device. Any schedules that are already in the device before or after issuing the Schedule Entry Time Offset Set command are now assumed to be programmed in the Local time set by this command. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK TIME OFFSET SET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sign TZO | | | Hour TZO | | | | | | | | | | | | | | | | | | | | | -| Minute TZO | | | | | | | | | | | | | | | | | | | | | | | | -| Sign Offset DST | | | Minute Offset DST | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK TIME OFFSET SET _ _ _ _ _ | | | | | | | | +| Sign TZO | Hour TZO | | | | | | | +| Minute TZO | | | | | | | | +| Sign Offset DST | Minute Offset DST | | | | | | | Sign TZO (1 bit) @@ -48,9 +46,7 @@ Plus (0) or minus (1) sign to indicate a positive or negative offset from UTC. Hour TZO (7 bits) -Specify the number of hours that the originating time zone deviates from UTC. Refer to the DST field regarding daylight savings handling. - -Minute TZO (7 bits) +Specify the number of hours that the originating time zone deviates from UTC. Refer to the DST field regarding daylight savings handling. Minute TZO (7 bits) Specify the number of minutes that the originating time zone deviates UTC. Refer to the DST field regarding daylight savings handling. @@ -62,16 +58,16 @@ Minute Offset DST (7 bits) This field MUST specify the number of minutes the time is to be adjusted when daylight savings mode is enabled. -## 4.80.3 Schedule Entry Lock Time Offset Report Command +## 4.91.3 Schedule Entry Lock Time Offset Report Command This command is used to advertise the time zone offset and daylight savings parameters. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK TIME OFFSET REPORT _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sign TZO | | | Hour TZO | | | | | | | | | | | | | | | | | | | | | -| Minute TZO | | | | | | | | | | | | | | | | | | | | | | | | -| Sign Offset DST | | | Minute Offset DST | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK TIME OFFSET REPORT _ _ _ _ _ | | | | | | | | +| Sign TZO | Hour TZO | | | | | | | +| Minute TZO | | | | | | | | +| Sign Offset DST | Minute Offset DST | | | | | | | Refer to description under the Schedule Entry Lock Time Offset Set command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.81-schedule-entry-lock-command-class-version-3-deprecated.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.92-schedule-entry-lock-command-class-version-3-deprecated.md similarity index 51% rename from docs/specs/command-class-specification/04-command-class-definitions/04.81-schedule-entry-lock-command-class-version-3-deprecated.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.92-schedule-entry-lock-command-class-version-3-deprecated.md index adfe896..a657316 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.81-schedule-entry-lock-command-class-version-3-deprecated.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.92-schedule-entry-lock-command-class-version-3-deprecated.md @@ -1,11 +1,11 @@ -# 4.81 Schedule Entry Lock Command Class, Version 3 [DEPRECATED] +# 4.92 Schedule Entry Lock Command Class, Version 3 [DEPRECATED] THIS COMMAND CLASS HAS BEEN DEPRECATED @@ -13,17 +13,17 @@ A device MAY implement this command class, but it is RECOMMENDED that new implem The Schedule Entry Lock Command Class provides a scheduling type alongside the existing types Week Day and Year Day. The new type is similar to Week Day functionality but provides a simpler implementation to repeat a time slot daily (selected days) and repeat those days weekly. The commands not mentioned here remain the same as in Version 2. -## 4.81.1 Schedule Entry Type Supported Report Command +## 4.92.1 Schedule Entry Type Supported Report Command This command is used to report the number of supported schedule slots an Entry Lock schedule device supports for each user in the system. It lists how many schedule slots there are for Week Day, Year Day, and Daily Repeating types. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY TYPE SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Slots Week Day | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Slots Year Day | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Slots Daily Repeating | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY TYPE SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Number of Slots Week Day | | | | | | | | +| Number of Slots Year Day | | | | | | | | +| Number of Slots Daily Repeating | | | | | | | | Number of Slots Week Day (8 bits) @@ -37,7 +37,7 @@ Number of Slots Daily Repeating (8 bits) A number from 0 to 255 that represents how many different schedule slots are supported for every user in the system for type Daily Repeating Day. -## 4.81.2 Schedule Entry Lock Daily Repeating Set Command +## 4.92.2 Schedule Entry Lock Daily Repeating Set Command This command is used to set or erase a daily repeating schedule for an identified user who already has valid user access code. @@ -45,27 +45,27 @@ When setting; the daily repeating schedule is automatically enabled for the iden Note: Each user can only use one type of scheduling at a time. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK DAILY REPEATING SET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Set Action | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | -| Week Day Bitmask | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK DAILY REPEATING SET _ _ _ _ _ | | | | | | | | +| Set Action | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | +| Week Day Bitmask | | | | | | | | +| Start Hour | | | | | | | | +| Start Minute | | | | | | | | +| Duration Hour | | | | | | | | +| Duration Minute | | | | | | | | Set Action (8 bits) -Table 116, Schedule Entry Lock Daily Repeating Set:: Set Action encoding +Table 122, Schedule Entry Lock Daily Repeating Set:: Set Action encoding -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Erase the schedule slot | | | -| 0x01 | | | Modify the schedule slot for the identified user | | | +| Value | Description | +| --- | --- | +| 0x00 | Erase the schedule slot | +| 0x01 | Modify the schedule slot for the identified user | All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. @@ -75,15 +75,15 @@ The User Identifier is used to recognize the user identity. A valid User Identif Schedule Slot ID (8 bits) -A value from 1 to Number of Slots Daily Repeating Supported. +A value from 1 to Number of Slots Daily Repeating Supported. Week Day Bitmask (8 bits) -Week Day Bitmask (8 bits) +A bitmask of the days of the week for this schedule entry is active. -A bitmask of the days of the week for this schedule entry is active. Table 117, Schedule Entry Lock Daily Repeating Set:: Week Day Bitmask encoding +Table 123, Schedule Entry Lock Daily Repeating Set:: Week Day Bitmask encoding -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Res | | | Sat | | | Fri | | | Thr | | | Wed | | | Tue | | | Mon | | | Sun | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Res | Sat | Fri | Thr | Wed | Tue | Mon | Sun | Bit 7 6 5 4 3 2 1 0 @@ -107,7 +107,7 @@ Duration Minute (8 bits) A value from 0 to 59 representing how many minutes the time fence will last past the Duration Hour field. -## 4.81.3 Schedule Entry Lock Daily Repeating Get Command +## 4.92.3 Schedule Entry Lock Daily Repeating Get Command This command is used to request a daily repeating schedule slot for a identified user and specified schedule slot ID. @@ -115,33 +115,35 @@ The Schedule Entry Lock Daily Repeating Report Command MUST be returned in respo This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK DAILY REPEATING GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK DAILY REPEATING GET _ _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | User Identifier (8 bits) -The User Identifier is used to recognize the user identity. A valid User Identifier MUST be a value starting from 1 to the maximum number of users supported by the device; refer to the User Code Command Class. If the user identifier is out of range, the command will be ignored Schedule Slot ID (8 bits) +The User Identifier is used to recognize the user identity. A valid User Identifier MUST be a value starting from 1 to the maximum number of users supported by the device; refer to the User Code Command Class. If the user identifier is out of range, the command will be ignored + +Schedule Slot ID (8 bits) A value from 1 to Number of Slots Daily Repeating Supported. -## 4.81.4 Schedule Entry Lock Daily Repeating Report +## 4.92.4 Schedule Entry Lock Daily Repeating Report This command is used to return the requested schedule slot ID for identified user. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE ENTRY LOCK DAILY REPEATING REPORT _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule Slot ID | | | | | | | | | | | | | | | | | | | | | | | | -| Week Day Bitmask | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Hour | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCHEDULE ENTRY LOCK _ _ _ _ | | | | | | | | +| Command = SCHEDULE ENTRY LOCK DAILY REPEATING REPORT _ _ _ _ _ | | | | | | | | +| User Identifier | | | | | | | | +| Schedule Slot ID | | | | | | | | +| Week Day Bitmask | | | | | | | | +| Start Hour | | | | | | | | +| Start Minute | | | | | | | | +| Duration Hour | | | | | | | | +| Duration Minute | | | | | | | | Refer to the description under the Schedule Set Daily Repeating Schedule. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.93-screen-attributes-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.93-screen-attributes-command-class-version-1.md new file mode 100644 index 0000000..38711d4 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.93-screen-attributes-command-class-version-1.md @@ -0,0 +1,65 @@ + +# 4.93 Screen Attributes Command Class, version 1 + +The Screen Attribute Command Class is used to retrieve screen attributes from the device hosting the screen. This allows another device to send data formatted according to the screen attributes to the device hosting the screen. The screen may be located on any device in the network. + +## 4.93.1 Screen Attributes Get Command + +This command is used to request the screen attributes. + +The Screen Attributes Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCREEN ATTRIBUTES _ _ _ | | | | | | | | +| Command = SCREEN ATTRIBUTES GET _ _ | | | | | | | | + +## 4.93.2 Screen Attributes Report Command + +This command is used to advertise the screen attributes. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCREEN ATTRIBUTES _ _ _ | | | | | | | | +| Command = SCREEN ATTRIBUTES REPORT _ _ | | | | | | | | +| Reserved | | | Number of Lines | | | | | +| Characters per Line | | | | | | | | +| Line Buffer Size | | | | | | | | +| Character Encoding | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Number of Lines (5 bits) + +Number of lines the screen supports (1..16). + +Characters per Line (8 bits) + +Number of characters the screen supports on each line (1..255). Line Buffer Size (8 bits) + +Number of characters the line buffer supports for each line (1..255). Size of line buffer will always be equal or larger than the number of visual characters per line. The text will typically scroll in case it is larger than the number of visual characters. + +Character Encoding (8 bits) + +The screen supports the following numerical representations of a character: + +Table 124, Screen Attributes Report::Character Encoding encoding + +| Bit Map | Description | +| --- | --- | +| Bit 0 | Supports ASCII codes if the bit is 1 and the opposite if 0. See APPENDIX A (values 128-255 are ignored) | +| Bit 1 | Supports ASCII codes and Extended ASCII codes if the bit is 1 and the opposite if 0. See APPENDIX A | +| Bit 2 | Supports Unicode UTF-16 if the bit is 1 and the opposite if 0. | +| Bit 3 | Supports ASCII codes and Player codes, see APPENDIX A (undefined values are ignored) | + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.94-screen-attributes-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.94-screen-attributes-command-class-version-2.md new file mode 100644 index 0000000..433289b --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.94-screen-attributes-command-class-version-2.md @@ -0,0 +1,54 @@ + +# 4.94 Screen Attributes Command Class, version 2 + +The Screen Attribute Command Class, version 2 introduces the Screen Timeout of the Screen Attributes Command. + +Details not mentioned remain the same as in version 1. + +## 4.94.1 Screen Attributes Report Command + +This command is used to advertise the screen attributes. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCREEN ATTRIBUTES _ _ _ | | | | | | | | +| Command = SCREEN ATTRIBUTES REPORT _ _ | | | | | | | | +| Reserved | | Escape Sequence | Number of Lines | | | | | +| Characters per Line | | | | | | | | +| Line Buffer Size | | | | | | | | +| Character Encoding | | | | | | | | +| Screen Timeout | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Escape Sequence(1 bit) + +If set to 0, escape sequences are not supported by the device. If set to 1, escape sequences are supported by the device. + +Number of Lines (5 bits) + +Number of lines the screen supports (1..16). + +Characters per Line (8 bits) + +Number of characters the screen supports on each line (1..255). + +Line Buffer Size (8 bits) + +Number of characters the line buffer supports for each line (1..255). Size of line buffer will always be equal or larger than the number of visual characters per line. The text will typically scroll in case it is larger than the number of visual characters. + +Character Encoding (8 bits) + +[This field MUST be encoded according to Table 124](04.93-screen-attributes-command-class-version-1.md#4932-screen-attributes-report-command) + +All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. + +Screen Timeout (8 bits) + +If Screen Timeout is set to 0, the display is always on. A value larger than 0 MUST specify the display timeout in seconds. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.95-screen-meta-data-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.95-screen-meta-data-command-class-version-1.md new file mode 100644 index 0000000..f569fdd --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.95-screen-meta-data-command-class-version-1.md @@ -0,0 +1,141 @@ + +# 4.95 Screen Meta Data Command Class, version 1 + +The Screen Meta Data Command Class is used to streaming data containing user related information to a screen located on a device in a Z-Wave network. The screen can request single or multiple data packets. The device having the data containing user related information to the screen can also initiate the data streaming. + +In order not to congest the Z-Wave network, large data transfers MUST leave transmit opportunities for other nodes in the network. If sending a command longer than two frames, a node MUST implement a delay between every transmitted frame. The minimum required time delay and number of frames before a delay must be inserted depends on the actual bit rate. + + 40 kbit/s: At least 35 ms if sending more than 2 frames back-to-back  100 kbit/s: At least 15 ms if sending more than 2 frames back-to-back + +## 4.95.1 Screen Meta Data Get Command + +This command is used to request the Screen Meta Data Report Command. The Screen Meta Data Get Command is used as handshake to avoid buffer overflow in the receiving node. The Screen Meta Data Get Command will optionally be able to request multiple Screen Meta Data Report Commands to improve the effective bandwidth. + +The Screen Meta Data Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCREEN MD _ _ _ | | | | | | | | +| Command = SCREEN MD GET _ _ | | | | | | | | +| Number of Reports | | | | | | | | +| NodeID | | | | | | | | + +Number of Reports (8 bits) + +Number of Screen Meta Data Report Commands to be received without requesting each Screen Meta Data Report Command (1..255). Be aware of overflow when requesting multiple reports. + +NodeID (8 bits) + +The NodeID (1..232) specifies the device to receive the requested reports. In case NodeID is equal to 0x00, the information is requested by the source NodeID of the Screen Meta Data Get Command. + +## 4.95.2 Screen Meta Data Report Command + +This command is used to send data to the device hosting the screen. + +The size of the payload SHOULD NOT be bigger than 48 bytes. It is possible to write characters to multiple lines in the same frame. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCREEN MD _ _ _ | | | | | | | | +| Command = SCREEN MD REPORT _ _ | | | | | | | | +| More Data | Reser- ved | Screen Settings | | | Character Encoding | | | +| Line Settings A | | | Clear A | Line Number A | | | | +| Character Position A | | | | | | | | +| Number of Characters A | | | | | | | | +| Character 1,A | | | | | | | | +| … | | | | | | | | +| Character N,A | | | | | | | | +| … | | | | | | | | +| Line Settings B | | | Clear B | Line Number B | | | | +| Character Position B | | | | | | | | +| Number of Characters B | | | | | | | | +| Character 1,B | | | | | | | | +| … | | | | | | | | +| Character N,B | | | | | | | | + +More Data (1 bit) + +The more data bit indicates if additional reports are expected before the whole data streaming is completed. If the more data bit is set to 1 then additional reports are expected and the opposite if 0. Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Screen Settings (3 bits) + +[This field MUST comply with Table 125:](04.95-screen-meta-data-command-class-version-1.md#4952-screen-meta-data-report-command) + +Table 125, Screen Meta Data Report::Screen Settings encoding + +| Screen Settings | Description | +| --- | --- | +| 0 | Whole screen is cleared before lines are written | +| 1 | Current content on screen is scrolled one line down | +| 2 | Current content on screen is scrolled one line up | +| 7 | Do not change the current content on the screen | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Character Encoding (3 bits) + +[This field MUST comply with Table 126:](04.95-screen-meta-data-command-class-version-1.md#4952-screen-meta-data-report-command) + +Table 126, Screen Meta Data Report::Character Encoding encoding + +| Character Encoding | Description | +| --- | --- | +| 0 | Using standard ASCII codes, see APPENDIX A (values 128-255 are ignored) | +| 1 | Using standard ASCII codes and OEM Extended ASCII codes, see APPENDIX A | +| 2 | Unicode UTF-16 | +| 3 | Using standard ASCII codes and Player codes, see APPENDIX A (undefined values are ignored) | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Note: Devices supporting Unicode UTF-16 characters are described by a 2 byte long decimal representation. The first byte is the most significant byte. E.g. if there is one Unicode character in the set frame the char 1 will be MSB and char 2 will be LSB of the Unicode character. Line Settings (3 bits) + +[This field MUST comply with Table 127:](04.95-screen-meta-data-command-class-version-1.md#4952-screen-meta-data-report-command) + +Table 127, Screen Meta Data Report::Line Settings encoding + +| Line Settings | Description | +| --- | --- | +| 0 | Characters are written in selected font | +| 1 | Characters are written as highlighted | +| 2 | Characters are written using a larger font compared to line settings equal to 0 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Clear (1 bit) + +Determine if the characters are written directly or line is cleared first. + +Table 128, Screen Meta Data Report::Clear encoding + +| Clear | Description | +| --- | --- | +| 0 | Characters are written directly | +| 1 | Line is cleared before characters are written | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Line Number (4 bits) + +The line number field indicates the line to write the characters to counting from zero (0..15). + +Character Position (8 bits) + +The character position field indicates where on the line to write the characters counting from zero (0..255). The character position may be larger than the display size in case the line buffer is bigger (See the Screen Attributes Report Command). + +Number of Characters (8 bits) + +The number of characters field indicates how many characters to be written on the screen for the specified line number, counting from 1. + +Character (N bytes) + +The character fields hold the string to output in specified character representation. Characters will be ignored in case there is no room left in the line buffer. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.96-screen-meta-data-command-class-version-2.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.96-screen-meta-data-command-class-version-2.md new file mode 100644 index 0000000..14d5996 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.96-screen-meta-data-command-class-version-2.md @@ -0,0 +1,101 @@ + +# 4.96 Screen Meta Data Command Class, version 2 + +The Screen Meta Data Command Class, version 2 introduces a Screen Timeout bit. The support for the Screen Timeout bit may be advertised by the Screen Attribute Command Class, version 2. + +Details not mentioned remain the same as in version 1. + +## 4.96.1 Screen Meta Data Report Command + +This command is used to transfer data to the device hosting the screen. The size of the payload MUST NOT be bigger than 48 bytes. It is possible to write characters to multiple lines in the same frame. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SCREEN MD _ _ _ | | | | | | | | +| Command = SCREEN MD REPORT _ _ | | | | | | | | +| More Data | Ex- tended Setup | Screen Settings | | | Character Encoding | | | +| Line Settings A | | | Clear A | Line Number A | | | | +| Character Position A | | | | | | | | +| Number of Characters A | | | | | | | | +| Character 1,A | | | | | | | | +| … | | | | | | | | +| Character N,A | | | | | | | | +| … | | | | | | | | +| Line Settings B | | | Clear B | Line Number B | | | | +| Character Position B | | | | | | | | +| Number of Characters B | | | | | | | | +| Character 1,B | | | | | | | | +| … | | | | | | | | +| Character N,B | | | | | | | | +| Reserved | | | | | | | Screen Timeout | + +More Data (1 bit) + +The more data bit indicates if additional reports are expected before the whole data streaming is completed. If the more data bit is set to 1 then additional reports are expected and the opposite if 0. Extended Setup (1 bit) + +If set to true, the last byte of the payload defines an extended setup. + +Screen Settings (3 bits) + +[The screen settings identifier MUST be encoded according to Table 125.](04.95-screen-meta-data-command-class-version-1.md#4952-screen-meta-data-report-command) + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Character Encoding (3 bits) + +[The Character Encoding identifier MUST be encoded according to Table 126.](04.95-screen-meta-data-command-class-version-1.md#4952-screen-meta-data-report-command) + +Note: Devices supporting Unicode UTF-16 characters are described by a 2 byte long decimal representation. The first byte is the most significant byte. E.g. if there is one Unicode character in the set frame the char 1 will be MSB and char 2 will be LSB of the Unicode character. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Line Settings (3 bits) + +[The line settings identifier MUST be encoded according to Table 129.](04.96-screen-meta-data-command-class-version-2.md#4961-screen-meta-data-report-command) + +Table 129, Screen Meta Data Report version 2::Line Settings encoding + +| Line Settings | Description | Version | +| --- | --- | --- | +| 0 | Characters are written in selected font | 1 | +| 1 | Characters are written as highlighted | 1 | +| 2 | Characters are written using a larger font compared to line settings equal to 0 | 1 | +| 3 | Characters are written using a larger font (font B) & highlighted | 2 | +| 4 | Characters are written in selected font (font A), no scroll | 2 | +| 5 | Characters are written in selected font (font A) & highlighted, no scroll | 2 | +| 6 | Characters are written using a larger font (font B), no scroll | 2 | +| 7 | Characters are written using a larger font (font B) & highlighted, no scroll | 2 | + +For values 0-3, text will be scrolled. For values 4-7 the text will not be scrolled, and will be truncated if it is longer than the width of the display. + +Clear (1 bit) + +[Determine if the characters are written directly or line is cleared first. Refer to Table 128](04.95-screen-meta-data-command-class-version-1.md#4952-screen-meta-data-report-command) + +Line Number (4 bits) + +The line number field indicates the line to write the characters to counting from zero (0..15). + +Character Position (8 bits) + +The character position field indicates where on the line to write the characters counting from zero (0..255). The character position MAY be larger than the display size in case the line buffer is bigger (See the Screen Attributes Report Command). + +Number of Characters (8 bits) + +The number of characters field indicates how many characters to be written on the screen for the specified line number, counting from 1. + +Character (N bytes) + +The character fields hold the string to output in specified character representation. Characters will be ignored in case there is no room left in the line buffer. If the Escape Sequence Bit is true in the SCREEN_ATTRIBUTES_REPORT Command, the device supports advanced display features by making escape sequences in the form of an Escape char followed by a char value 0..255. Screen Timeout (1 bit) + +If the screen timeout is set to 0 the preset timeout SHOULD be used. + +If set to 1 the device SHOULD keep the display powered. This does not affect the RF. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.86-sensor-configuration-command-class-version-1-obsoleted.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.97-sensor-configuration-command-class-version-1-obsoleted.md similarity index 58% rename from docs/specs/command-class-specification/04-command-class-definitions/04.86-sensor-configuration-command-class-version-1-obsoleted.md rename to docs/specs/application-command-class-specification/04-command-class-definitions/04.97-sensor-configuration-command-class-version-1-obsoleted.md index 8f3245e..4812f5a 100644 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.86-sensor-configuration-command-class-version-1-obsoleted.md +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.97-sensor-configuration-command-class-version-1-obsoleted.md @@ -1,11 +1,11 @@ -# 4.86 Sensor Configuration Command Class, version 1 [OBSOLETED] +# 4.97 Sensor Configuration Command Class, version 1 [OBSOLETED] THIS COMMAND CLASS HAS BEEN OBSOLETED @@ -19,7 +19,7 @@ Most movement sensors may be configured to "ignore" movement if it is not dark. A device supporting the Sensor Configuration Command Class may be configured via the trigger level, but the decision on what the level change should trigger is up to the application. For the movement sensor this trigger level could be an input parameter to the logic that controls the light. -## 4.86.1 Sensor Trigger Level Set Command +## 4.97.1 Sensor Trigger Level Set Command This command is used to set different triggers to either a specified value or to the current measured value. The Command also supports to restore a factory default value. @@ -27,16 +27,16 @@ All configurable trigger types and values MUST be mapped directly from the Multi It is RECOMMENDED that all combinations of precision, scale and size parameters are supported. The Set command MUST support same format of precision, scale and size parameters as can be returned in the report command. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR TRIGGER LEVEL SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Current | | | Reserved | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Trigger Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Trigger Value N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | +| Command = SENSOR TRIGGER LEVEL SET _ _ _ | | | | | | | | +| Default | Current | Reserved | | | | | | +| Sensor Type | | | | | | | | +| Precision | | | Scale | | Size | | | +| Trigger Value 1 | | | | | | | | +| … | | | | | | | | +| Trigger Value N | | | | | | | | Default (1 bit) @@ -68,7 +68,7 @@ Trigger Value (N bytes) Refer to the Multilevel Sensor Report Command for information on what trigger values to set. -## 4.86.2 Sensor Trigger Level Get Command +## 4.97.2 Sensor Trigger Level Get Command This command can request the stored trigger level. @@ -76,37 +76,37 @@ The Sensor Trigger Level Report Command MUST be returned in response to this com This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR TRIGGER LEVEL GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | +| Command = SENSOR TRIGGER LEVEL GET _ _ _ | | | | | | | | -## 4.86.3 Sensor Trigger Level Report Command +## 4.97.3 Sensor Trigger Level Report Command This command returns the stored trigger value. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR TRIGGER LEVEL REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Trigger Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Trigger Value N | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | +| Command = SENSOR TRIGGER LEVEL REPORT _ _ _ | | | | | | | | +| Sensor Type | | | | | | | | +| Precision | | | Scale | | Size | | | +| Trigger Value 1 | | | | | | | | +| … | | | | | | | | +| Trigger Value N | | | | | | | | For fields’ description, refer to the Sensor Trigger Level Set Command. -## 4.86.4 Mapping example +## 4.97.4 Mapping example The report structure of the Multilevel Sensor Command Class can be mapped direct into the Sensor Configuration Set Command Class. This example frame below will set the trigger level in the receiving node to 10.25 degree Celsius. -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR TRIGGER LEVEL SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Default(0) | | | Current(0) | | | Reserved | | | | | | | | | | | | | | | | | | -| Temperature (0x01) | | | | | | | | | | | | | | | | | | | | | | | | -| Precision (010b) | | | | | | | | | Celsius (00b) | | | | | | Size (010b) | | | | | | | | | -| 0x04 | | | | | | | | | | | | | | | | | | | | | | | | -| 0x01 | | | | | | | | | | | | | | | | | | | | | | | | +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SENSOR CONFIGURATION _ _ _ | | | | | | | | +| Command = SENSOR TRIGGER LEVEL SET _ _ _ | | | | | | | | +| Default(0) | Current(0) | Reserved | | | | | | +| Temperature (0x01) | | | | | | | | +| Precision (010b) | | | Celsius (00b) | | Size (010b) | | | +| 0x04 | | | | | | | | +| 0x01 | | | | | | | | diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.98-simple-av-control-command-class-version-1-4.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.98-simple-av-control-command-class-version-1-4.md new file mode 100644 index 0000000..2d79fb0 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.98-simple-av-control-command-class-version-1-4.md @@ -0,0 +1,136 @@ + +# 4.98 Simple AV Control Command Class, version 1-4 + +The Simple AV Control Command Class is used to control an AV device in a Z-Wave network. The Simple AV Control Command Class is suited for IR remote replacement. Furthermore, this command class supports Windows Vista Media Center and Media Center 2005 remote controls. + +## 4.98.1 Simple AV Control Set Command + +This command is used to control an AV device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | +| Command = SIMPLE AV CONTROL SET _ _ _ | | | | | | | | +| Sequence Number | | | | | | | | +| Reserved | | | | | Key Attributes | | | +| Reserved [OBSOLETED] | | | | | | | | +| Reserved [OBSOLETED] | | | | | | | | +| Command MSB,1 | | | | | | | | +| Command LSB,1 | | | | | | | | +| … | | | | | | | | +| Command MSB,N | | | | | | | | +| Command LSB,N | | | | | | | | + +Sequence Number (8 bits) + +The sequence number is incremented each time a Simple AV Control Set Command is issued. The receiving node uses the sequence number to ignore duplicates. + +Key Attributes (3 bits) + +The key attributes specifies the state of the key. Currently the following key attribute definitions exist: + +Table 130, Simple AV Control Set::Key Attributes encoding + +| Key Attribute | Description | +| --- | --- | +| 0x00 | Key Down – Sent when a new key is pressed. It is mandatory to send a Simple AV Control Set Command when this event occurs. | +| 0x01 | Key Up – Sent when the key is released. It is optional to send a Simple AV Control Set Command when this event occurs. Only the sequence number and key attribute parameter is changed in the Command. | +| 0x02 | Keep Alive – Sent every 100-200ms while the key is still held down. Event used as a failsafe feature for the ramping function, e.g. avoid volume jumps to maximum in case a key up event is not received. The keep alive event can also be used to control the speed of the ramping function, e.g. the first few seconds of the key held down is the speed slow and afterwards will it gradually accelerate. It is optional to send a Simple AV Control Set Command when this event occurs. Only the sequence number and key attribute parameter is changed in the Command. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Un-supported key attribute values MUST be ignored. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Command MSB, Command LSB (N * 16 bits) + +This field is used to carry the AV Control command. + +[Each 16 bits-unit MUST carry a defined AV Control code. Refer to [19] for the defined AV Control codes. Values not defined in [19] are reserved and MUST NOT be used.](04.117-window-covering-command-class-version-1.md#411710-window-covering-stop-level-change-command) + +It is possible to specify a sequence of AV commands in one frame. If an AV control command is not supported, it MUST be ignored by a receiving node. + +Command numbers 1 through 40 are the most popular commands used in AV remotes. + +Command numbers 41 through 363 are less popular and is sorted in alphanumerical order. + +Support for Windows Vista Media Center and Media Center 2005 remote controls is added with command numbers from 364 to 377 including 16, 200 and 231. + +## 4.98.2 Simple AV Control Get Command + +This command is used to request the number of reports necessary to report the supported AC Commands from the device. + +The Simple AV Control Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | +| Command = SIMPLE AV CONTROL GET _ _ _ | | | | | | | | + +## 4.98.3 Simple AV Control Report Command + +This command is used to report the necessary number of reports to report the supported AC Commands from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | +| Command = SIMPLE AV CONTROL REPORT _ _ _ | | | | | | | | +| Number of reports | | | | | | | | + +Number of reports (8 bits) + +The number of reports necessary to report the entire list of supported AC Commands. + +## 4.98.4 Simple AV Control Supported Get Command + +This command is used to request the AV Commands supported by the AV device. + +The Simple AV Control Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | +| Command = SIMPLE AV CONTROL SUPPORTED GET _ _ _ _ | | | | | | | | +| Report No | | | | | | | | + +Report No (8 bits) + +Report no. field is used to request wanted report number. The report no. values MUST be a sequence starting from 1. + +## 4.98.5 Simple AV Control Supported Report Command + +This command is used to report the supported AC Commands from the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | +| Command = SIMPLE AV CONTROL SUPPORTED REPORT _ _ _ _ | | | | | | | | +| Report No | | | | | | | | +| Bit Mask 1 | | | | | | | | +| … | | | | | | | | +| Bit Mask N | | | | | | | | + +Report No (8 bits) + +Report no. field specify the request report number. + +Bit Mask (N bytes) + +The Bit Mask fields describe the supported AV Control Commands by the device. + + Bit 0 in Bit Mask 1 indicates if Command #1 is supported.  Bit 1 in Bit Mask 1 indicates if Command #2 is supported.  … + +If a Command is supported, the bit MUST be set to 1. If a Command is not supported, the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported Command #. Mask fields bigger than 45 bytes not allowed. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/04.99-sound-switch-command-class-version-1.md b/docs/specs/application-command-class-specification/04-command-class-definitions/04.99-sound-switch-command-class-version-1.md new file mode 100644 index 0000000..f242e66 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/04.99-sound-switch-command-class-version-1.md @@ -0,0 +1,275 @@ + +# 4.99 Sound Switch Command Class, version 1 + +The Sound Switch Command Class is used to manage nodes with a speaker or sound notification capability. It can be used for a doorbell, alarm clock, siren or any device issuing sound notifications. + +## 4.99.1 Terminology + +A Sound Switch is a sound notification device with pre-recorded tones. A tone can be a short sound effect as well as an entire song. The volume setting can be configured and the node will subsequently play tones using the configured volume for any tone. A default tone can also be configured, allowing the Sound Switch to play same sound when controlled by a node without the ability to select between tones. + +A Sound Switch node advertises a name and duration for each tone. This information is used to guide an end-user in its tone selection and helps controlling nodes to know when the tone is finished playing. + +## 4.99.2 Compatibility considerations + +[The Sound Switch Command Class is an actuator control Command Class. Refer to section 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) + +A node supporting this Command Class MUST support at least 1 tone. + +The implemented tone identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 tones MUST accept Tone Identifiers in the range 1..10. + +## 4.99.3 Sound Switch Tones Number Get Command + +This command is used to request the number of tones supported by the receiving node. + +The Sound Switch Tones Number Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONES NUMBER GET (0x01) _ _ _ _ | | | | | | | | + +## 4.99.4 Sound Switch Tones Number Report Command + +This command is used to advertise the number of tones supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONES NUMBER REPORT (0x02) _ _ _ _ | | | | | | | | +| Supported Tones | | | | | | | | + +Supported Tones (8 bits) + +This field MUST be set to the total amount of supported tones. + +This field MUST be in the range 1..254. + +## 4.99.5 Sound Switch Tone Info Get Command + +This command is used to query the information associated to a tone at a supporting node. + +The Sound Switch Tone Info Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE INFO GET (0x03) _ _ _ _ | | | | | | | | +| Tone Identifier | | | | | | | | + +Tone Identifier (8 bits) + +This field is used to specify the requested Tone Identifier. + +The implemented tone identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 tones MUST accept Tone Identifiers in the range 1..10. + +A sending node MUST specify a Tone Identifier that is supported by a receiving node, i.e. in the range 1..{Total number of supported tones}. A node receiving this command for an unsupported Tone Identifier or for Tone Identifier 0x00 MUST return a zero duration and a zero length name. + +## 4.99.6 Sound Switch Tone Info Report Command + +This command is used to advertise the information associated to a tone at a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE INFO REPORT (0x04) _ _ _ _ | | | | | | | | +| Tone Identifier | | | | | | | | +| Tone Duration 1 | | | | | | | | +| Tone Duration 2 | | | | | | | | +| Name Length | | | | | | | | +| Name 1 | | | | | | | | +| ... | | | | | | | | +| Name N | | | | | | | | + +Tone Identifier (8 bits) + +This field is used to advertise the Tone Identifier for which the associated information is being advertised. + +Tone Duration (16 bits) + +This field is used to advertise duration of the Tone Identifier. + +This field MUST indicate the time in seconds it takes to play the actual Tone Identifier. + +This field MUST be set to 0 if the Tone Identifier is set to 0x00 or a value higher than the total number of supported tones advertised in the Sound Switch Tones Number Report Command. + +Name Length (8 bits) + +This field indicates the length in bytes of the Name field. + +This field MUST be in the range 1..255 if the Tone Identifier is supported. + +This field MUST be set to 0 if the Tone Identifier is set to 0x00 or a value higher than the total number of supported tones advertised in the Sound Switch Tones Number Report Command. + +Name (N bytes) + +This field is used to indicate the assigned name or label for the actual Tone Identifier. + +The length of this field in bytes MUST comply with the advertised value in the Name Length field. This field MUST be omitted if the Name Length field is set to 0. + +The field MUST be formatted as a byte array with no zero termination. The characters MUST be encoded in UTF-8 format. + +## 4.99.7 Sound Switch Configuration Set Command + +This command is used to set the configuration for playing tones at the supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH CONFIGURATION SET (0x05) _ _ _ | | | | | | | | +| Volume | | | | | | | | +| Default Tone Identifier | | | | | | | | + +Volume (8 bits) + +This field is used to specify the volume at which the node will play tones. + +[The encoding of the Volume field MUST be according toTable 131.](04.99-sound-switch-command-class-version-1.md#4997-sound-switch-configuration-set-command) + +Table 131, Sound Switch Configuration Set::Volume encoding + +| Value | Description | +| --- | --- | +| 0 (0x00) | This value MUST indicate an Off/Mute volume setting (0%) | +| 1..100 (0x01..0x64) | These values MUST indicate the actual volume setting from respectively 1% to 100%. A supporting node MAY implement fewer than 100 hardware level. In this case, mapping of hardware levels MUST be monotonous. , i.e. a higher value MUST be mapped to either the same or a higher hardware level. | +| 255 (0xFF) | This value MUST indicate to restore most recent non-zero volume setting. This value MUST be ignored if the current volume is not zero (0x00). This value MAY be used to set the Default Tone Identifier and do not modify the volume setting | + +0 (0x00) This value MUST indicate an Off/Mute volume setting (0%) CC:0079.01.05.11.002 + +1..100 These values MUST indicate the actual volume setting from respectively 1% to CC:0079.01.05.11.003 + +CC:0079.01.05.11.004 255 (0xFF) This value MUST indicate to restore most recent non-zero volume setting. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Default Tone Identifier (8 bits) + +This field is used to specify the Default Tone. This Tone will be played if receiving the Sound Switch Tone Play Set Command for an unsupported value or for the 0xFF value. + +The value 0x00 MUST indicate that the receiving node MUST NOT update its current default tone and the command is sent to configure the volume only. + +Values in the range 1..{Total number of supported tones} MUST indicate that the receiving node MUST use the specified Identifier as Default Tone. + +Values higher than the Total number of supported tones advertised in the Sound Switch Tones Number Report Command MUST be ignored by a receiving node. + +## 4.99.8 Sound Switch Configuration Get Command + +This command is used to request the current configuration for playing tones at the supporting node. + +The Sound Switch Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH CONFIGURATION GET (0x06) _ _ _ | | | | | | | | + +## 4.99.9 Sound Switch Configuration Report Command + +This command is used to advertise the current configuration for playing tones at the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH CONFIGURATION REPORT (0x07) _ _ _ | | | | | | | | +| Volume | | | | | | | | +| Default Tone Identifer | | | | | | | | + +Volume (8 bits) + +This field is used to advertise the current volume setting at the sending node. + +This field MUST be in the range 0..100. Values in the range 0..100 MUST indicate the current volume percentage. + +Default Tone Identifier (8 bits) + +This field is used to advertise the current configured Default Tone. This Tone Identifier will be played if receiving a Sound Switch Tone Play Set Command for an unsupported value or for the 0xFF value. + +This field MUST be in the range 1..{Total number of supported Tones}. + +## 4.99.10 Sound Switch Tone Play Set Command + +This command is used to instruct a supporting node to play (or stop playing) a tone. + +The supporting node MUST play the specified tone immediately when receiving this command. + +A node already playing a tone MUST interrupt the current tone and start playing the tone specified in this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE PLAY SET (0x08) _ _ _ _ | | | | | | | | +| Tone identifier | | | | | | | | + +Tone Identifier (8 bits) + +This field is used to specify the tone that the receiving node MUST play. + +[This field MUST be encoded according to Table 132.](04.99-sound-switch-command-class-version-1.md#49910-sound-switch-tone-play-set-command) + +Table 132, Sound Switch Tone Play Set::Tone Identifier encoding + +| Value | Description | +| --- | --- | +| 0x00 | No Tone MUST be played. A supporting node MUST stop playing any tone when receiving this value. | +| 0x01..0xFE | A supporting node MUST play the specified Tone identifier using the configured volume setting. A node receiving a non-supported Tone Identifier (higher than the Total number of supported tones) MUST play the default tone using the configured volume setting. | +| 0xFF | The supporting node MUST play the default tone using the configured volume setting. | + +CC:0079.01.08.11.005 0x00 No Tone MUST be played. + +CC:0079.01.08.11.006 0x01..0xFE A supporting node MUST play the specified Tone identifier using the configured volume + +0xFF The supporting node MUST play the default tone using the configured volume setting. CC:0079.01.08.11.007 + +## 4.99.11 Sound Switch Tone Play Get Command + +This command is used to request the current tone being played by the receiving node. + +The Sound Switch Tone Play Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE PLAY GET (0x09) _ _ _ _ | | | | | | | | + +## 4.99.12 Sound Switch Tone Play Report Command + +This command is used to advertise the current tone being played by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | +| Command = SOUND SWITCH TONE PLAY REPORT (0x0A) _ _ _ _ | | | | | | | | +| Tone Identifier | | | | | | | | + +Tone Identifier (8 bits) + +This field MUST indicate which tone is currently being played by the sending node. This field MUST be in the range 0..{Total number of supported tones}. + +The value 0 MUST indicate that no Tone is currently being played. + +This field MUST be set to 0x00 by a sending node if the configured volume is 0x00 (muted). + +Values in the range 1..{Total number of supported tones} MUST indicate the Tone that is currently being played. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/application-command-class-specification/04-command-class-definitions/index.md b/docs/specs/application-command-class-specification/04-command-class-definitions/index.md new file mode 100644 index 0000000..57615a5 --- /dev/null +++ b/docs/specs/application-command-class-specification/04-command-class-definitions/index.md @@ -0,0 +1,130 @@ + +# 4 Command Class Definitions + +The following subchapters contain definitions of Application Command Classes. + +## Contents + +- [4.1 Alarm Command Class, version 1 [DEPRECATED]](04.01-alarm-command-class-version-1-deprecated.md) +- [4.2 Alarm Command Class, version 2 [DEPRECATED]](04.02-alarm-command-class-version-2-deprecated.md) +- [4.3 Alarm Sensor Command Class, version 1 [DEPRECATED]](04.03-alarm-sensor-command-class-version-1-deprecated.md) +- [4.4 Alarm Silence Command Class, version 1](04.04-alarm-silence-command-class-version-1.md) +- [4.5 All Switch Command Class, version 1 [OBSOLETED]](04.05-all-switch-command-class-version-1-obsoleted.md) +- [4.6 Anti-theft Command Class, version 1 [OBSOLETED]](04.06-anti-theft-command-class-version-1-obsoleted.md) +- [4.7 Anti-theft Command Class, version 2 [DEPRECATED]](04.07-anti-theft-command-class-version-2-deprecated.md) +- [4.8 Anti-theft Command Class, version 3](04.08-anti-theft-command-class-version-3.md) +- [4.9 Anti-theft Unlock Command Class, version 1](04.09-anti-theft-unlock-command-class-version-1.md) +- [4.10 Authentication Command Class, version 1](04.10-authentication-command-class-version-1/index.md) +- [4.11 Authentication Media Write Command Class, version 1](04.11-authentication-media-write-command-class-version-1.md) +- [4.12 Barrier Operator Command Class, version 1](04.12-barrier-operator-command-class-version-1.md) +- [4.13 Basic Command Class, version 1](04.13-basic-command-class-version-1.md) +- [4.14 Basic Command Class, version 2](04.14-basic-command-class-version-2.md) +- [4.15 Basic Tariff Information Command Class, version 1](04.15-basic-tariff-information-command-class-version-1.md) +- [4.16 Basic Window Covering Command Class, version 1 [OBSOLETED]](04.16-basic-window-covering-command-class-version-1-obsoleted.md) +- [4.17 Binary Sensor Command Class, version 1 [DEPRECATED]](04.17-binary-sensor-command-class-version-1-deprecated.md) +- [4.18 Binary Sensor Command Class, version 2 [DEPRECATED]](04.18-binary-sensor-command-class-version-2-deprecated.md) +- [4.19 Binary Switch Command Class, version 1](04.19-binary-switch-command-class-version-1.md) +- [4.20 Binary Switch Command Class, version 2](04.20-binary-switch-command-class-version-2.md) +- [4.21 Binary Toggle Switch Command Class, version 1 [OBSOLETED]](04.21-binary-toggle-switch-command-class-version-1-obsoleted.md) +- [4.22 Central Scene Command Class, version 1 [OBSOLETED]](04.22-central-scene-command-class-version-1-obsoleted.md) +- [4.23 Central Scene Command Class, version 2 [OBSOLETED]](04.23-central-scene-command-class-version-2-obsoleted.md) +- [4.24 Central Scene Command Class, version 3](04.24-central-scene-command-class-version-3.md) +- [4.25 Climate Control Schedule Command Class, version 1 [DEPRECATED]](04.25-climate-control-schedule-command-class-version-1-deprecated.md) +- [4.26 Clock Command Class, version 1](04.26-clock-command-class-version-1.md) +- [4.27 Color Switch Command Class, version 1](04.27-color-switch-command-class-version-1.md) +- [4.28 Color Switch Command Class, version 2](04.28-color-switch-command-class-version-2.md) +- [4.29 Color Switch Command Class, version 3](04.29-color-switch-command-class-version-3.md) +- [4.30 Configuration Command Class, version 1](04.30-configuration-command-class-version-1.md) +- [4.31 Configuration Command Class, version 2](04.31-configuration-command-class-version-2.md) +- [4.32 Configuration Command Class, version 3](04.32-configuration-command-class-version-3.md) +- [4.33 Configuration Command Class, version 4](04.33-configuration-command-class-version-4.md) +- [4.34 Controller Replication Command Class, version 1](04.34-controller-replication-command-class-version-1.md) +- [4.35 Demand Control Plan Configuration Command Class, version 1](04.35-demand-control-plan-configuration-command-class-version-1.md) +- [4.36 Demand Control Plan Monitor Command Class, version 1](04.36-demand-control-plan-monitor-command-class-version-1.md) +- [4.37 Door Lock Command Class, version 1-2](04.37-door-lock-command-class-version-1-2.md) +- [4.38 Door Lock Command Class, version 3](04.38-door-lock-command-class-version-3.md) +- [4.39 Door Lock Command Class, version 4](04.39-door-lock-command-class-version-4.md) +- [4.40 Door Lock Logging Command Class, version 1](04.40-door-lock-logging-command-class-version-1.md) +- [4.41 Energy Production Command Class, version 1](04.41-energy-production-command-class-version-1.md) +- [4.42 Entry Control Command Class, version 1](04.42-entry-control-command-class-version-1.md) +- [4.43 Generic Schedule Command Class, version 1](04.43-generic-schedule-command-class-version-1/index.md) +- [4.44 Geographic Location Command Class, version 1](04.44-geographic-location-command-class-version-1.md) +- [4.45 HRV Status Command Class, version 1](04.45-hrv-status-command-class-version-1.md) +- [4.46 HRV Control Command Class, version 1](04.46-hrv-control-command-class-version-1.md) +- [4.47 Humidity Control Mode Command Class, version 1-2](04.47-humidity-control-mode-command-class-version-1-2.md) +- [4.48 Humidity Control Operating State Command Class, version 1](04.48-humidity-control-operating-state-command-class-version-1.md) +- [4.49 Humidity Control Setpoint Command Class, version 1-2](04.49-humidity-control-setpoint-command-class-version-1-2.md) +- [4.50 IR Repeater Command Class, version 1](04.50-ir-repeater-command-class-version-1/index.md) +- [4.51 Irrigation Command Class, version 1](04.51-irrigation-command-class-version-1/index.md) +- [4.52 Language Command Class, version 1](04.52-language-command-class-version-1.md) +- [4.53 Lock Command Class, version 1 [DEPRECATED]](04.53-lock-command-class-version-1-deprecated.md) +- [4.54 Manufacturer Proprietary Command Class, version 1](04.54-manufacturer-proprietary-command-class-version-1.md) +- [4.55 Meter Command Class, version 1](04.55-meter-command-class-version-1.md) +- [4.56 Meter Command Class, version 2](04.56-meter-command-class-version-2.md) +- [4.57 Meter Command Class, version 3](04.57-meter-command-class-version-3.md) +- [4.58 Meter Command Class, version 4](04.58-meter-command-class-version-4.md) +- [4.59 Meter Command Class, version 5](04.59-meter-command-class-version-5.md) +- [4.60 Meter Command Class, version 6](04.60-meter-command-class-version-6.md) +- [4.61 Meter Table Configuration Command Class, version 1](04.61-meter-table-configuration-command-class-version-1.md) +- [4.62 Meter Table Monitor Command Class, version 1](04.62-meter-table-monitor-command-class-version-1/index.md) +- [4.63 Meter Table Monitor Command Class, version 2](04.63-meter-table-monitor-command-class-version-2.md) +- [4.64 Meter Table Monitor Command Class, version 3](04.64-meter-table-monitor-command-class-version-3.md) +- [4.65 Meter Table Push Configuration Command Class version 1](04.65-meter-table-push-configuration-command-class-version-1.md) +- [4.66 Move To Position Window Covering Command Class, version 1 [OBSOLETED]](04.66-move-to-position-window-covering-command-class-version-1-obsoleted.md) +- [4.67 Multilevel Sensor Command Class, version 1-4](04.67-multilevel-sensor-command-class-version-1-4.md) +- [4.68 Multilevel Sensor Command Class, Version 5-11](04.68-multilevel-sensor-command-class-version-5-11.md) +- [4.69 Multilevel Switch Command Class, version 1](04.69-multilevel-switch-command-class-version-1.md) +- [4.70 Multilevel Switch Command Class, version 2](04.70-multilevel-switch-command-class-version-2.md) +- [4.71 Multilevel Switch Command Class, version 3](04.71-multilevel-switch-command-class-version-3.md) +- [4.72 Multilevel Switch Command Class, version 4](04.72-multilevel-switch-command-class-version-4.md) +- [4.73 Multilevel Toggle Switch Command Class, version 1 [DEPRECATED]](04.73-multilevel-toggle-switch-command-class-version-1-deprecated.md) +- [4.74 Notification Command Class, version 3-8](04.74-notification-command-class-version-3-8/index.md) +- [4.75 Prepayment Command Class, version 1](04.75-prepayment-command-class-version-1.md) +- [4.76 Prepayment Encapsulation Command Class, version 1](04.76-prepayment-encapsulation-command-class-version-1.md) +- [4.77 Proprietary Command Class, version 1 [DEPRECATED]](04.77-proprietary-command-class-version-1-deprecated.md) +- [4.78 Protection Command Class, version 1](04.78-protection-command-class-version-1.md) +- [4.79 Protection Command Class, version 2](04.79-protection-command-class-version-2.md) +- [4.80 Pulse Meter Command Class, version 1 [DEPRECATED]](04.80-pulse-meter-command-class-version-1-deprecated.md) +- [4.81 Rate Table Configuration Command Class, version 1](04.81-rate-table-configuration-command-class-version-1.md) +- [4.82 Rate Table Monitor Command Class, version 1](04.82-rate-table-monitor-command-class-version-1.md) +- [4.83 Scene Activation Command Class, version 1](04.83-scene-activation-command-class-version-1.md) +- [4.84 Scene Actuator Configuration Command Class, version 1](04.84-scene-actuator-configuration-command-class-version-1.md) +- [4.85 Scene Controller Configuration Command Class, version 1](04.85-scene-controller-configuration-command-class-version-1.md) +- [4.86 Schedule Command Class, version 1](04.86-schedule-command-class-version-1/index.md) +- [4.87 Schedule Command Class, version 2](04.87-schedule-command-class-version-2.md) +- [4.88 Schedule Command Class, version 3](04.88-schedule-command-class-version-3.md) +- [4.89 Schedule Command Class, version 4](04.89-schedule-command-class-version-4.md) +- [4.90 Schedule Entry Lock Command Class, version 1 [DEPRECATED]](04.90-schedule-entry-lock-command-class-version-1-deprecated.md) +- [4.91 Schedule Entry Lock Command Class, version 2 [DEPRECATED]](04.91-schedule-entry-lock-command-class-version-2-deprecated.md) +- [4.92 Schedule Entry Lock Command Class, Version 3 [DEPRECATED]](04.92-schedule-entry-lock-command-class-version-3-deprecated.md) +- [4.93 Screen Attributes Command Class, version 1](04.93-screen-attributes-command-class-version-1.md) +- [4.94 Screen Attributes Command Class, version 2](04.94-screen-attributes-command-class-version-2.md) +- [4.95 Screen Meta Data Command Class, version 1](04.95-screen-meta-data-command-class-version-1.md) +- [4.96 Screen Meta Data Command Class, version 2](04.96-screen-meta-data-command-class-version-2.md) +- [4.97 Sensor Configuration Command Class, version 1 [OBSOLETED]](04.97-sensor-configuration-command-class-version-1-obsoleted.md) +- [4.98 Simple AV Control Command Class, version 1-4](04.98-simple-av-control-command-class-version-1-4.md) +- [4.99 Sound Switch Command Class, version 1](04.99-sound-switch-command-class-version-1.md) +- [4.100 Sound Switch Command Class, version 2](04.100-sound-switch-command-class-version-2.md) +- [4.101 Tariff Table Configuration Command Class, version 1](04.101-tariff-table-configuration-command-class-version-1.md) +- [4.102 Tariff Table Monitor Command Class, version 1](04.102-tariff-table-monitor-command-class-version-1.md) +- [4.103 Thermostat Fan Mode Command Class, version 1](04.103-thermostat-fan-mode-command-class-version-1.md) +- [4.104 Thermostat Fan Mode Command Class, Version 2](04.104-thermostat-fan-mode-command-class-version-2.md) +- [4.105 Thermostat Fan Mode Command Class, Version 3](04.105-thermostat-fan-mode-command-class-version-3.md) +- [4.106 Thermostat Fan Mode Command Class, Version 4-5](04.106-thermostat-fan-mode-command-class-version-4-5.md) +- [4.107 Thermostat Fan State Command Class, version 1-2](04.107-thermostat-fan-state-command-class-version-1-2.md) +- [4.108 Thermostat Mode Command Class, version 1-2](04.108-thermostat-mode-command-class-version-1-2.md) +- [4.109 Thermostat Mode Command Class, version 3](04.109-thermostat-mode-command-class-version-3.md) +- [4.110 Thermostat Operating State Command Class, version 1](04.110-thermostat-operating-state-command-class-version-1.md) +- [4.111 Thermostat Operating State Command Class, version 2](04.111-thermostat-operating-state-command-class-version-2.md) +- [4.112 Thermostat Setback Command Class, version 1](04.112-thermostat-setback-command-class-version-1.md) +- [4.113 Thermostat Setpoint Command Class, version 1-2](04.113-thermostat-setpoint-command-class-version-1-2.md) +- [4.114 Thermostat Setpoint Command Class, version 3](04.114-thermostat-setpoint-command-class-version-3.md) +- [4.115 User Code Command Class, version 1](04.115-user-code-command-class-version-1.md) +- [4.116 User Code Command Class, version 2](04.116-user-code-command-class-version-2/index.md) +- [4.117 Window Covering Command Class, version 1](04.117-window-covering-command-class-version-1.md) diff --git a/docs/specs/application-command-class-specification/assets/img-04d8f2ead1.png b/docs/specs/application-command-class-specification/assets/img-04d8f2ead1.png new file mode 100644 index 0000000000000000000000000000000000000000..8498f71a8fc5ae52c858b6b8dd50a6bb6f4dc8c5 GIT binary patch literal 49843 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

r`0TQjS%M{Hnu4g_9jRfMlG{=q;Fz`vAmuQ2 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%0DAmR}710T~UxVHmhUnjEZ(b5Q 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 literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-078228618f.png b/docs/specs/application-command-class-specification/assets/img-078228618f.png new file mode 100644 index 0000000000000000000000000000000000000000..420e51eefc9acc9a021b49f14a018c2e5e743710 GIT binary patch literal 164540 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 z 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

Y zf0>Q9BIJ8>XHL@48xsAZJQs@`=rO;`{4{PPQA~s0^mdQOLJc{2z)SSd?|)a!R5k5z z)uX@w07UMFo6TTX?AwVt^{5vrv|!xaZ`{{*+*xkgW!>4?>C}EI$J!~ca>45U(ft>} zDxD~cxAAKT9wMdlyTbDBFM6|~g5%^#iYb3O<)XAH@HJGZ zjS(I61G-Bm>*(a8HK`3+R1X`K@%wXN;hjkIrTc%4ahPYc z`$c|(Q%N^V{MVzo*;r9)f+nS(!z7xCT!1c{`%yF@whub@XU{$}K4`XEgKY-i!c*A+ zDFbU&)T9l^AQd=&d?ahm-_B#HJ_)@3#I>+Y(RQk8Xzr;w`K5 zsbnVrUy?8GL%*-d4q7ge-=9rq7({~v1ya9K;%lbe!aBoYg~5b$`R(;0QX}?l7ys)I zCAo4;G{)?mrN2xt$uTA5W$mc1FV^n*dnOn+F6%~UTVgc-iC_?iez97kw;!YrS0dTam6+5Jq@nyGAxiDg+zt?#D>q-|hwtyMJT4tAh_U&dcsl)K6&($_L+ELvfk0t|6!%22O zkwqYfxjKNUF|Wxi-aUEmTm)gyd!1;1v<^40eoXs#ctAal(fEQwfD%1}Ci3H<@5RZV z>_v`&UJSaD9-QGS>&5PzFi!<9R@(=7jHh9O7NbtLiZPk^L5^1hPf6%AOaoDSTGO}l zg2h+zUK6h0H&>Om;h#u#U9LU8AZ5M3SIw#OL`a0ouD*{lIvG-zV|4B{EhWVkDO3>I zNow~v^F1{|=qh;{pZ)#Y*vY9nHR3IqnCo@bM!Mwz=3#3%!&gHgP(btqC4|Fj zAd3#BZU59QcyV++UHU`&XuMzc9FUn`3kL(q!Uy6iQDvLBHs%ObW{3&&v_8swTebIV zGRDBcjpq`OdiB_o-)u>9iG(Cf!^I0Hm{a#1By78;cwZ^AcAkR-E0fX>`PkUl;vbV73QY%6vYH6|d~)K%o6VGrh)|_sL8y@CA#0#q~vCKAQJ0CZ>VPW9&Ux*ULc9P=hR6@Kkdrg8p4<;yz32X}x>hz2co1w4#y zGv9>8f`FjBdJ$q_n#53y50Q5|4;Adi6plu-yfRwwQ?F zurV0bUweDlq9viz=GgZ~gNeh(dYY8~pR%2%A*naMr$Nk_O=thE+$n{eVDc9|j4YOo z`$O1HWj-fj`e_&4EteULb=%&rj~{MuC<25aLOWS*Ef{I{_D)se~{il5ba zxnOt88voR$YibHFl#NaOYmzAO^mo;7Owf@N#s=jMizC&fkns>fGJ)#su^XqQoqoYD zs;fOkxm4O*w+puu#5Zbv@QmiQBFzw+pRatvuo^ySy&cHa_g?~o2<)EE^02~l22k7p zYaGB1gu=Xkl)Y1l0-B95@4atE3huW*elFySc!9+d4PyPth$wBwnBoK zm0Ls~+&`q69{0g5dreCy+Qm18BV~WrAhL?ie<3N?Cw!gtaWHy{@N&(i$zJyOUi4Ip zO})cyWyH{!GU1Pzv3KQ{R!=orqgG0egvMn3L#Sp2JONHfguC2+!QMd zqx=Z5{COPA9UsrxRQt1cy$bomq^~AjxCx)sco^gCH(&)j;CK#VlpBP;QraMCwPN#o z7XObXh=4F|KCEKIk{8exxQ%^v70KcE5ZiMcaJ`2)(a7b8if|Y_SMcH8#Yh^1nV=XP;HSKDGt>Zek97>czgi z3?3iT_w}B+TuWsc1>cELCs_PFuZpvdn|$T1c4xr1Jz+X`?Uxz37GUR>&y z{J*SvM=VqX(lE3U$|1m%#TN$?7Hn~KAy4dV&g&i;Wk7j+rhQQ`+G)gO>!PxHDDU<4 zte#0<-?A~=xG|)NWn_>!oj0mzuz-=$U?A&Fh5k0Lj=nj8*s5#l<(W?*m6vU5n zO%AhX-o6SA18@(wCSG4gWqJ%V6#tbL-QY?Ub>r%U}Fr9@a)>jbcBUb0n z5=2f65C%81G+YZgF$Rt@e|{yk^f5~RWc)i3x#8v@73}Nke^kuHMhE35z5jgCU=N?F zgY)tJ`m~6N7rjs5_A(`N`S!@4z?THTR+1r7jT&Z{$oZJq_A8~0;kV2AzvGY#)!2b6iD{tvGHAB zkS7LuqNbsj%>au(|AoJC<9`s-&KYAeru?qdQPJb7`FAC{LtC$s1j;f&isWOm$;^B_ zhjV#_$>{T(lA#8{Q^3oUj-2ro*E1$8`I3B`s>HJN7qH@n?VCY4k+hs%gFnZ+@C;&g zjCq}0%EJ0}2O{rQku{Xr(tQw8oD9BZ|RX}&mf1U6_S{bI4&O%s`bvCrO3&Fps0~u zFZpb*H2*JC^>wwQfYXX7nByk5{pAeu*_)Y&yfkngU{w*A|2;n+uJmW**IwJ$ihCC0 z6Hx}m3lMGXj`hljaeFKyK)IJC^m{>hhz8TJ{oC{A7F?<}SggwQ%cZKEYJf+;|1U;* zEG*)`X_gR7!t|1A{>2CVL9y0~L3`v6baQ@Fr(D_Fr)6O4(5>8pl^=MY)RphK-6u=h zdHJqrQv@iFFq-}nSNE~}LT&UgD$HygNpwU;)U?XF-3ZZU=OhSod&K}ATI{D*cbUa(4>y|s__M+0>I4vPx-gddwnR^4>E?_2G49Z~MTEU{=a zuj)T#*PCtp5uv5V)y&`_yO*g!tWa54mv7>-;IV|HuCZA9$w7j@u~Lzhg3ZnI)7BrU zFykrV@?G%}gCIeYul_~6-4i3-#-9KxLT@zn-#I~L-rfG)+1Dy8Z0t^t*Z}l5PP2}X z=m|EK$Z8PF_iIR?>esoV|730%1;2~pW8IxUUS^ur^B*l+(s4Z0pPaMD-0lX5)}h_@ zTafMqq$<+S@5w{jX%hsUt}HkLnK^#wkYAzE3vOg4C?UHPx9YCvmIXATN3A&PP*=Tp zN55THzZvCsasrqMs(DmT*KlC0h&fURsnf$6q0Pls&s8qUZOWlD8T<|l4|h+PR`2m* z<6iM8w(L2qT>l<$S>_> zFi0eBX-zDEE$0@GO9&EKZ_i%|QIkM3m5GayK0e%*9pOzBSg7?*{G=raRb z_%bb~ob3)oZBHdRWt_Zxpo*8e8-bB12{*re8i(X}G;wMO40mux)nU-qaDhGk3UNIQ zxQQf#6C-d|V!0Ou!rqeU$ZkPet`*O|LSggX7zQ8gwzC+a;7;UNyghRX)AYkO3UnDa zO-WkC4gjtZ-TFDsj`QT6`xdqMOGojoPmIUKJ%h;lld}B3_I^kwE6wW2PF9y+3u+c{9)M5^4Y_(!+!OLzA7H%WJi&^t4^YhfM@KMFiPI_=v$0YeU8CbAyW8{6C4#r!T`%eFmT&H?{G zgb#|WNEJQc-VE0$YD!RZ0dNkhi-R*;Dx*ER0?UnK><8jTi96y9cBi&MHL!s_%TNX% zrewy&8I6O>k-tvP;RTQL65SiJ$(fp&qky=a|G;ieyBND)m=Lc5M{*;pufDatP-NW? zTG+UqlJFJpy_A_uT|AjLOU$GYc?rs0vgi91ru@DWQvTNq5{A8hho=E@DW~M%-w4Mn zJ3k&n)oC$`rW0TTpUFFe{fp^^w$kVT0+`^&lR%i+dAy_dtJ;Z}48(TEudKW_Y(Bi! zM37byCmy!<=LNgOs1GZ9*$VxbI?;BYV$~M%DGXjmP<0>JDu|}B`xxv=XBsTB0cFKY z3jpJT18Z2{9&eYIdqD<|AoIi|Jj^-&P+D2EDl6LOmsQbR=i@|=gJD3^p^*MkoG-BpuqJpATpdxU?qVe84npA<8LIL|-FHa_Uj? zp5(hx_Fv8?;V*?Z7ob)#Nc&4HYFGHx8{a0jnrG{QEp)WQ+!2uKsdB)BEXvEv&(6=) z8zaRo{-jWdTwTNOls6i07)@l8M|By+Vv|<<A(@faZ^ml{}rw6(K!J3A!Jw>o(cKK-gRZ+Q4CTUf+`rErOG@frbSjNf_G2 zesbt5&B4R1fW(Z$i4khCp(ar@l&_&eEox^+l@i1Z(4GjhvHmgMIU34UHp*&qcL{ig z`=nNs*4k)47kb`T09FH+$0L=W6@uYRTGjfuVvMw(Di$R?ZXzBrZF;q;7{&Fes(l6o zY{+PDow1<7xO7KHa`&6iL+JAI_`|I3khtA3GD|&0hNW1*k%gy9=K;i`d_#WLE&CiK;E_V82`cd9#cb*a~`+Ls4s@E5{+5U7!nPH$h6BYceP0;bdig&-v z9P3r?#3jAiMuCw3Kcpq7j-S|#1w+SSqNDNU_gu&Ps7wQ$xwv`91@WgLyJ~=pVsW?& zIu#94Xj`2)UdeW5$_q666E$PWC=R0q3OyAqFPyc3fyqyyfM%^Vh~(NFF8^$1P8bNm z?CCxgV{v7FM_xs&Q1tiwr#@is7(#Zd-+OSF3e%T-*6LqL7DZ{&q`j0)FULSCS>5Vk zc1Z~^qDsUNa2SOwk&Ib?Tyw}I3DzhkS2)mkbi5t)Jj?+$P_9Km-(Jr-uukVd0Gfpi z_Hls~W)6!+y}#}r6Qr*UM``EOwSb9bB46TZOUv+++Wuv=bg9h>TqrrZ7&88|rwR?HD{krrzhFxZVG2x$G?V)Q^{E&a9=QYeN z8rMIaWB0Rlr5xR!-Y;>I@JNy8@~yo}R(Bl}S>};sz-~tT(OsJ0A^kRH_z0CrT9k&N z`u2-X1$9Dm&!_;>6OAx5pGZ!GIsqG{%XN&YZ%RU``QzIh4wJt8=Ma?BFHrn|>~M9K zJU!j~{FHuMtuF8w1J#Y{BcHB}OjvGi?#BU#Uj&Kc8RBApJ+*a|NB+9unKiXOE5HAe z_;F6j2o8BbgD_2bY=~+m;##(`|2Zdm)3#Uoroek_E*EoSC-_94eTo+D%dcuV5gg65 zKR|f@sLFHF*@v}5mr1qf5TrlN0RG0~2N%S>0}fux&O*1_>^q(AYS#}F_FG06iw}|Q zC04t?mlkdw-MR8RMgk(d?Q^*9SWGTm(IK&5YK2Y$Ni)^}iwGd9Yijve5fi{~us}gg zU_#g>9%7P4)`en}Ka%AcKcj>~!&Czq;dc@1rPK!-Xm!^a>yrZ1DT(eg_4^|mCU|r_BN#bVJSM_4% zRzC05ufL9E|7RNoy;qq?<=w^MqSu;PA7jwp%>z~KFRN2iLMPg*e=H9&vE3EwG+t`( zTkAoy?<^D>`z&AnDa(Ev$*361xW0eP7q98ulo8XEA~Ov@%{$WC1=pB&^tr=Zy&o*0rTRL(YK%^yQ3P4gFX;ZyN*yg@O;7ym71CC@!t9bL|VZ13cfD@Z&wH z_8!26k&!nV!SQPs?B=(k0>G=Uv~jqSIa~m>TDWcpfKffzJpSw^{D_D->ngR)LH?6W zch)WM9cA7?tAEFvCqKaAU>jc4)F&Ij;<%B$?H&26oNXdkD??HG3<4i~MUcSQFx1^5W9i1t&Kz50m;>5x-e&e;7$?^r|9i&(emL%FaqE;`PfeGjI@g_ z_nBwD8b}&F1^Kdl&k(wI4VG!oq=pwFG(V30qQiO$31Y82+{sO5zkj2*uy863@3Ut> z$eiGhwP^U_ru6qRQ|^tc)yqEzZA3_3*iy#YxL%2&%`a9_j9^e!EM63~0-qrUQcaQ| z6!@;s1M+FM%leRddp#vQZi)1B!`t@ID5R>$v5hD}gKy823}pJ1JEp;#6=US7&?41u z_gAl;9S*BNhBl1CrBf7ztyK~`PG%Vz4n8f}y;A#Vh;ynf`w)Xf`FLBPhk8_cKkdTO>*eg{~%tx(jqt-tjZP1(p#u%F0K`|e&m_tunK{hx~ZXB zCa!K{u#Vz{7Wn1LYUZ~ZcxqS>$jHAK=5YxeZb`DIkNvJTj)2eFuFv#r&?}}NAwuU> z-mVl!ONld_A_}Lq6xr#!$Oz28F&sAHf#^a$y4{cWlX^iC2hoh>-~~t&5lf1SRZE*R zu-#}IvqDmjgDt*z3zzyw`<9FV(CmcMdFSTlSnJ-*9sc&eh6&uh@NWK)--)k#wKt9W z@;@2N#f3W{FQLAtHIK11Slq138vppMs0hhfY$xNTq}Au1gK;-In>UyAjdvwRjCza% z31LCP=6P+K-*a=g+s;B$XTyHiW^V1~#I5PZkhR+4?RG^%4v?bznm#CdWYv^aX zMSdywvr>;A3kv&O@?bP6?Qc+XCf8isw*o zFoqz8vsOn<~$J%!UoLJ%sfdX{809vKl?C$6cZ`Mr#-V0vg6Fd{>qXp z2gpXQ(z*R;NXeegGUAC#i;IgZ54%#NFT8H1y~_&RI43Sc_G|CSUuSf5rod==+4K@< z?|?o0p#Sn=Cj9R7;-AG}Rpk5Wle`A4)JxLFEa)8+iEs&;U};t{1duPeMTrc1m;;m zJLAbljj{TfM~|LTGDCU$j6;y2$#pVK$azx7(t2LN;&?eA}?tE9^6S@pSJ2Z>wNh8N zV$zEs9}vda>ay{?GxYQ4ekUS4M$S}POVl$~q6b8oJNHWYeek(YfzSPXLDE9ElkIQ zb8=M3Jxqa78SnLEeO`4AHYqZ!&d!$x_(yis6B%8-~S=572G zNfr2-jTj#*;%a~KxIjKX=)wqd^WtvOwKmBx>euPYEC>v2A(X6B!KVK#SfX-qPctF*&uEaB2+O76>nb-j=Tg__4* z_-C8Rh>~#^M3N)Bl|8JSYnN7VaB9#HoAJa|Pgw+|*YP?6L_&+>{lG1yrY4Ir`814m zx(a+hd4ab!mo-?VJZ}Rgj;4~6OJ)=FdRhp)nw8bAYOplX=Du#mGAPViA5F2H`d^av z9`ISo+}s?@$6;{!!LhZLm}yS>7tJX$WT98hi^xBrE=8xW;SAD}xP#nn-^*M!KA#ji zeipH_vpf6u4-SWqj*TrZFZZ+qkK>k;?Zw3fP`>QXRj&eU(9=ECCn6%^dOB)OC%Jre zc6fMrCGgH+_kA}1;mU_-Za;DhPxPiW^*jS^)6*){DA;h1#bDHBCN@ z^1tL30sVTbFrk+UQK8510dM;aIo10`G{3!Bm5A zSbKA=)vdN};U7AdeBwE-=o0wjo+xDG*ZlRh<0!WB&y0papQVNUGfgVJdgsTKu>7?m zt*Q$@5btX_@!-BL+_9(t{n+U7x}oxy^_y`t?PWjqEQ{Mw4%#=+8w&u5@!vQ5dTKA4 zf4`{sd>`qLfr}E~g~}l6yl*I(IO(-8^{UC)wK2vYOJP0I9PJmU?|HV!4YZ}8QsPk? zZMc?$M7Cbh8!Ox{{(Lft>I4(+Z(q2JNnxzTi1b5AEBDl2-v~e50VC;cs?24Qteo9<2Pi#`>KN(;+Bjr4X1bS|M_}8TxAVx zYVms3Hyw$1zl)zuHmWu4r=Yy=vhH)++S?OyToUA8jOVwz-9##Nf^TJ&lNytiDQalW z&HMhL4SZ3Fho8@25Eh~RwL+?VBhx_qIQZ&&Zq;C=#l7yE`TgicgVJM{F2ai8fOrsw zMF7RaJ(2Ajw#(|2AVlmwI|-)2#>CWXab@T_*Z@E);Pc7s>I!m$yhdN+wCUz&l@S8) z9SN$%bPfa6BAdG^qprtn+2F%DBPQmL03hL=xD%F+IV#5)!#Z)i@ou=>pm}v`%OwBO z^sduRR6r%SgPMF0vn6(u!{bp`fLf`&-VeqtEiRcp!AdEaDQ1y=C%f}P_D+qc8ew}-@^_)3s{*Wlb<8Y9of9kY3h~41X=X&PWNQp z6!*LSW=(8oVzrJM!&PzwL7EdXvfgU~Kas9sQulUVs2D>t*=UE0=UQnr6-i!YRO@-!?U%U~FP zj~FYI$0bshJ;6x&j-xdy!(lfsCjBf0X(exx1^9v!x$(eVqG!T&$4U_bYbPv0kn*zh z`~Jy=a|J_d7T+>);eEzf`sZ=x5JJZC9r`mEB4i>q)8TI#_NmaF=#7xEJHv@vE?hqz zxAi#|oTDw?Y(5FlxHdQGmkF%${4c~B#23jj^wnYC{a7c3 zU(3&nP3YPN^1ZOQTArxsx~uL#DWXREiT@YrwX8tdl=2VQ}Ff{3{+n&gktr( zbzVmq*_U9HH}gs4qDy^iKk~PhjsIme!63ef<)tVHLJE4MJtgs03RthF+Tj- z#7O*#52_{OkBN>pEOZJ67*F>*5^QMGfBw8zRz|4}{tJX{39tBUp;35X$=-F@c4eB) z*WNkU#vBXE!K*miap%(`8dAPmUwebDk@Je}s&whTFGiZsFboIuo=U`*@ z-;a8pd(erotz&!%O|z`+W*T}spezgdtGx!N(R~?9@ir38vTwGAeXiFp!^jZFjUZFk zGnc5F$TGIao*g2%mSRCm01fytF|ge8K?4xHzgv@VRam7^H@jsRXs?{4PLa`%>6Fy` z`kX_CSB{32#f#47p>4efo$5V5>_p_dZJsGVmFQ+mdYMb?cuuRHsQ zm62#l%-JTkGV`hxd1qkXbNx+#&p%vhQG+cWEr3e7^X^Dw+hWo%=)nVGH_%GdGK zg|-JlloEcUySux#w)U6P;1HySh6V;EBMl8gJiMg*{ObF(O5(+epV@EM4TE9##$^7N zrMjIdo~=|6mGjHXqeZ@gtL&%Y{3Xf^f{sDPHS<4F>yJH6iMpk0hJi&)y)3_aT+4!Y z3)A#dVQOA&r{dYhGjxOqd@ELYFpC-Gn%?(0R3>tgCxi+bfS<|78ynCljEE>8PHhYb z4VUdAL)Wo18P6S+Cu z`n7OaPTRyJ{T^k zD|0oTMb6RWrXUuP#n}F3kjtRH z7phM2QN+^iW6+d?8B1EnBp+(ABSu;zWMt`oq)}l@xTu;q`p2UN3sZ7XlU23iF znKdx25JWg33rYQ{H9*)jt`{fx0$z+;ZHtT^-a^PPlW3I~4KazBZN%oEz&Z^MFHFJy zNlKdO)G4)n|M+;-1&|f5{T3%00AUrtfFJHwpNJ^`5U=D4d*p_^FL;IBBh!3qkG2vE zHV)nuy|L4L)~1$TOCd1xpl|lqa)aQQ$hvMV;A++((xai#6TZy?)`6qtayh2tz{6#G zYwKr|CbOVI)zy>DX7;v+ya;n}aA06y0LY4p&ckK0@v{2*msAmfW*ZZmDv^PoK7F#Z zw3Lybt9P)N2IwpUyNLo(q5?b{a(cwj}Xi! z#e!Q=q>%p*>}tbkqJ;1I_m~+Xd#?Tp3(lE{i|`y1dC>fLNqYCzq+hVD1~=qd2si{p z%bST-qm;j%(Tdl8j!@6}KuI07F?tg&QF%zQ^DA@5&{^Sgb6PP<+xB#c@_sGqfrA)- z=KDtXJym{_xXaVuI4%sZmoknzRs|DaiEyJUSW6lQt7@G^@0D6I)Ehp48G8nY!_cXm z+;v_5Bz_3a*V65})F;7{pwd)j=j(j-9keB{mVaH1bTF$dj*mNnljF8MN(x-I6*`c$ zKkFkJLcwh{Vy>I-?kDQ&>o*1yId$sHfuxF6tE%1i;%{!F<+{JVzCJdkXcSH&c#{U= zNCm}EQBj{Y3{HSAR6?$skO}cVs#}l*S#8j!sjnZ$IYqH3E-r2qc(c{&u@5q^8E6F^ z?)!mAnXXlutrz=|tx-l=I)OsuKfYcZg@|WwI69etBQ&3t?PbTubOW{P+*;#HD_!x8 zrnX+1FXif55dRykj`_|HWH=c?D)&c&Zb>#dgach*)FJt;(vh~VH}Ldjxp8ATM!Egq zOT%6i)BxzHBbXCDoIW2+yQQt@JqxHL5VXZ)mh3en9FMlAU)&0eHskltj<&i*dxh(6 zb@>}Bftoi_Lvxql)4gNSyUsX-?1>WA6^(m42QyHr)s(TEW-)576zo$_k2{GZC=F*c zJ&vx*vr*jlX4`sMu%9QIeKFX%q^Iid!vWHz?Qehq0KeliC z^s-8KSLVVngzAB$(~`_#E+*WIXk&8Yl`I!Bs@_qdXh@Q2M(@c^E;ocer{x z#i+O?DJNcJG%A}(wNn4t60U?To)cN&8m2o2d|f}3m?569+umWsTRcu}%0@-gNsmV+ zzYL%FumMY%CB)lZ)5A{fp%(?ydFwxRXh1-Kh0`4$R=tco=jLqpbX(wq?^8{4WrRyn zQ;SnG$@pqQM%+J?tnaaNTmJm7j#QW+{o-WSgZo|Ti$*z{rH;!jHS1&wE=S3VlfJL{ zGf~`zs3V_0@8f$sXbNswsxd)Qda(p>t0t#60G7RWa4?#jgEs&C&*9-=Bn}maj~g+& zE^;ErCyv*zfB*UO_E`wd3rbOv(1X=$JrU1?;7{8UabNJP9x;ACdz)2bKuInuI!UqU z>+5Ul?juSTvq6?4rpGHD^yuGHw~DgJHJi?9WZ4x;jIhI8A*K%~z(5yLSIUSA!MTI4 zguq6p>3aX;o`UM=iGO{iUC7^4Jy}{X!H|T=jlMFUT}4ClSECuJ^QfGa?Lm@UEsLcm zp~ zkX~D%-zyeU^?X>N_v;Y73FgEB_BJH?+ToL=^O_tRRO>IQRa&wIPkem*`uh5SoSai) zMvUXSN;l=db2rX*zWeZ_+D&?Vk<}NY4H)XwatLvsE2zzT_{W&H3Dum3Ick5DFG@#7 z37|R>mYN^sGgA-K2|s&xfAP!TvA!<`!S8F-mfV*y7G4Pi9fFx=xhHRcagnq>f6(o%V~PzcI; zudd_QGPbs6?8XcR28+Q{ln?XnF_>-$=Jq)`GK}zmC``S$ll}__e8jDO?*V5;X*i_$ zz3Vm@dd>Os%m?y&E{Qba=5zkE6+X@~v858saGZPY_t;c!_vFG(O>GRA;k{Ln@`l$F zcli|aJ{SB=_WGnLhMga${qFgbCNw>74vx-X*Ym$G5{#_xmbWtvRGW_cNwmR$)2%$| zrv>;SvAX;7W?;gN`w(z@{(lsmWmHrP6oo~)OG3Jl?kRO;7;n_r}9NCMR6y(mnQ ze^-7l)>YjGfO5WpsEh-XiN-<*MHmI}@Q+hJWB}IaTM2*u2P44Qy$!x!@3$>&Irl4A z0Ql0w!^2Zkc%in618W4!?WwJ{LuJ!Z>;R9NK70rid>{ApF{5S!Y75$~4Z7G;5@=-` zo14?Q__avv^!TQ#qpnU2QE#d7oLx&RbrJ*u$BiJf{1^ z{+OUaM=$C3Tt}OV8fwIaiKdQg$!g6)^f4jq3CWhI8+W>UC`kolJGBQ3=~~+ugO2(_ zn^m=LO^W#7o9ux=G#d~aypkJ#0aF%u5)zD;oYRdJ+iP&DKsx>?c>i0(014vX;z18o z!d91({6YdDpHn)w$Hn{@>G5v?49qF1!vnqMcO zrmVZ0BkC8^l{x%PWb^b=MiH3;efFff&;h|Ji~u( z=D9oZMyy|#m;dY#>b+wavuN{*Ac!Y3T5=u7mJnqgbvr$)Omi<=2VXgD^>Q#ZG}%*X z=pzKaCoKuP^)lm~JSI2uTvi@nawf|$V&YgSlb0YCwF4fGmDr60uL7>-^u(wSgKP?RCf7$st)9nbVg&E_uo_EcOfGRh7POo~w@d_!tMq6N_ey;+7B$sy5iOI^;FdsGQ z$fFPLOUkDcm0#qUg6To%BCnUr3L>a5qA8!DLJ!e$OE?3yfE?7 zVg%9U_(=HYPC769aO^~Q;gqW*F}vyacj+Avx*;J2zE=5e`fZDRH#;#a6A8)l_Pbex zd<8ck$$cGSY(z42wOT|Olo*(vyDB4L2Sm$j(@AugiJuL9U6I37?oOOqpqx`ehV=zR zB6u{(m(-xuRMf{}sos7?#l3W?y9dOX<#UwfZES2irM0H&UW2HeEC?o4;?PnWM;+}-l5rxat#DU!x_LjoXSiH(23vn||4Ln|Ci_ix3!y1IU}%!TH+ zH0X&>Y`$RlVdl`N0iXyIv6x5!Bc4vpFPf=3(hiAvb z>#|Yt(6~sbG~Sv6Yj0Us#aHvWZnY>Ke#_Pc2P)_xqlI_LZ5)lr;8D>sYb2V?g4l0z zg-e#)&{~lPyJ>EclxFl5ki<%BsE|l720}Y<*(>)_!H4f0K z*2|-~5!@?y=A}X{nspGHX8Ca9SS$bulGJ&bNm4F4RXyXUr575J+FQEyPNJf2>g~}m z?sGO-ai!EZlnbEvk_(vA^i;nL#FRbBd4?$~*H6E02;-Zs0Q`rj6DVueWLXj)L9NC2 zUWy@w!DG9BIu1N$cG~&iY+nkbM_?`v0I&oAkKDr6o(J-;_00UXE0x$v9NWC0T5s6l zAB#kE#2v%sM0DPPDKoDiN4PBDOA(tjb&dzsQB)Vv{A{Yrls*M2$v|IVaPJ*D?s~rB z`sa|a6XoH-*Y7_E5c}uq4iJ4pl;JQQrQiU504XORdJ_mFDJMK8Ch~bKQE;4BT8X;* zsu#Qj9>o|Lk!{04y|Lh9E5Q9N6Uk#YRX{};os*UI+bak5Y*J%lV$$J%^_e19#Dhta zMMUFq+USvPe?|w}x2Wbr?Lra41%{uGc(ROa)n0op zZp1n@J_BZ4-5dwpMVtORe>c5z`m_)L)c?)-Fh}6`JCG`z2VNwjf;$GBJT}zYQ`r}b z$5y$P9`k;@Gxj*U@aXIGy-)W!*{htJUA-M-GvhS+?70o+kr9&NlJki9Gs~=^kH4Z^ zp3{x5JInv$k^rU8Ln(=y*DXP7t}&M6LIdHe0*4ha=iGj0KHloZ5Xg*O*79~=Mvf#| z=n!LeFqqfCj9nmbqm?l>wU@xxc!#2!oa%0B0%!SkYjg(fMG_P{AP+U)|paeD35`)O8e*K zn=|u~)$50b93dCp%z>rRQ*{h141!=~_skR5oT?LZ@QgTTIO2D3v}ObgB9I|GIZm=oRYH!p4cjYhz+ibGnzBT-H{)QbLab znw-yM;=#$u1R6$X9X&AXQU{)ekx`1g0KJ&HRmOK}dJ&*!fT{^y;(yGE!UUk%dOv?k z0*J7cmwTYO?wQ81ZzSYmn3n--ySEAs@g1V1vI2nIg`kssh zb#(l*;KtE9P{B8lFB-3+0=q|nNsogkG8c(e~ZfKTk!Cr za7~$oAYKA}H*4^S9?kprXT!nOJVquAV}ci|b9f&xvAy5sm;gnr#dpbx42-=$V^?rW;p-4uHT6Kuk^6unts4D5t{bN{Cw%v z+}SdKgsmYsD^n=TrdAROcfc{Ojj%R>hw>np>pdb|Nb@l^k)8Mq2rLuHNitrQ?mG^>%!YHRYGNZ+Q~H%i{UWA{De zs6)C3*nt>0IJ(!3YYjj#AEI7w*%5$%+dazW+a}WS#+OU;Y0-em#7Co3JKH(;@!h#K z-5nhjE@6Lz=5Wc?L?Tqs+L#1Fd~W3xmgkAjslvnr)?M!|wjFnfChD5A9NqYZglzpR z)d5xP#;hx#l}JcP2)z-oXc|CgBx9;QydxH~d4F?GH?Klq4D#@IgqQBCOeUu=@zoA2_M0sfSI?!~16>MO^cfoa|^ z&rejsHf%3-i&Wfu(`pK;W#l?MT%yX&I`46wxL(-w43y7;OeJf@b z*BtK0hLwrJw}J?k02~~TCS2<6sXPHrxMR;%3D8FyR#5YY*yPoNKsoU5`=fD$uh2EfAP-xE3ml`VfI1n}?G_;DS9Ev7v{L(yyqdBzC_+N2mm0-H7YU08NF3qk*#ht{xxk0*MRjFm3yFBsVMN`qwcP-5hPt-=zQ*EB^E> zeflvcuPU}*E%43E4JyZ<3klzWi=zB%;8hqElqk`7BS|XiI4{&nGER1=4dzqFyt z?F-@kS^<9k8fy#J-;M^^+=@UsTJX)8g7C~%zg{K{Kg+MmAijHMd;luD!bJr zun;2tm;MLhV}s_)%5`YoNr%veB(0&<1KaY?i#Vf|BlaU+i}7v_Yl=!c7OQdD@-i2u z2k^qou|CFhprCc*Q}7HaRXNr4-6fiC9)f+a37YDoFY5#!xx|&ER_e8E?@^Ju4Qx~6 za-XLC9azEHz4IVrWHR04l8f{zVnYn%__T0lKpk>>Vq*7{oCyl?8OxOenpBfxTk~}N zhWVr_3p@l*h_8|W>xJv3f78}$V{^QXM*GGIPs_=P^IG`GfTb>P^W2{UrXcc`uOZl` zvN^>(N<&rRpMQ{HqXSV1;O5F1X^x59N)XPW-hj2`D z7U3XuvQOsU!g9;FSXEkT0Jg!#Nh0NetJ~}NJ6`_~;o}#dI;?x5+%IKGmbmuiYNY=v+o-Crg(=*azLOWNqPS+hM#lm~U}gyP>C`wtX~ zj`W#?N6ZV3vjEsJ+YuwYU;!LEo7hQfd#FtD*&XpoiT}PZt>Ts!BzFEkQNzCD;qmhe zQcC(<{xSz)KR<+^i2ofj34Pj9c`29BAt;*#Ls10r-cxiXq^ zB!YN>1#6`hPJ*r~QRddDuqCDE48Y6~8K_$pxOumIMI-bTT@g|J!z2D&!}SOw-3>dW zOBP?rpHq`UB$1s#%q206E({^tiLitC3N&-%uMou#I zO#p(d_cLuoS64T6QbA5mL|B+x=)$2kak6ICCKjiS>+Rtxz@}Whc!(opR-Ug1K&S2J z1LP~UP7V&EA11NM1<(8@fb&@fr^yI!{UduLY-!1L0*xf!7am7NA5BGGc$`f}Rb$Ss zq^=O~FjpS^LFC%(o%>5Y>gku$+R|o$+gi#&wJs4N0e5g3dQVw=xvM&0K|?5i^mS3Q zJTy()Gv{Axwh9qEhgxA9s@kW2gLaqIDv)*cPy^NFGfvU1F;r{+OsH@;*b8;-(^T!*xPBf{`?4*#Vt7^U`*SVT~3PCi*Kr0 ziEh?u5Agh`5HMO4x9RqPf=xCXgzN0`uxY5PI}fZ3VNDY^C2O11st-$SAEFl9>-@QM zjwVkAju@9dH6mIF1Sbu%(m32x@v0{bCMRZ(Zo6~)&i?*LMn;yOpYPfM6qI2^_5S(e zKJtc_<8_Sx?1+;QGjb?Cskko$sn4ufR7@L@o;NapC^VGjhkkP1AlgK4t|A#@)0tudx znMp!IA|@(YSI+?u@c|}Du;2;?T^8U}h2OGOw}-3a);%Tz8mgen>X_cUCiIU5eAG?j zazj5uF)x4;0*Tl-UHyQwiCZf2$(j)Ld-EefJ|MOnV@vYaV^w=Wn4T%0hp&!-tcT03l_84NId$|T6Jh;HX)qk!WC7+k zkiU;k;>OM!W!)t^E8iz1K`uDRxx&;gT2bfta zx6{oxxCk^Dv?hk5sq9ym>7*I4d%w6Ea{89xZyfJ9d?49buD-Of>*y~UG-l3W34jBBOafmbW<%M2YA5zgyKM-I}qt_s$H zEFQ}&9=V8)9S858rPpUq_bH51lj4_HlH$OP0B{2FHDQFmUQ~{EYJ}ed6(%Q1PPg^~ zt&Ba3i~7Q7^bVgsb!W7P?Y%#O_a^``Gt2@{09|s_T(g2{E^BA^4mOr}J*_|;*0~pT zb_yuM_CSZ9uuvp@Z>Q@#PyqlDOqHhQj@Ghm+0d;t6tEn?a((mTRkG90k{eU%<<0fA zO~e5}LxnWl|DDlr%Lj!#-!;2!E_%tl?~}AA%96WAb@JLso7UCSd5qZM19B;dGuqJ) zS06JSdvAZ`brS$7lfURdgv|cw=vDAO;qw!Rbz}4*2B8g5=d{`-*L$>bGIJdp=q&?8 zktkmDMCsiAt~1c+pZ<0x=>MmNa)^?NTPH6x5;htd#z`flUPQN))Dni`G%{kv1n-3;u4MzFI zVX~ds&pY#i5*@-NKPuka5LO6peno4FZ{EerqqoV`5B9yDMIZs=`W@^&isYI1?8>9z~Qd0R%Q~ zSI{RpM)0$EM<-J^P04e&YVPRT#NL3mTn-GX+eAZt|CG^)qd2Z#UkA`L0q!fHhBW|^ zuaKd#@(6I(*2i$JZ(67-A;=o9j+G4+*6Oo-6eM~0Z#rJF zo0pp#FV~VO-37S+Bks16z&Kf0!i<7|Tkx;MuysCH~*zCD)fU4-!z;fYB7Omo%*sum57!ea0DXXB+_j&UcsDrwj1TJHF zl0k;=wtGLs0JwE+ZS5Kc*6v1ba8krS88UfsK<@J9MqyIWZi;5u4=(BmAQYSJj5rkn z+j~-M1(zl)nSvflCk*Zi8vecaI?#O%HwN>+B(-x;bRB)?1)QaxJYe$guvZhnP86o& zHeGYza)lVfzUb1gPTwZo-6^fGC*CZ)K10l(4->V;%jT&3bn7Umfx3EqF zh4jb2e1%vv4F!H`s4pk2VJ|1Z(t5KHHb_&&J)xnQv^ZiPcj!youa9UVYqOJya7`ho zcRV@4RvzQ~wVgDj2e5u@wAGAlK>NL79na*^;b?Y$9SQWG9L?$9n(WH$v>;e!@EJ2Y zr{R73@8~TDfo8bAL2AWIDc;vs0@w8Jfy`KAy;1-d9spQEkcWL z|6Qn+`-^dsy@KbOfk=1paz@+i^575xAXN6~JLVc*5-NZEK){24g1$^=Dg>7Jb=2!# zeNXE!Rd_nv@wOEl-`t{8`psMqcq?OL(Zs~sfMRDVso>?_-q%*g`BvI?>%?EUR9}F1 z6_DFKIzIkcSm-O>)YP;Y3kG`tu0|Dw5g|N$sf&vX3;Ki9jI=aFG0fn@!$ZIWZ)9Zj zaCNhU^qKHJcRuWR#Cw$NOJK9dZ1NQRC1|c<7h#- zn#RVtH7)or-5PFqW<`Suq50S@k-#D9-`NV_%!efq6B5#Yd)EHr58Fe%^-{TSvI?Po zZu!0xA^M@}F~JfL^#lmhCU^=*Iln;z#9u?kRxK$6Y|2M3HW42Ao&2S*l%ERB$E5<)*603tx!O3(twlDZt*a{-T7u(aTl1@{&`TEEX|v~Fi$^!;eP`8Gha8O(exJb0GtUF)x? ziT>~Q)SRUoW}wg(7g5X&P7k; z)HcexJn)e>*V&Ad(R$oUnTCv>jaUnwe|eX2G`XsHQE)ychzb@EA9V5PAOtg3Du}NB z@|rZc7ZcP)`TOkRGh!7Q91U6!vj>U$#mrbvmLENXyu!O|186kvfx!BtZsmRBkH)1T zHirY}Ci{S8KO01Mz)L*fOh2~6><`c?ZtcA+r-?sLk~TUoL#HGf;#7)!(8pHQh?6b| zJKiG)2Q3R`awQ|5)epU^Kn50V?|JUT(h6oSRcYxSDA;y){AnwD*Q_(4NuHc1@D|XT z3xCpkTqbBNmE4W6O^783M)w@|Xc(c|U_!_BJ>rI}5vRl8Bh+V59P^@EBGAv;&eE%I zCWWI;b!54xoT-;(=6)NaQAk#K@TN;u`&#VbU}q*A7Rl^4@FJ~iSqe?@39T$&*T%0; z-vkzh#0jhap78xe%hB)QK^EGKC1;Jjgs6>I%YQN_tY~H;_DLQQI#-SOW<{_vL_f~S zzgur&A*hFkEWK#&Z}4gSZZ>@%2*X;C7k2wy(B)6x)yzgyl}f^uJT2*}y8SQ^FkmuR z>fIWTOE?`(PxzH}br-j($yXn4k4 zL?*UZwALy-tzM%F1R34&dreNS>bWMqj!{g&vpM)R_7VU#u+3 z`hxKZw>|91I!G?OP;-Wz_zMG3vBXSdsoiVzRy_c+EpHslLCR!g2m{QUH)aXuV4qKd zvW0&}XirGY&5!06T_9WEW^138d$swI`Jf{5kV>mwCNBaBBz(8PAYttcO$=u5 zJ)5KBS2H3`8{eZ5kpZ~EHkwaQv)_Z~n%1cw;qLRBJ`N%mIB#VKM z3uF=h=yY*0Hr;n8>Q7Prr=Ut><#{^BXE-B!(P%gt=~=l;d!hlsA3pA)8g-^V5r&vI z(oiv!z-QU$X@p(rRIsgGuvxLdy>l~W1| z&JRDPLLs-}g-%LA|LwZ5px(Z|Om>6bRcZZGThqX&hPNJY}kZtekP*;fJpCX%-xv44hxJOsxzvN{tJHZHU`r9uaWDilpD=hd)jqb8O4>%uNaEN66yB* zH=GQ3KE6d3c+Vw;_CbCdn8v#gdA@Nd1VJV{yU2K{7^SvUInLmtr;jc5J z>e7De`x!3r7T;l8(DmW>%{^c&pO1uHADm6L|E!DL{4~eer`YajMuoXP`oWfHA-Iy9 z+oqf^)|7?yy(Y~pS_*HDF3mb&V|_iojmF-9qnuLT#n1fH;MSMzn-a-~-cb$gkH1b+ z77sgv9disWxk_W_GK&i*yQ?ZI6v7WLu^q&|v#L&mEV+z^C`; zp6#JZjtv68Dl%3Owb=dR3|}HX-w6f^R{l#>N;LFJvopv3t}Nc^T5XRDf7O+r*sgsP zsZZ9Nv(k_0;I>2SUfL{0NRml}+G4)vRY|A}>~5Fi-?oA$SxQ4f78g5#?fi6M5(3%6 z&FejK>Z)w0ufM&!Q_B-g@5sl+K9X|Z8hS;I+g9@keF$PYaRp<3toKp-zK#ON@9()o z?bxhiT{lsKVX>0ajYIpPPF zIy=g%_-3`$ZVo!N|BzO-X?R+3Z+-`UdeHp}2ey-`p!&v!%`p?_-Fy#aoNeKSDb@aM z+1$w?G?GzPlU~USIMv5Hy%jB|a4;hrrK%J_Fziyw5lMHmQhslHBi|L8BRl!-=*DT3^9bF@Q-nWI>@7yW zd*xzEVK&Gko@ryO7q>|g=ldE$crnt9R{dLd!4O3znXQ_jL?a>0AwI}1DXv6u`D^Sh z&BSJj{aHer#tPXP8no)^V(n!$h~z()wh%+07z+3{Mjn_?J|Ab_6jxJ#d;aizAgbF; zaxfYI+FLMe25ohgIY~ZN!4MFvZjwY*Ynk!)yy| zv~#4$w{KDJ1}Gb1*z|YEg=gVlr6)&CxZz&jxw~m`PFG2JfZ}{X7&Oh>FR+p%)oA|r zkzILN84%qa=#9bz1@E|cdaItz1UGhUOTvyN%AJ zq*Y_q2oBfRO7=`eK=r5sLqM5TjKXx(+o9Sq1;OVltYK44mK<%v)HsOsT z-vI$??VQqSJlFtL4n4van49c zgY26Cb^&iS#oE)kRFy(w)C=^*hBc{rIR9-dH8^$B@M5MQ1_l0BA8ey`Q`yvU-1)g# z8c^2Q*U-p$Lwxprhjs%t=9G0T$$(y*1>}ygXAc;_ADJfiQ9t(bWC!f~O)@XX;D^Lx zX^GPSm-ZA1PepK9vGZwzaPQIPbNl2#S0*(sY1g>d?wq2e60JV31DBGf@32lf43n!Q zj9jITX$gcqS>jA4rqlO;=_KW6lVVKV2K4s`t@_HKP0sCce#oDHy1(wxkOEp~DJk=o zD?DX{S}u>p%h$zWQ|%d5mD1~=M#k*;XzQ(Aur!Wt!Rs-+0ZVCTP;)P)deOw3l9&$B zXJLC8+`8YeF`*e&Zk1T6ZYkeG7>lepuMR6!rhz(yO$SbM<5yDDjRbFxO0Vz6HS%%V z$+X8WAV4kr6hg15d~QDAIA53G00~3vow(VK;;`q6c6HulgL7FeGO9=3TcHLza?RA;!LsSCaW8z16}ZlI#ouI zs7EAnGmUC{C}GUeTU1SgHxq5e4!O}gUx%BCDr&ICKD?h&Yu~D{tkbBs_&c-_^za*- zl)HOn#RLkYiUhRFChudz3`8WCzieDDPqU?3a{>bQ-YjX}EnHIo#Hu%j{JY_K`vynG zSn#Z1BV6e>k={Tbo34r!d$v-KW%6da*LWqIcU6j>Q{80w+@U`Q=KrSpK>)rd=n#zR zw!P9nr&bsxU6D%>RrCDPV-2{(zBn-|ob1mOSBf9-2UVYD4kF%~NZbk~g>HWme9;f3 z;}Z}M+g0H#vjUw3x>fbbF*F0-4LUg9{%Bw@e67~Y4RTlHJ<{DFxW>ns6Dxjyu@?ac))LMBZT54?MI;t9 zy%D)zF@U#69mWXXVnlC>i)$x7e#=3Wtj@OP^oFH0J?;=OoQgLsK2v&`3eJ))5j*HB zyW14oZ^;|mT$Ia*kE_$Y!pk+00H)ksfgA!;Y}ly_{^Zo44Z*o=oUaObVTO!N?c=-F z)M7m5hei`khJ7gJ$l*T@LaH;PB)G6m*xzXI%y^uYcbG1@kYdSjm1cib3ShZYC&dJ)OZ*95Wo+^)_E4Xh+fDM=S;u6w_0k+~&BnD2 zNMPlEHMzUPr%TdHB^k_7fiwgf%fgR=D<=>)59XM_iMz3oAX;N3&SZU=l$k>(U%8z;`mM6CP%mD;0^N5A&AtB{8rG+md%I&L+_iwY zgEf{9uq&!3FEWXGR0(awO3?Veb@vh7%mRo98++f2{fhF#?~NvB51&e}9r|`8p0~ge zD5bmyrPF`FtcEuq1K@Ez$&bgNa-ni^C<;|WY^Bpt;OC7CuC`)fg{?ZIm2i>19NbOJ z4}B3An9JQYz@fyzyWdU4fURkUM7CYAB>114y@0?3V-Y9G|3k0LABNGS3~}0ioNzCo zl#qK(xEqV<5z-?fqHh}bk=>ax>liP?;RLi#%t8=jl&H!kX3xwj^g5an93LY*0qWX0 zHy{ECIvWP(%)Ti`(ooOe^#|AtfVi+=vT?yiT za>>wG5Gi^WVoH;X$_lE7zDG6Fz2&ZwS{8)h6QRSFd%VOsY$;Pe6`22wS`0twQ31{j z`e{xl`vm6z@QTFbkAjAga7_rc=o`;iGv7rRRcuB|$~ka-K(~HDkx*I;PvJD5)|IpIH}g~cQ*yMMjV)sm z>xrnEdkL)e?_Z_pFh|6*k|DW$^7>IMBw7zhA--;HQxvhAU5CrvxcN#Zhe)g^Q6+kK z%wv)yDCdCChcQYXIi!JalnMdYY-|#|LGfUdJF|WM4WQWr6H7P!2bQ?*|@OjGHr#{BNIeS z8{W+d*%-Y;=Z&qFqQ*I=R!6=x;vn!~m71f28(O#xo-Gf{E>r&aqMXYca3n}#tQ4$) zZCaK7eJ2Q|^g`u1Rm^v-5%uBdpALP#Y2Jr%Ax4?A4)%E~e_@n9^=o2rlgBz!Y>`DA ze*4P&8mCE4;kAq=YfjGh3wIAEM@PV4@I0$kR#L>bcd`aD!#f9#D#@gRp2ryysGKd` zKl?7vcje2}{fgiwQGLW8kmjfR{6Jo+2b~M$fM$bj!u;NWI>RFci}^SFW?qn&n1qH+ z7S*sjadr3G?EY$M7<5ni76HBMws(}1rICTsDB4wq)*0*kKjd(5L6yK6N+wq=h1liJ zc=_)=lb*k?ngI8WhUA^>Z(knIJq0a2dyTd2_B&-&xxCN8k++U&;W|z#*{^8hb&zq? z^={S=*XP2ZO@RBx%b;j`l(?`?S9b-;2GJ16pKl9A5rVL7PCdo`q*E(Fqvqno6t@{V zwJBe}mLR_)CBr*YBBN=(roewW_f(9_f)j-%;@DuqZ)3D%IbVkZY!YWzk+-zLf7B(v$Hy=xK!o1Pc8H$j zbUsn9U(f~y)J#6Fk_(xxEDR1RC_OB1drAgmn!lMm3XO#CADn1;w_R@5b88NmW@`yN z5>s4&|7I{ULMVVp;&Ia&@#1pKGpb<%Gx(w7YDY@SsD5aEzVSzx=Z)lf|97EH4`n%z zasg}(J$pZ!;gj8P_tu8*Mw0We=RI9*>Ccfsgj+G!-(Py%G|eu!K34#bEZ--!eTD9O`J2f>nhRq*I^YHQ>sM*~YGy!@!a9%^36PW|RSRP}$weC98&VqtC z!uEiH5*2?E8pHC5%Esws>D5&F+Y;gDj+Ue^CwuZ~8@(-msZk`?s8=~!09F1w}#fzDw0{3qZ@)6kRam+HnW_lbqKA~D()RBSQp8!OTZAV>^)aiH#Q3$JVTW`SqWIVnJp5gc*N!ouT zECU))%$Q;ir|t)}+xD&sypJKGclM4p3u6+Nf{xgdarqzhnauz(;=E>yfNu?}(Mm#6 z@Oxr~nBS-pDI6R%xfBUr@#V2t#<|HpoRE6nT6-4Csyym% zOzpcia_JDTOn_>8fdJH1duid=b(ZoDSZA!t<#XF7%KH<71UuOPIwH44Z12m*U>H03!>n- zQ@7)%8R)|leFD)Nn*Oo>{39*6IYsArC$rSgRXACaQW(X&OTj#Ir(G|dK&YgI@4yMy zitXJypj><=fva;$K;gP*pi>6yV;EBS_P4`NLz+a}K}mkwWpCg!i_J1zDaPiTlt??L z-OkPNbun4V=JRkPrj0!~zcuyNRVb6;HB&YG$3u>-PpJWsaCXYPT0w-d>O z5ZSQK=WIXtv5jR(gsEp-!qvY)@iMs|7=YL}1@Kh*U1+}9f0mM?^u8N-$xNcGFgu=R zL-_#f%vhrag*xKvU~DpokO>_^PxRwU(Zejr4)|^p;1Q_V|48`i{PukS479u#?2PP84f;d0C3zT1 z{@r7OCvMUpTSpsaY0eKpkf$mtNHA;v-M%QtEJ8lsx4E^xeuf&7zIttD=k4tc9BSXR z#+Iy6bU0?xz92mO*AM6*;A{U20O)Td>G*SISK+a@B@Xsj=dW+BztylSs~8MmG3^(6HQn$H-=pDg!^}$N3Y`Fb2K%3LDx&hZS zc)L7Y8hsAF!cP!x!_!f6oL_ImU5!nzAapeEZ|B&Y!I15IE5Tmg#Gw@IZ0T^*i)nSX z({ZypI(#R$ogDx}T=)m=c)Et!=KDo^k+^g|F9D~fk

FO}u=Ce~2{{8&FM3NPExu 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¨n=HEjSB+Zcj4 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ä$acaj&DRaf0^fZ=7C8KFWgrfJZmWyWj#TB7EdC!vFF`sXW z&>VA#I65sk5wqXlZRz$m&_dVys`;n6sVQ<#4Piribs0#+;>I6O(Qs5<#_NVt(}ho28tHHYOw8(m>8yl3`0 zfBnt__1jgp_G&U@BU^W2Q@=X!G`c1q1R1JI$7zFCxQP{pD-quV?NRsRp+_399foDV<|l4*uBK!+yuNr7 zH;{sTyEy&Xg@AO{^fmGoH)+oNu(Gm9-aN?zGD%-kePgK<#goMgE8E>G-p97;IwaS? zTsqw|teQhp(xY&I2BJm}CrucZ4zf9*vMChW0+0PP7^`|eCTUYnYPGjNXy2JATa-}n zJE_fSQS+0yl=eIjnV)^m2{Ev;;vQ=r?g>lPC8kA)z?TTv`N&n*7Eto7su(t#)=!i7 z)czCSu~Pz700{d_iM>%1nBk>AZ3#S&!0>`!QGr|ThMyuYe-iIh5X_LlVB=4oeiO*3 z29gnErJx!0Txl60yyP?Lzf>-)J2WV$Mi3$&?zw3AA90ryr{QUG!iGwP!yxn7i0bNt zOy5ZvFzIIz`)b+}ICi$e$RFJ=cP}(@($3)jdCSFfe&~*4T@9_u+ILQ_ zrE$Y&Y|>!AARoX zE>7ASJC*X>GWKwbkUM%_lIFkEPB5?5r4E!&2u|ADB~MEzPq#&+hrqM`>oTetYw z`+d}(Es5mB--H@oH-^oBwx%MSot!Sz)t_=VL`!De$~{X4aQq6v6mnJROE;P`H!|AUG>vxV`|sA#;UQe! z48XO`>7+OJeq=~HwW^Pzc7K-k2hzFs^AwL90m(xDREX&*LBU{#@B7fuv#hK~a1Frp zK-}Tko3=$@;woAEO8IP(N^9!C7`+FfiX%uCp9J8^{rlWS?4B~O2AP5T6nwN#2UJSf zhA8xxxp_Ias5e%#u=itUBWQ~cD7pRca9u*_Inl35N<1p*SY-Gi8VFU3!H`Wngf&H+ zgMFLlGvOHcf7ksE_^1fWu6u9-mp?h&JlP+vr{$J2zH`T_bR_b?j{(VHF2K0Aw-*GX zA%<1F4g|#>ZsTk-{%q2k1ct|LBU1-Zgu)L>OB1gmk?R5GO?Gzn%EVB_;1c!u*bY zf=a9gP{V&g09J8tCWS}GZYlRv7hhBQUp(`XBB;O&@z=rM`Jaoa(B3= zdp!70flIU+O38hyeh>VsQy^7AjkX{yEiJH7DxQ$rFxKAB%E$;<_|7YB1h*I<;%eNW zzBjS+_Lf$0n7CNoH6P8yb2FS=wuigx#7|5d08nsD0a)2(niFkpl(G3ZoOk6(wDqfs z3L^nV<*T(YuM)WuP;2bb@~1Y$%euK2&Uo|8pC;-B8m%IJOZ@HXARM*Ey+4GI$+9IR z-GNDS7rseFcxT{)D5(Jt%;3(Qt1l?pmwx@qF>v(q+JdSy_lnH-;2bUjM3%+8tUB1F zz;wIME@6iq_UBlsr%=`)+Z8~xtIySZh($p_0zQm-`>=tO?hu9%MN}Oy#s#6A z9?;r1uuyh{Ke zjM+mu{5QA9QWIY1e{4cwlkS3Ij-U(5-RA;t($9EoYR6)2Ih!A!IS*{WjRVa$G5d0r!t zfm|Vx3i*(p?KioZIP@accr8>dQNK(5({F7rG*y^68}U!xkrV%#=WlbiX`D5nodG2f z-XjneYx=#M0kswSw<*>T)LY7cdK{i`5uWHC4k1383D>(seAE>_LE+9GPp_P~NuH%c z#*V{QQ)b)qM;C<93BvPYKgz{>2)tAtB>2rI28$aacw(}Ke{Va zPbe&wn__G&(R}TgDvVloR|)z?`f7~*Z*P>KsZaN}W73u!@C1DtDbGzZWqLAq ycKE!|Xt9OY&_g4QcwL}jPEqFa|KJ6YCzQ7R`Gp>X!O^GSM@#*-T9JxX*#7`OhX@S- literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-0d643251a7.png b/docs/specs/application-command-class-specification/assets/img-0d643251a7.png new file mode 100644 index 0000000000000000000000000000000000000000..a73c98ca08f48396c76fe8e4281c38e5f004ec61 GIT binary patch literal 34666 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-6620b1beac.png b/docs/specs/application-command-class-specification/assets/img-6620b1beac.png new file mode 100644 index 0000000000000000000000000000000000000000..509bb8e0b204a75b955794008179cd7c1fc7f5ab GIT binary patch literal 2377 zcmeHIYdF-~8h^(Ovxz98NOVdnp$mIRn05-2TL($PgmiH$_C=rB*zle$K*2?Qd(IR=-!kGlHwq;dO=~`=50Df7rG&}4Nmd*Xd4%pBt)-)~9 zHes1J=j$FiV_kY|eW1R_iLHX?mo}Ku2+|6t9|S&{W>!-(KB#?COgMRQLfcr|Zagl+ z#pgn@2f;-}{f}h}%Y7E|){({eJ}HyD5TnY*jx0lVz+5Y%FRQO_1@qJ^t0+N>!Iwyw z*#t#JXxI=8c@Niu!=ET5@gUfpz{2jYfIq7GpI}EMXjIS8l%!@463!fbnybzqnV?8j z>wrVjY>SvJPq2uR8+A2cIL^bX&N+_sOaG5MLBU}VWwyUR_WpF3aL5nja0ET)ddi}!P$9G=C zcFtYqU-{c9#|Oqu?_W|zpUN;YTA+!W5TFHD*O?%!or;cOQl?OrWs_~>SB}{9Y8hlN zMOUlAJXg{YS6QkLx%O-7Yl!BOBKHgW3i*p^;Ro-GSk%tny;AmPo5?7{;Le+4*$3N zfE4~E~OO>bOl7 z``Vz&`*pTgW{az5RZYoAOZyJg zZ-Th{;zVCx-z!)4F@km7Rt`s|^~)w}R-SPa$m}&S8R+T)Bt{2I3<(LjcyZUW;AE_N zM`cZo62wteo8H~W$sZv8icI#FCv6i)Bn*N1Jb3bknQ~p2b!1uqE>+|2%@h?CbzGlg zz&H?Hn`O}>6c4YwsFyXm2NY*;w#@`@_1 z-lNgNUP9%$n?TF)94eKXSSZhFSm!>H(Y}y57V3pc2#CINa#=F(oB(!cYSQU+-Igv+ ztb3wvMZLd43WMbg9`}~tq-)KQ(1^_wDPmBN-u-uT$5_|4X|^aWyb`=@J3rShCP#0V zmzT%+GXW`M!1%<3;l|+ZS=FH=rUOf9p`Gds|Hus?5{cg45}>RpnO9w1T~RS}A?RN& zCQ9xjq+;Leq(#wLLOMi}mbMPYa}FUD6%{44;`aAj`HoR}{l>M8Rl40Ho0VdFQa|P# zF}i2tRJFX1>VH8c=|LGa+9Mr~k!kws`NF8h+vMBQ0_Uad({v5%jhI5M{jb;@b3 zlUv2oE-ddWFLW>eTwP8ZY`NuG|C4doIJ!PKHR5~m42!?Q6&O%?bv33x&+w*|27-O( z^E-9gOye>K-v@_}Ff#h^Epk`1|M28Dm)w+Lx+2htOklp1gcKRm%HY&xduYmzL0vGpI!dYR zoeXcNLbv_2Ry%lr{i|M0;q0xIkI#e#*d~)q0D7PzEX9++iz)_Vq7PIgA!7HYJ0jC9 zQpj8nkf*$g>_zPFfEEEF0RXwQ>avmqu#*u1WS3|{l&nsPy&3>`{ncQ>|C{}fcZR$# z5M+%_`Es90Vv(^aK6a^*-5=5;nD|7_MibSn0P(Ebj4=;rm53*{^l8sEi058^;EiH{9*^^ToIw_qQg$QS-*Amp z<=iJC4-exWyKrM&cB^dZKgAPValRTC@%^R}`=%_y37n+%ef@O#>d~BK z`-DwEv>?D-kJr5y=A_=2o{g?mH#!UMrADL_8cDEXh1D`+Ws6p0R?@1AdnVnqeoQR9 zS={DvASF2}Xg-@0|ItmQ>`6Hmkz}CTyeofr`Hb)(FZ4DP6cj}7a2j&KA_EMN3(#Zt z?_u(ob!bR-+0ZmJqwsGdf!PqXWPaQK>{%2n zj-rtmame|b`Is=q;c#}E4Y6&YYX=s2dso-iejM_wLx4h|$Sa(HuKdl&;NYN1;vYPo zKPZGNB4uS|-iZ&ac8L1ez_>^reJUv}#oz~f*leLjEAw-e&yUq1uoKKmR-~9mX0Z*s SuhCbZzU5IHv$EfaG5-cmZu+$V literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-6c1e53b1c3.png b/docs/specs/application-command-class-specification/assets/img-6c1e53b1c3.png new file mode 100644 index 0000000000000000000000000000000000000000..06b607f83bf853ff53928b94c44c6a4f7a46fea4 GIT binary patch literal 85524 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 literal 0 HcmV?d00001 diff --git a/docs/specs/command-class-specification/assets/img-6ceb291c6e.png b/docs/specs/application-command-class-specification/assets/img-6ceb291c6e.png similarity index 100% rename from docs/specs/command-class-specification/assets/img-6ceb291c6e.png rename to docs/specs/application-command-class-specification/assets/img-6ceb291c6e.png diff --git a/docs/specs/command-class-specification/assets/img-73381c079f.png b/docs/specs/application-command-class-specification/assets/img-73381c079f.png similarity index 100% rename from docs/specs/command-class-specification/assets/img-73381c079f.png rename to docs/specs/application-command-class-specification/assets/img-73381c079f.png diff --git a/docs/specs/application-command-class-specification/assets/img-799e562cbe.png b/docs/specs/application-command-class-specification/assets/img-799e562cbe.png new file mode 100644 index 0000000000000000000000000000000000000000..91c0c28525d6393a33f2d62f601b0e9be82b39b9 GIT binary patch literal 187655 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�*eTo^*Bfwx>*{KZW*WTjiz2X^Xy#Ul2@u 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

    u1Z5Su8YRJ$9qi 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

    X#A4P!AqI5OdVLu49CUopSTT= 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 literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-817f13d4ec.png b/docs/specs/application-command-class-specification/assets/img-817f13d4ec.png new file mode 100644 index 0000000000000000000000000000000000000000..cd55353f1e43cac584d42a3c00fe7b4fcb4128b0 GIT binary patch literal 1847 zcmeH||2NYM7{}LFq4m{{q`K8@rMu|h80A}B)K*fye0-)bVOWV7GFudlGIfil6bqS@ z4K2y?Esb$E?3VJS)szkS`pIZ3hO2Y#J?EZt&;1YX5AWxFp65BwFR$l0=ect1=s~#7 zMjaRo2FDz7a$j)%f(lkFUWgg88IJ|ijy!}T!(gi#e`paCwaO3%TRwzwa`24H8S9q1 z>3PGNNpm~of&R46nLJl%chPQQ30f$mmJ|v%++?gU*}hb74RFlFogIbZ;j6shZ}dJp zCtq+{>HTE6p)Tg`H^=7EeBJ8Nx$f)_J!19U$*rm8<{<<-+>1iwcJ7X9%LAtCfkSXq zVG6=spz|<*{-)fK2yV0BT;KS2nGt}(_+{@ySD5d>n`+V>6FTaSl@|m}n)8OAG-xhX zY5O>ycud@-y$;yZjY-n$BjaW}{HRkUJ7-x=iC!Z1k~0T(SEQ~lqbsd$rj{JJL;H2) z?V4}ZgxHL&xXIrk>o5YY#To~plVti7{b@rTn}{;R;jHiB;-U5zfs+s0jl*h3YH!_c zNvcQBCZLo+#wB30k?hVn2X2kQ!*iX~y{2n{q~1F+0!LH7--UBoEA3fPDx&NysJ#II zwybFtJ=*&-0r^69^TZ46AKTTI1+7Sz`gnf&e6uA>6g4`rp);#ie<9 zA0HHlL39%V_W2X(_*L*^RFu+v6G*b!By4MSIf(1hT8XlsS}CnvixP{)(khbNod!O9 z^eA36+B0HgRQBmc06P#bT9^c=)S2-Q)pC(2S!?yc;NX}{?4Hn39>AXL!c|+Ia!pQ7 zMk0}<&|n&kMk2kEwKZlUHxG$-Vh7|G~3!1Td^_ zzENmUr)U>2*MlH_$vhJV0$Kcx8Aon9X9b($9nt6HPhqKhrjR z8u7`Pu*UZJn2sk#M@R2SV*8F*ay*~GU6ch`K{h3q=1wkj;^N{WBO|xE=SIscI97%; z+hd&%-?@GJOTyVJr`h%Oz5P*7oeJ+eZ%$#pPm|u@=OE#5cw2k>seUfAsHjMJxkB

    %f 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 ZVSUo}n|8-`JE))pjIP12R$g(t`#->yqNV@< literal 0 HcmV?d00001 diff --git a/docs/specs/command-class-specification/assets/img-f586b8bafd.png b/docs/specs/application-command-class-specification/assets/img-f586b8bafd.png similarity index 100% rename from docs/specs/command-class-specification/assets/img-f586b8bafd.png rename to docs/specs/application-command-class-specification/assets/img-f586b8bafd.png diff --git a/docs/specs/command-class-specification/assets/img-fb25e9706c.png b/docs/specs/application-command-class-specification/assets/img-fb25e9706c.png similarity index 100% rename from docs/specs/command-class-specification/assets/img-fb25e9706c.png rename to docs/specs/application-command-class-specification/assets/img-fb25e9706c.png diff --git a/docs/specs/application-command-class-specification/assets/img-fd30697c72.png b/docs/specs/application-command-class-specification/assets/img-fd30697c72.png new file mode 100644 index 0000000000000000000000000000000000000000..372946dd204fe62e7331b282e1b13ae96ecbad6d GIT binary patch literal 201092 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 z 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 jU*3-WT==WlZ*+0 -# SDS13781-4 Z-Wave Application Command Class Specification +# SDS13781 Z-Wave Application Command Class Specification -*Source:* [SDS13781-4 Z-Wave Application Command Class Specification.pdf](../sources/SDS13781-4 Z-Wave Application Command Class Specification.pdf) -*Pages:* 592 +*Source:* [SDS13781 Z-Wave Application Command Class Specification.pdf](../sources/SDS13781 Z-Wave Application Command Class Specification.pdf) +*Version:* 15 +*Pages:* 664 *Generated by:* `tools/pdf2md/convert.py` (PyMuPDF 1.27.1) diff --git a/docs/specs/command-class-specification/01-abbreviations.md b/docs/specs/command-class-specification/01-abbreviations.md deleted file mode 100644 index ddcaee2..0000000 --- a/docs/specs/command-class-specification/01-abbreviations.md +++ /dev/null @@ -1,34 +0,0 @@ - -# 1 Abbreviations - -| | Abbreviation | | | Explanation | | -| --- | --- | --- | --- | --- | --- | -| AMR | | | Automatic Meter Reading | | | -| API | | | Application Programming Interface | | | -| ASCII | | | American Standard Code for Information Interchange. An ASCII code is the numerical representation of a character. | | | -| AV | | | Audio/Video | | | -| DHCP | | | Dynamic Host Configuration Protocol. | | | -| DNS | | | Dynamic Host Service | | | -| DST | | | Daylight Savings Time | | | -| HRV | | | Heat Recovery Ventilation | | | -| ID | | | Identifier | | | -| IP | | | Internet Protocol | | | -| IPV4 | | | Internet Protocol version 4 | | | -| IPV6 | | | Internet Protocol version 6 | | | -| LF | | | Linefeed character. | | | -| LSB | | | Less Significant Bit | | | -| MSB | | | Most Significant Bit | | | -| NIF | | | Node Information Frame | | | -| PIR | | | Pyroelectric Infrared | | | -| SUC | | | Static Update Controller | | | -| TZO | | | Time Zone Offset | | | -| Unicode | | | Unicode is a standard for encoding of characters. For more information, visit http://www.unicode.org/ | | | -| UTC | | | Universal Time (sometimes also called “Zulu Time”) was called Greenwich Mean Time (GMT) before 1972 | | | -| WMC | | | Windows Vista Media Center and Media Center 2005 remote controls | | | -| Z/IP | | | Z-Wave for IP | | | diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.01-overview.md b/docs/specs/command-class-specification/03-command-class-overview/03.01-overview.md deleted file mode 100644 index 848aede..0000000 --- a/docs/specs/command-class-specification/03-command-class-overview/03.01-overview.md +++ /dev/null @@ -1,10 +0,0 @@ - -# 3.1 Overview - -[The Device Class specification [1] and Z-Wave Plus Device Type [10] specification indicate combinations](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) of command classes which MUST be supported for a particular product class or type. diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.02-command-class-format.md b/docs/specs/command-class-specification/03-command-class-overview/03.02-command-class-format.md deleted file mode 100644 index 20b53e3..0000000 --- a/docs/specs/command-class-specification/03-command-class-overview/03.02-command-class-format.md +++ /dev/null @@ -1,77 +0,0 @@ - -# 3.2 Command class format - -## 3.2.1 Frame format - -All commands classes have a common header consisting of a Command Class identifier and a Command identifier. Each command can have from zero to N bytes of command data. The bit numbering starts at zero for the least significant bit. LSB is denoted as ‘Bit 0’ and MSB is denoted as ‘Bit 7 throughout the document. - -LSB and MSB notations are also used for multi bytes fields, indicating which byte is the most significant. - -[Figure 1 and Figure 2 below show the generic command frame for the two possible formats:](03.02-command-class-format.md#321-frame-format) - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class (0x20..0xEE) | | | | | | | | | | | | | | | | | | | | | | | | -| Command | | | | | | | | | | | | | | | | | | | | | | | | -| Command Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Command Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Figure 1, Generic command format - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class MSB (0xF1..0xFF) | | | | | | | | | | | | | | | | | | | | | | | | -| Command Class LSB (0x00..0xFF) | | | | | | | | | | | | | | | | | | | | | | | | -| Command | | | | | | | | | | | | | | | | | | | | | | | | -| Command Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Command Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Figure 2, Generic extended command format - -### 3.2.1.1 Command class - -[The Command Class identifier range is shown in Table 1.](03.02-command-class-format.md#3211-command-class) - -Table 1, Command Class identifier range - -| | Command Class | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | No Operation. Used by Z-Wave Protocol. MAY be used by the application. | | | -| 0x01..0x1F | | | Reserved for the Z-Wave protocol | | | -| 0x20..0xEE | | | Application Command Classes | | | -| 0xEF | | | Support/Control Mark | | | -| 0xF0 | | | Non interoperable | | | -| 0xF100 | | | Security Mark | | | -| 0xF101..0xFFFF | | | Extended Application Command Classes (2 byte-long Command Class identifier) | | | - -A Command Class can contain up to 255 different Commands. If the Command Class field is in the range 0xF1..0xFF, the Command Class identifier is therefore 2 bytes long. This allows for future extensions of the Command Classes and provides the possibility of having more than 4000 Command Classes. - -### 3.2.1.2 Command - -The command field contains the specific command indicating a node how to parse and interpret the command data. The command field length is always 1 byte. - -### 3.2.1.3 Command data (N bytes) - -The command data field contains data related to the command. The description for the command data is defined in each individual command. - -Simple commands, such as Get commands, usually contain no command data. Other commands, such as Set or Report commands can contain several bytes of command data. - -## 3.2.2 Command class versioning - -All command classes have a version number. The following rules apply to avoid interoperability issues when introducing the same Command Class with different versions: - - A node MUST NOT discard a frame based on the length field. A receiving node MUST use the Command Class identifier and the Command identifier to interpret the application frame. This enables a device, which supports version 1 of a Command Class to interpret the version 1 part of a received version 2 of the command. - - All implementations of a Command Class version higher than 1 MUST initialize all parameters associated with the version higher than 1. Thereby a node implementing the version 2 of a Command Class can interpret a version 1 received Command. - - A device supporting a Command Class having a version higher than 1 MUST support the [Version Command Class [15] to be able to identify the supported version. If a node does not](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) support the Version Command Class at its highest security level, it can be assumed that all Command Classes version are equal to 1. - - It is allowed to certify nodes supporting an older version of a Command Class despite a newer version exists as long as the generic/specific device specification does not require a specific version implemented. diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.04-node-information-frame.md b/docs/specs/command-class-specification/03-command-class-overview/03.04-node-information-frame.md deleted file mode 100644 index 24b40a4..0000000 --- a/docs/specs/command-class-specification/03-command-class-overview/03.04-node-information-frame.md +++ /dev/null @@ -1,134 +0,0 @@ - -# 3.4 Node Information Frame - -The Node Information Frame (NIF) is used to inform other devices about the node capabilities. The NIF contains a structure with a protocol specific part that is handled by the Z-Wave protocol and an application specific part that is filled in by the application. The protocol specific part consists of a bit telling if the node is a continuously listening device, the Basic Device Class the node is based on etc. The application specific part consists of the Generic and Specific Device Class and the Command Classes that are supported and/or controlled by the node. - -[Generic and Specific Device Class are defined in [1] for legacy Z-Wave nodes or in [10] for Z-Wave Plus](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) nodes. - -A NIF will be sent to the controller when a node is to be included in the network, excluded from the network or upon request. [Table 2 shows the NIF structure.](03.04-node-information-frame.md#34-node-information-frame) - -Table 2, Node Information Frame Format - -| | Byte descriptor \ bit number | | | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Capability | | | Liste- ning | | | Z-Wave Protocol Specific Part | | | | | | | | | | | | | | | | | | | | | -| Security | | | Opt. Func. | | | Z-Wave Protocol Specific Part | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | Z-Wave Protocol Specific Part | | | | | | | | | | | | | | | | | | | | | | | | -| Basic *) | | | Basic Device Class (Z-Wave Protocol Specific Part) | | | | | | | | | | | | | | | | | | | | | | | | -| Generic | | | Generic Device Class | | | | | | | | | | | | | | | | | | | | | | | | -| Specific | | | Specific Device Class | | | | | | | | | | | | | | | | | | | | | | | | -| NodeInfo[0] | | | Command Class 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | … | | | | | | | | | | | | | | | | | | | | | | | | -| NodeInfo[n-1] | | | Command Class N | | | | | | | | | | | | | | | | | | | | | | | | - -*) The “Basic” field is only included when the NIF is sent by a controller - -The Z-Wave Protocol in a controller saves all the Node Information except the supported and controlled Command Classes when a node is included in the network. The reserved field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 3.4.1 Z-Wave Protocol Specific Part - -The protocol specific part of the NIF is handled by the Z-Wave protocol. This information is automatically inserted in the packet by the protocol layer when transferring data using the API. - -Basic Device Class - -The Basic Device Class field contains an identifier that identifies what Basic Device Class this node is based on and is set by the Z-Wave protocol. A detailed description of all available Basic Device Classes [is given in [1] for Z-Wave devices and [10] for Z-Wave Plus devices. The Z-Wave Plus devices have an](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) additional parameter Role Type defining device role in the network. The Role Type parameter is [announced via the Z-Wave Plus Info Command Class [15].](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -This field is only included when the NIF frame is sent by a controller. A slave MUST omit this field. Refer [to [9] for controller and slave definition.](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -## 3.4.2 Application Specific Part - -The application specific part of the NIF is handled by the application. The information must be in accordance with the defined classes to obtain interoperability. - -Listening Flag - -The Listening flag is used to indicate that the node is always listening if set to 1. An always listening node must be powered continuously and reside on a fixed position in the installation. An always listening node is included in the routing table to assist as repeater in the network. The routing table is static during normal operation. In case the Listening flag is set to 0, the node is non-listening. This is typically used for battery operated nodes being asleep when the protocol is idle to prolong battery lifetime. A battery operated node is not included in the routing table and is not used as a router in the network. In some instances the node’s position in the network is still determined, and stored by the protocol. - -Optional Functionality Flag - -The Optional Functionality flag is used to indicate that this node supports other command classes than the mandatory for the selected generic/specific device class and that a controlling node needs to look at the supported command classes to fully control this device. - -Generic Device Class - -The Generic Device Class field contains an identifier that identifies what Generic Device Class this node is part of and must be set by the application. For a detailed description of all available Generic Device [Classes, refer to [1] for Z-Wave devices and [10] for Z-Wave Plus devices.](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -Specific Device Class - -The Specific Device Class field specifies what Specific Device Class this application is part of and must [be set by the application. For a detailed description of all available Specific Device Classes, refer to [1] for Z-Wave devices and [10] for Z-Wave Plus devices.](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -Command Class - -The Command Class field is used to advertise Command Classes implemented by the node. The field MUST NOT be longer than 35 bytes. - -The field MUST advertise the list of Command Classes that the node supports. - -The field MAY advertise the list of Command Classes that the node can control in other nodes. If present, the list of controlling Command Classes MUST be prepended by the COMMAND_CLASS_MARK Command Class identifier. It is NOT RECOMMENDED to advertise controlled Command Classes. - -It has been found that legacy controllers MAY read as little as 6 lines from this list. For backwards [compatibility, the list SHOULD advertise supported command classes in the order indicated in Table 3 :](03.04-node-information-frame.md#342-application-specific-part) - -Table 3, NIF :: Command Class advertising priorities - -| | Priority | | | Command Class | | -| --- | --- | --- | --- | --- | --- | -| 1 (First line) | | | COMMAND CLASS ZWAVEPLUS INFO _ _ _ Applies only to Z-Wave Plus products | | | -| 2 (if supported) | | | COMMAND CLASS SWITCH MULTILEVEL or _ _ _ COMMAND CLASS SWITCH BINARY _ _ _ | | | -| 3 (if supported) | | | COMMAND CLASS SWITCH ALL _ _ _ | | | -| 4 (if supported) | | | COMMAND CLASS ASSOCIATION _ _ | | | -| 5 | | | All other command classes | | | - -[Table 4 shows the Command Class list structure of the Node Information frame:](03.04-node-information-frame.md#342-application-specific-part) Table 4, NIF::Command Class list structure - -| Description | | | | Command Class list field content | | | | | | | | | | | | | | | | | | | | | | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | | | | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| Non-secure Supported Command Classes | | | Command Class 1 *) | | | | | | | | | | | | | | | | | | | | | | | | -| | | | … | | | | | | | | | | | | | | | | | | | | | | | | -| | | | Command Class M *) | | | | | | | | | | | | | | | | | | | | | | | | -| | Support/Control Mark | | | 0xEF | | | | | | | | | | | | | | | | | | | | | | | -| Non-secure Controlled Command Classes | | | Command Class 1 *) | | | | | | | | | | | | | | | | | | | | | | | | -| | | | … | | | | | | | | | | | | | | | | | | | | | | | | -| | | | Command Class K *) | | | | | | | | | | | | | | | | | | | | | | | | - - *) Command classes may be extended spanning two bytes for one command class - -The Command Class list MAY start or finish with the identifier COMMAND_CLASS_MARK. - -## 3.4.3 NIF and Multi Channel/Security Command Classes - -The NIF MUST represent command classes supported without Multi Channel or Security encapsulation [[14].](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -After inclusion in a Z-Wave network, the NIF represents the node’s Command Class capabilities when using no Security and no Multi Channel encapsulation. - -Multi Channel Root Devices advertise their capabilities via the NIF, but they advertise the Command Class capabilities of their End Points via the Multi Channel Command Class. - -Security bootstrapped nodes advertise their capabilities using security encapsulation via the Security 0 or Security 2 Command Class. - -The Command Class list advertised in the NIF may vary depending on the inclusion state and S0/S2 bootstrapping state of the node. - -A node supporting security (S0 and/or S2) MUST advertise command classes in the NIF according to [Table 5.](03.04-node-information-frame.md#343-nif-and-multi-channelsecurity-command-classes) Table 5, NIF content depending on inclusion and security bootstrapping - -| | Network inclusion | | | Security bootstrapping | | | Command Classes advertised in the NIF | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Not included in a network | | | N/A | | | At least all Command Classes that MUST always be non-securely supported. All supported Command Classes MAY be advertised | | | -| Included in a network | | | No security supported by the included node | | | All supported Command Classes | | | -| Included in a network | | | Before the node times out waiting for Security bootstrapping | | | At least all Command Classes that MUST always be non-securely supported. All supported Command Classes MAY be advertised | | | -| Included in a network | | | Timed out waiting for Security Bootstrapping (i.e. the process never started) | | | The same Command Class list as when security bootstrapping is successful but no key was granted1 | | | -| Included in a network | | | Security bootstrapping failed. (i.e. the process started but did not complete without error) | | | All Command Classes that MUST always be non-securely supported Command Classes that are supported when no key is granted MAY be added or removed from the list.1 | | | -| Included in a network | | | Bootstrapped with S0/S2 | | | All Command Classes that MUST always be non-securely supported only. (i.e. Command Classes supported even if not using S0/S2 encapsulation). | | | - -[Refer to each individual Device Type [10] for the list of Command Classes supported when no security key is granted](../04-command-class-definitions/04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) 1 - -Command Classes advertised as supported in the NIF after S0/S2 bootstrapping MUST also be supported at higher security levels unless encapsulated outside security. - -## 3.4.4 Command Class specific NIF rules - -A given Command Class MAY have additional requirement with respects to the NIF, Multi Channel Capability Report or S0/S2 Commands Supported Report. - -For example, the Basic Command Class is never advertised in the NIF or the Z-Wave Plus Info is always in the NIF if supported. - -In this case, requirements are listed in each individual Command Class definition, in the compatibility considerations section. diff --git a/docs/specs/command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md b/docs/specs/command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md deleted file mode 100644 index f5f8a25..0000000 --- a/docs/specs/command-class-specification/03-command-class-overview/03.07-common-fields-and-encoding.md +++ /dev/null @@ -1,136 +0,0 @@ - -# 3.7 Common fields and encoding - -## 3.7.1 Reserved and Res fields - -Fields named ‘Reserved’ or ‘Res’ MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 3.7.2 Reserved values and reserved bits - -Values of fields in commands that are marked as “reserved” or “res” MUST NOT be used by devices sending commands and MUST be ignored by devices receiving commands. - -Bits in commands that are marked as “reserved” or “res” MUST be set to 0 by devices sending commands and MUST be ignored by devices receiving commands. - -Undefined values for a given parameter MUST be treated as “reserved”. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. - -## 3.7.3 Duration encoding - -Some actuator command classes allow controlling nodes to specify a duration for reaching the target [value. The duration encoding is shown in Table 7.](03.07-common-fields-and-encoding.md#373-duration-encoding) - -Table 7, Actuator Command Class Duration Set encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Instantly | | | -| 0x01..0x7F | | | 1 second (0x01) to 127 seconds (0x7F) in 1 second resolution. | | | -| 0x80..0xFE | | | 1 minute (0x80) to 127 minutes (0xFE) in 1 minute resolution. | | | -| 0xFF | | | Factory default duration. | | | - -A node supporting an actuator Command Class may advertise the duration left to reach the target value [advertised in a report. The duration encoding is shown in Table 8.](03.07-common-fields-and-encoding.md#373-duration-encoding) - -Table 8, Actuator Command Class Duration Report encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | 0 seconds. Already at the Target Value. | | | -| 0x01..0x7F | | | 1 second (0x01) to 127 seconds (0x7F) in 1 second resolution. | | | -| 0x80..0xFD | | | 1 minute (0x80) to 126 minutes (0xFD) in 1 minute resolution. | | | -| 0xFE | | | Unknown duration | | | -| 0xFF | | | Reserved | | | - -## 3.7.4 Unsigned encoding - -Unless specified otherwise in a field description, the field encoding is using unsigned representation. [Examples for different field sizes are given in Table 9](03.07-common-fields-and-encoding.md#374-unsigned-encoding) - -[Table 9, Default unsigned encoding examples](03.07-common-fields-and-encoding.md#374-unsigned-encoding) - -| Value (hex) | Unsigned 8 bit representation (decimal) | | -| --- | --- | --- | -| 0x00 | 0 | | -| 0x01 | 1 | | -| 0x02 | 2 | | -| 0x7F | 127 | | -| 0x80 | 128 | | -| 0xFE | 254 | | -| 0xFF | 255 | | - -| Value (hex) | | Unsigned 16 bit | | -| --- | --- | --- | --- | -| | | representation | | -| | | (decimal) | | -| 0x0000 | 0 | | | -| 0x0001 | 1 | | | -| 0x0002 | 2 | | | -| 0x7FFF | 32767 | | | -| 0x8000 | 32768 | | | -| 0xFFFE | 65534 | | | -| 0xFFFF | 65535 | | | - -| Value (hex) | | Unsigned 32 bit | | -| --- | --- | --- | --- | -| | | representation | | -| | | (decimal) | | -| 0x00000000 | 0 | | | -| 0x00000001 | 1 | | | -| 0x00000002 | 2 | | | -| 0x7FFFFFFF | 2147483647 | | | -| 0x80000000 | 2147483648 | | | -| 0xFFFFFFFE | 4294967294 | | | -| 0xFFFFFFFF | 4294967295 | | | - -## 3.7.5 Signed encoding - -Some fields use the signed encoding representation.Signed encoding is using the two’s complement [representation. Fields using signed encoding MUST comply with Table 10.](03.07-common-fields-and-encoding.md#375-signed-encoding) - -Table 10, Signed field encoding (two’s complement representation) - -| Value (hex) | Signed 8 bit representation (decimal) | | -| --- | --- | --- | -| 0x7F | 127 | | -| 0x02 | 2 | | -| 0x01 | 1 | | -| 0x00 | 0 | | -| 0xFF | -1 | | -| 0xFE | -2 | | -| 0x80 | -128 | | - -| Value (hex) | | Signed 16 bit | | -| --- | --- | --- | --- | -| | | representation | | -| | | (decimal) | | -| 0x7FFF | 32767 | | | -| 0x0002 | 2 | | | -| 0x0001 | 1 | | | -| 0x0000 | 0 | | | -| 0xFFFF | -1 | | | -| 0xFFFE | -2 | | | -| 0x8000 | -32768 | | | - -| Value (hex) | | Signed 32 bit | | -| --- | --- | --- | --- | -| | | representation | | -| | | (decimal) | | -| 0x7FFFFFFF | 2147483647 | | | -| 0x00000002 | 2 | | | -| 0x00000001 | 1 | | | -| 0x00000000 | 0 | | | -| 0xFFFFFFFF | -1 | | | -| 0xFFFFFFFE | -2 | | | -| 0x80000000 | -2147483648 | | | - -## 3.7.6 Fields values and version - -New Command Class versions may define new possible values for a field introduced previously. In that case, a version column is added to the value table. A supporting node MUST support the values associated its version and previous versions and MUST NOT support values associated to future [versions. An example is given in Table 11.](03.07-common-fields-and-encoding.md#376-fields-values-and-version) Table 11, Field values and Command Class version (example) - -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Value introduced in version 1, valid and mandatory in all versions | | | 1 | | | -| 0x01 | | | Value introduced in version 2, valid and mandatory in version 2 and newer Version 1 MUST consider this value as reserved | | | 2 | | | -| 0x02 | | | Value introduced in version 2, valid and mandatory in version 2 and newer Version 1 MUST consider this value as reserved | | | 2 | | | -| 0xFF | | | Value introduced in version 3, valid and mandatory in version 3 and newer Version 1 and 2 MUST consider this value as reserved | | | 3 | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.01-all-switch-command-class-version-1-obsoleted.md b/docs/specs/command-class-specification/04-command-class-definitions/04.01-all-switch-command-class-version-1-obsoleted.md deleted file mode 100644 index d961f27..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.01-all-switch-command-class-version-1-obsoleted.md +++ /dev/null @@ -1,81 +0,0 @@ - -# 4.1 All Switch Command Class, version 1 [OBSOLETED] - -THIS COMMAND CLASS HAS BEEN OBSOLETED - -New implementations MUST NOT support this Command Class. Controlling nodes MUST use S2 Multicast mechanism in order to achieve the All On and All Off functionality - -The All Switch Command Class is used to switch all devices on or off. Devices may be excluded/included from the all on/all off functionality. The application determines which devices there are included in the all on/all off functionality as default. - -## 4.1.1 All Switch Set Command - -This command is used to instruct a device if it is included or excluded from the all on/all off functionality. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH ALL SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Mode | | | | | | | | | | | | | | | | | | | | | | | | - -Mode (8 bits) - -The mode field used to set the all on/all off functionality of the device. - -| | Mode | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Indicate that the switch is excluded from the all on/all off functionality. | | | -| 0x01 | | | Indicate that the switch is excluded from the all on functionality but not all off. | | | -| 0x02 | | | Indicate that the switch is excluded from the all off functionality but not all on. | | | -| 0x03..0xFE | | | Reserved | | | -| 0xFF | | | Indicates that the switch is included in the all on/all off functionality. | | | - -## 4.1.2 All Switch Get Command - -This command is used to ask a device if it is included or excluded from the all on/all off functionality. - -The All Switch Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH ALL GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.1.3 All Switch Report Command - -This command is used to report if the device is included or excluded from the all on/all off functionality. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH ALL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Mode | | | | | | | | | | | | | | | | | | | | | | | | - -Mode (8 bits) - -Refer to the All Switch Set Command. - -## 4.1.4 All Switch On Command - -This command is used to inform a switch that it SHOULD be turned on. A receiving device MUST NOT react to this command if the actual operation has been prohibited via the Switch All Set command. Like the Basic Set On command, this command MUST cause the device to restore the most recent (non-zero) level. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH ALL ON _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.1.5 All Switch Off Command - -This command is used to inform a switch that it SHOULD be turned off. A receiving device MUST NOT react to this command if the actual operation has been prohibited via the Switch All Set command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH ALL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH ALL OFF _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md deleted file mode 100644 index 169c80c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.04-alarm-silence-command-class-version-1.md +++ /dev/null @@ -1,51 +0,0 @@ - -# 4.4 Alarm Silence Command Class, version 1 - -The Alarm Silence Command Class may be used to temporarily disable the sounding of the alarm but still keep the alarm operating. - -## 4.4.1 Alarm Silence Set Command - -This command is used to remotely silence the sensor alarm. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SILENCE ALARM _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR ALARM SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Mode | | | | | | | | | | | | | | | | | | | | | | | | -| Seconds 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Seconds 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Bit Masks | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Mode (8 bits) - -Mode specifies the different options to silence sensor alarms. Modes are defined by the Z-Wave Alliance. - -| | Value | | | Mode | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Disable sounding of all sensor alarms independent of bit mask | | | -| 0x01 | | | Disable sounding of all sensor alarms independent of bit mask which have received the alarm via the Sensor Alarm Report command | | | -| 0x02 | | | Disable sounding of all sensor alarms according to bit mask | | | -| 0x03 | | | Disable sounding of all sensor alarms according to bit mask which have received the alarm via the Alarm Sensor Report Command | | | - -Seconds (16 bits) - -The field Seconds indicates the duration sounding of the alarm must be disable but still keep the alarm operating. If silence is engaged, the alarm will come back on when the duration expires unless the originating sensor clears the alarm. The value 0x0000 indicates that the time field MUST be ignored. Number of Bit Masks (8 bits) - -Indicates the Number of Bit Masks fields used in bytes. - -Bit Mask (N Bytes) - -The Bit Mask fields describe the sensor types to disable sounding from. - - Bit 0 in Bit Mask 1 indicates if Sensor Type = 0 (General Alarm) is disabled.  Bit 1 in Bit Mask 1 indicates if Sensor Type = 1 (Smoke Alarm) is disabled.  … - -If the sensor type is disabled the bit MUST be set to 1. If the sensor type is not disabled the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last sensor type to be disabled. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.04-barrier-operator-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.04-barrier-operator-command-class-version-1.md deleted file mode 100644 index 5edad3f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.04-barrier-operator-command-class-version-1.md +++ /dev/null @@ -1,210 +0,0 @@ - -# 4.4 Barrier Operator Command Class, version 1 - -The Barrier Operator Command Class is used to control and query the status of motorized barriers. - -## 4.4.1 Compatibility considerations - -A supporting node MAY ignore a Barrier Operator Command if the requested operation violates operational limitations or safety regulations. - -### 4.4.1.1 Node Information Frame (NIF) - -The Barrier Operator Command Class MUST be supported only using secure communication (S0 and/or S2 Command Class). - -A supporting node MUST NOT advertise the Barrier Operator Command Class in its NIF after network inclusion. - -### 4.4.1.2 Command Class dependencies - -A node supporting the Barrier Operator Command Class MUST support the Notification Command Class, version 4 or newer. - -## 4.4.2 Barrier Operator Set Command - -This command is used to initiate an unattended change in state of the barrier. - -A supporting node MAY ignore this command if the requested operation violates operational limitations or safety regulations. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | - -Target Value (8 bits) - -This field MUST specify the intended state of the device. [The encoding of this field MUST be according to Table 13.](04.04-barrier-operator-command-class-version-1.md#442-barrier-operator-set-command) - -Table 13, Barrier Set::Target Value - -| | Target Value | | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | CLOSE | | Initiate unattended close | | | 1 | | | -| 0xFF | | OPEN | | Initiate unattended open | | | 1 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -![Figure 3, Barrier Set, state transitions](assets/img-f94675db5a.png) - -A receiving node MUST comply with the allowed state changes and triggering commands specified in [Figure 3. Any state/command pair not specified in Figure 3 MUST NOT cause any action.](04.04-barrier-operator-command-class-version-1.md#442-barrier-operator-set-command) - -The receiving node SHOULD respond to OPEN and CLOSE commands. However, the receiving node MUST NOT respond to OPEN or CLOSE commands if any safety issue is detected. The receiving node MUST NOT respond to the CLOSE command unless it is in the “Open” state. - -### 4.4.2.1 Error Handling - -The device MUST stop if any safety issue is detected. - -If the requested operation is overruled by a safety mechanism, the device MUST notify the requester via a Notification Report with the Notification {Access Control::Barrier unable to perform requested operation due to UL requirements}. - -If the requested operation is prohibited by the specific device class, e.g. SPECIFIC_TYPE_SECURE_BARRIER_OPEN_ONLY or SPECIFIC_TYPE_SECURE_BARRIER_CLOSE_ONLY, the device MUST notify the requester by issuing CC:0066.01.01.11.009 an Application Rejected Request Command. The Application Rejected Request Command is a member of the Application Status Command Class. - -## 4.4.3 Barrier Operator Get Command - -This command is used to request the current state of a barrier operator device. - -[The Barrier Operator Report Command MUST be returned in response to this command.](04.04-barrier-operator-command-class-version-1.md#444-barrier-operator-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.4.4 Barrier Operator Report Command - -This command is used to advertise the status of the barrier operator device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| State | | | | | | | | | | | | | | | | | | | | | | | | - -State (8 bits) - -This field MUST advertise the current state of the device. [The encoding of this field MUST be according to Table 14.](04.04-barrier-operator-command-class-version-1.md#444-barrier-operator-report-command) - -Table 14, Barrier Report::State - -| Value | State | | Requirement | | Description | Version | -| --- | --- | --- | --- | --- | --- | --- | -| | | | level | | | | -| 0x00 | Closed | REQUIRED | | | The barrier is in the Closed position | 1 | -| 0x01..0x63 | Stopped at exact Position | RECOMMENDED | | | 0x01 = 1% (Near Closed) 0x63 = 99% (Near Open) | 1 | -| 0xFC | Closing | REQUIRED | | | The barrier is closing. The current position is unknown. | 1 | -| 0xFD | Stopped | REQUIRED | | | The barrier is stopped. The current position is unknown. | 1 | -| 0xFE | Opening | REQUIRED | | | The barrier is opening. The current position is unknown. | 1 | -| 0xFF | Open | REQUIRED | | | The barrier is in the Open position | 1 | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -## 4.4.5 Barrier Operator Get Signaling Capabilities Supported Command - -This command is used to query a device for available subsystems which may be controlled via Z-Wave. - -[The Barrier Operator Report Signaling Capabilities Supported Command MUST be returned in response](04.04-barrier-operator-command-class-version-1.md#446-barrier-operator-report-signaling-capabilities-supported-command) to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR SIGNAL SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.4.6 Barrier Operator Report Signaling Capabilities Supported Command - -This command returns a bit mask of signaling subsystem(s) supported by the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR SIGNAL SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| …. | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -This field is used to advertise the event signaling capabilities supported by the sending node. It MUST be treated as a bitmask. - -1. Bit 0 in Bit Mask 1 indicates if subsystem type 0x01 is supported 2. Bit 1 in Bit Mask 1 indicates if subsystem type 0x02 is supported 3. … - -If the subsystem type is supported, the corresponding bit MUST be set to 1. If the subsystem type is not supported, the corresponding bit MUST be set to 0. - -[For the complete list of subsystem types, refer to Table 15.](04.04-barrier-operator-command-class-version-1.md#447-barrier-operator-event-signal-set-command) - -The length of this field depends on the number of subsystems supported by the sending node. The length of this field MUST be in the range 1..32 bytes. A sending node MUST limit the length of this field to represent only those subsystems supported and MUST NOT extend the length of the Bit Mask to pad the packet with 0x00. - -## 4.4.7 Barrier Operator Event Signal Set Command - -This command is used to turn on or off an event signaling subsystem that is supported by the device. - -A supporting node MAY ignore this command if the requested operation violates safety regulartions. - -UL requirements MUST take precedence over any Set command sent to a subsystem. It is up to the discretion of the device to accept or reject the requested action. If the requested action is rejected, the node MUST notify the requester via the Notification Command Class Report with the Notification {Access Control::Barrier unable to perform requested operation due to UL requirements}. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR SIGNAL SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Subsystem Type | | | | | | | | | | | | | | | | | | | | | | | | -| Subsystem State | | | | | | | | | | | | | | | | | | | | | | | | - -Subsystem Type (8 bits) - -This field is used to indicate which subsystem type MUST be set at the receiving node. This field MUST [comply with Table 15.](04.04-barrier-operator-command-class-version-1.md#447-barrier-operator-event-signal-set-command) - -Table 15, Barrier Operator Event signal::Subsystem types encoding - -| | Subsystem Type | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | NOT SUPPORTED - reserved | | | 1 | | | -| 0x01 | | | The Barrier Device has an Audible Notification subsystem controllable via Z-Wave (For example: Siren) | | | 1 | | | -| 0x02 | | | The Barrier Device has an Visual Notification subsystem controllable via Z-Wave (For example: Flashing Light) | | | 1 | | | -| 0x03.. 0xFF | | | reserved | | | 1 | | | - -Subsystem State (8 bits) - -This field is used to indicate the state that the specified subsystem MUST assume at the receiving node. [This field MUST comply with Table 16.](04.04-barrier-operator-command-class-version-1.md#447-barrier-operator-event-signal-set-command) - -Table 16, Barrier Operator Event Signal::Subsystem states encoding - -| | Subsystem State | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Subsystem OFF | | | 1 | | | -| … | | | reserved | | | 1 | | | -| 0xFF | | | Subsystem ON | | | 1 | | | - -## 4.4.8 Barrier Operator Event Signaling Get Command - -This command is used to request the state of a signaling subsystem to a supporting node. - -The Barrier Operator Event Signaling Report Command MUST be returned in response to this command if the specified type is supported. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR SIGNAL GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Subsystem Type | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.4.7 Barrier Operator Event Signal Set Command.](04.04-barrier-operator-command-class-version-1.md#447-barrier-operator-event-signal-set-command) - -## 4.4.9 Barrier Operator Event Signaling Report - -This command is used to indicate the state of a notification subsystem of a Barrier Device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BARRIER OPERATOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BARRIER OPERATOR SIGNAL REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Subsystem Type | | | | | | | | | | | | | | | | | | | | | | | | -| Subsystem State | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.4.7 Barrier Operator Event Signal Set Command](04.04-barrier-operator-command-class-version-1.md#447-barrier-operator-event-signal-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.08-basic-window-covering-command-class-version-1-obsoleted.md b/docs/specs/command-class-specification/04-command-class-definitions/04.08-basic-window-covering-command-class-version-1-obsoleted.md deleted file mode 100644 index fe602d2..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.08-basic-window-covering-command-class-version-1-obsoleted.md +++ /dev/null @@ -1,43 +0,0 @@ - -# 4.8 Basic Window Covering Command Class, version 1 [OBSOLETED] - -THIS COMMAND CLASS HAS BEEN OBSOLETED - -New implementations MUST NOT support this command class. - -New window covering device implementations SHOULD support the Window Covering Command Class. - -This section contains Commands that may be used to control a Basic Window Covering Command Class. - -## 4.8.1 Basic Window Covering Start Level Change Command - -This command is used to start moving drapes, shades, blinds in a given direction. The speed of the movement is implementation specific. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC WINDOW COVERING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC WINDOW COVERING START LEVEL CHANGE _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | Open/ Close | | | Reserved | | | | | | | | | | | | | | | | | | - -Open/Close (1 bit) - -If the Open/Close bit is set to 0 the window covering SHOULD open. If field is set to 1 the window covering SHOULD close. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.8.2 Basic Window Covering Stop Level Change Command - -This command is used to stop moving drapes, shades, blinds in a given direction. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS BASIC WINDOW COVERING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = BASIC WINDOW COVERING STOP LEVEL CHANGE _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.100-thermostat-setback-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.100-thermostat-setback-command-class-version-1.md deleted file mode 100644 index dbdadcf..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.100-thermostat-setback-command-class-version-1.md +++ /dev/null @@ -1,84 +0,0 @@ - -# 4.100 Thermostat Setback Command Class, version 1 - -The Thermostat Setback Command Class is used to change the current state of a non-schedule setback thermostat. - -## 4.100.1 Thermostat Setback Set Command - -This command is used to set the state of the thermostat. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETBACK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETBACK SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Setback Type | | | | | | -| Setback State | | | | | | | | | | | | | | | | | | | | | | | | - -Setback Type (2 bits) - -[The setback type field MUST comply with Table 133](04.100-thermostat-setback-command-class-version-1.md#41001-thermostat-setback-set-command) - -Table 133, Thermostat Setback Set::Setback Type encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 0x01 0x02 0x03 | | | No override Temporary override Permanent override Reserved | | | - -Note: The temporary override provides an opportunity to implement a timer or equivalent in the device. A temporary override will, if a timer is implemented, be terminated by the timer. If no timer is implemented the temporary override MUST act as permanent override. If the temporary override is implemented it MUST be documented in the user’s manual. - -Setback State (8 bits) - -[The Setback State MUST comply with Table 134](04.100-thermostat-setback-command-class-version-1.md#41001-thermostat-setback-set-command) Table 134, Thermostat Setback Set::Setback State encoding - -| | Setback State | | | | | Description | -| --- | --- | --- | --- | --- | --- | --- | -| | Hexadecimal | | | Decimal | | | -| 0x80 … 0xFF 0x00 0x01 … 0x78 | | | -128 … -1 0 1 … 120 | | | The setback in 1/10 degrees (Kelvin) Example: 0 = 0 degrees setback 1 = 0.1 degrees is added to the setpoint 2 = 0.2 degrees is added to the setpoint -1 = 0.1 degrees is subtracted from the setpoint -2 = 0.2 degrees is subtracted from the setpoint | -| 0x79 | | | 121 | | | Frost Protection | -| 0x7A | | | 122 | | | Energy Saving Mode | -| 0x7B – 0x7E | | | 123 – 126 | | | Reserved | -| 0x7F | | | 127 | | | Unused State | - -Reserved values MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -When converting between Celsius and Fahrenheit proper rounding MUST be applied with at least two decimals in the internal calculations of a device to avoid rounding errors. - -Note: The implementation of Energy Saving Mode is manufacturer specific, and MUST be documented in the User’s Manual. If the device is set to an unreachable state, the device SHOULD assume the closest possible state. - -## 4.100.2 Thermostat Setback Get Command - -This command is used to request the current state of the thermostat. - -The Thermostat Setback Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETBACK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETBACK GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.100.3 Thermostat Setback Report Command - -This command is used to report the current state of the thermostat. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETBACK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETBACK REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Setback Type | | | | | | -| Setback State | | | | | | | | | | | | | | | | | | | | | | | | - -Setback Type (2 bits) - -Refer to description under the Thermostat Setback Set Command - -Setback State (8 bits) - -Refer to description under the Thermostat Setback Set Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.101-thermostat-setpoint-command-class-version-1-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.101-thermostat-setpoint-command-class-version-1-2.md deleted file mode 100644 index 47cdd98..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.101-thermostat-setpoint-command-class-version-1-2.md +++ /dev/null @@ -1,151 +0,0 @@ - -# 4.101 Thermostat Setpoint Command Class, version 1-2 - -The Thermostat Setpoint Command Class is used for setpoint handling. Version 2 extends the available number of setpoint types. - -## 4.101.1 Interoperability Considerations - -It has been found that early implementations of this Command Class specification apply two non- interoperable interpretations of the bit mask advertising the support for specific Setpoint Types. - -As a consequence, one may find thermostat products and controller products in the marketplace which [implement either of the two bit mask interpretations found in Table 135. The notation x.y indicates Bit](04.102-thermostat-setpoint-command-class-version-3.md#41021-interoperability-considerations) Mask byte x, bit y. - -Implementations of Thermostat Setpoint Command Class, version 1-2 SHOULD comply with Interpretation A. - -It is RECOMMENDED that a controlling node determines supported Setpoint Types by sending one Thermostat Setpoint Get Command at a time while incrementing the requested Setpoint Type. If the same Setpoint Type is advertised in the resulting Thermostat Setpoint Report Command, the controlling node MAY conclude that the actual Setpoint Type is supported. If the Setpoint Type 0x00 (type N/A) is advertised in the resulting Thermostat Setpoint Report Command, the controlling node MUST conclude that the actual Setpoint Type is not supported. - -## 4.101.2 Thermostat Setpoint Set Command - -This command is used to specify the target value for the specified Setpoint Type. - -It is RECOMMENDED that all combinations of precision, scale and size parameters are supported. The Thermostat Setpoint Set command MUST support the same format of precision, scale and size parameters as can be returned in the Thermostat Setpoint Report command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -[This field specifies the Setpoint to be set in the thermostat. The value MUST comply with Table 136.](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) Precision (3 bits) - -This field specifies the precision of the setpoint value. The value MUST indicate the number of decimals. As an example, the decimal value 1025 with precision 2 must be interpreted as 10.25. - -Scale (2 bits) - -[This field specifies the temperature scale used. The field MUST be encoded according to Table 137..](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) - -Size (3 bits) - -This field specifies the number of bytes used for the Value field. The value of this field MUST comply [with Table 138.](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) - -Value (N bytes) - -This field carries the actual setpoint value. The size of the field MUST comply with the size advertised by the Size field. - -[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The field Value 1 MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -## 4.101.3 Thermostat Setpoint Get Command - -This command is used to query the value of a specified setpoint type. - -The Thermostat Setpoint Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -Refer to description under the Thermostat Setpoint Set Command. - -If a request for a supported Setpoint Type value is received, the same value MUST be returned in the Thermostat Setpoint Report Command. - -If a request for a unsupported Setpoint Type value is received, the value 0x00 (N/A) MUST be returned in the Thermostat Setpoint Report Command. - -## 4.101.4 Thermostat Setpoint Report Command - -This command is used to advertise the value a setpoint type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT REPORT _ _ | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | - -Refer to Thermostat Setpoint Set command for fields not described below. - -Setpoint Type (4 bits) - -This field specifies the actual Setpoint advertised by the sending node. The value MUST comply with [Table 136.](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) - -If this field is set to 0x00 (N/A), it is RECOMMENDED to set the Size field to 1 and the Value field to 0. - -## 4.101.5 Thermostat Setpoint Supported Get Command - -This command is used to query the supported setpoint types. - -The Thermostat Setpoint Supported Report Command MUST be returned in response to this command. - -[This command is known to cause interoperability issues. Refer to section 4.101.1.](04.101-thermostat-setpoint-command-class-version-1-2.md#41011-interoperability-considerations) - -A controlling device SHOULD NOT rely on the information returned in the Thermostat Setpoint Supported Report Command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | - -## 4.101.6 Thermostat Setpoint Supported Report Command - -This command is used to advertise the supported setpoint types. - -[This command is known to cause interoperability issues. Refer to section 4.101.1.](04.101-thermostat-setpoint-command-class-version-1-2.md#41011-interoperability-considerations) - -A controlling device SHOULD NOT rely on the information returned in the Thermostat Setpoint Supported Report Command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -[The Bit Mask field advertises the supported Setpoint Types. Refer to section 4.101.1 for details on the](04.101-thermostat-setpoint-command-class-version-1-2.md#41011-interoperability-considerations) encoding of the Bit Mask field. - -If the Setpoint Type is supported the corresponding bit MUST be set to 1. If the Setpoint Type is not supported the corresponding bit MUST be set to 0. - -A node SHOULD send only the Bit Mask fields from 1 and up to the one indicating the last supported Setpoint Type. - -The number of Bit Mask fields MUST be determined from the length field of the frame. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.102-thermostat-setpoint-command-class-version-3.md b/docs/specs/command-class-specification/04-command-class-definitions/04.102-thermostat-setpoint-command-class-version-3.md deleted file mode 100644 index 1fb78c1..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.102-thermostat-setpoint-command-class-version-3.md +++ /dev/null @@ -1,260 +0,0 @@ - -# 4.102 Thermostat Setpoint Command Class, version 3 - -The Thermostat Setpoint Command Class, version 3 is an extension to support control and status monitoring functions of air-conditioning devices in order to cover functions found in typical air- conditioning products. The new features comprise: - - Discovery of the precision and size supported by the device  Discovery of the upper and lower limits of the specific setpoint type  New Thermostat Setpoint Types: Away Cooling, Full Power. - -## 4.102.1 Interoperability Considerations - -It has been found that early implementations of this Command Class specification apply two non- interoperable interpretations of the bit mask advertising the support for specific Setpoint Types. - -As a consequence, one may find thermostat products and controller products in the marketplace which [implement either of the two bit mask interpretations found in Table 135. The notation x.y indicates Bit](04.102-thermostat-setpoint-command-class-version-3.md#41021-interoperability-considerations) Mask byte x, bit y. Table 135, Thermostat Setpoint Types Bit Mask encoding - -| | Support Bit Mask, | | | Support Bit Mask, | | | Setpoint Type | | Description | | | Version | | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | Interpretation A | | | Interpretation B | | | Identifier | | | | | | | | -| | 1.0 | | | 1.0 | | | 0x00 | | | N/A | | | - | | -| | 1.1 | | 1.1 | | | 0x01 | | | Heating | | | 1 | | | -| | 1.2 | | 1.2 | | | 0x02 | | | Cooling | | | 1 | | | -| | | | | 1.3 | | | 0x03 | | | N/A | | | - | | -| | | | | 1.4 | | | 0x04 | | | N/A | | | - | | -| | | | | 1.5 | | | 0x05 | | | N/A | | | - | | -| | | | | 1.6 | | | 0x06 | | | N/A | | | - | | -| | 1.3 | | 1.7 | | | 0x07 | | | Furnace | | | 1 | | | -| | 1.4 | | 2.0 | | | 0x08 | | | Dry Air | | | 1 | | | -| | 1.5 | | 2.1 | | | 0x09 | | | Moist Air | | | 1 | | | -| 1.6 | 1.6 | | 2.2 | | | 0x0A | | | Auto changeover | | | 1 | | | -| 1.7 | | | 2.3 | | | 0x0B | | | Energy Save Heating | | | 2 | | | -| 2.0 | | | 2.4 | | | 0x0C | | | Energy Save Cooling | | | 2 | | | -| 2.1 | | | 2.5 | | | 0x0D | | | Away Heating | | | 2 | | | -| 2.2 | | | 2.6 | | | 0x0E | | | Away Cooling | | | 3 | | | -| | 2.3 | | 2.7 | | | 0x0F | | | Full Power | | | 3 | | | - -All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Implementations of Thermostat Setpoint Command Class, version 3 MUST comply with Interpretation A. - -It is RECOMMENDED that a controlling node determines supported Setpoint Types by sending one Thermostat Setpoint Get Command at a time while incrementing the requested Setpoint Type. If the same Setpoint Type is advertised in the resulting Thermostat Setpoint Report Command, the controlling node MAY conclude that the actual Setpoint Type is supported. If the Setpoint Type 0x00 (type N/A) is advertised in the resulting Thermostat Setpoint Report Command, the controlling node MUST conclude that the actual Setpoint Type is not supported. - -## 4.102.2 Thermostat Setpoint Set Command - -This command is used to specify the target value for the specified Setpoint Type. - -It is RECOMMENDED that all combinations of precision, scale and size parameters are supported. The Thermostat Setpoint Set command MUST support the same format of precision, scale and size parameters as can be returned in the Thermostat Setpoint Report command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -This field specifies the setpoint to be set in the thermostat. - -[The value MUST comply with Table 136.](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) Table 136, Thermostat Setpoint Set::Setpoint Types - -| Setpoint Type | Description | | CC | | -| --- | --- | --- | --- | --- | -| | | | Version | | -| 0x00 | N/A | - | | | -| 0x01 | Heating | 1 | | | -| 0x02 | Cooling | 1 | | | -| 0x03 | N/A | - | | | -| 0x04 | N/A | - | | | -| 0x05 | N/A | - | | | -| 0x06 | N/A | - | | | -| 0x07 | Furnace | 1 | | | -| 0x08 | Dry Air | 1 | | | -| 0x09 | Moist Air | 1 | | | -| 0x0A | Auto Changeover | 1 | | | -| 0x0B | Energy Save Heating | 2 | | | -| 0x0C | Energy Save Cooling | 2 | | | -| 0x0D | Away Heating | 2 | | | -| 0x0E | Away Cooling | 3 | | | -| 0x0F | Full Power | 3 | | | - -Values marked as not applicable (N/A) MUST be ignored by a receiving node. - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Precision (3 bits) - -This field specifies the precision of the setpoint value. The value MUST indicate the number of decimals. As an example, the decimal value 1025 with precision 2 must be interpreted as 10.25. - -Scale (2 bits) - -[This field specifies the temperature scale used. The field MUST be encoded according to Table 137.](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) - -Table 137, Thermostat Setpoint Set::Scale encoding - -| | Scale | Scale used in Value field | | -| --- | --- | --- | --- | -| 0 | | Celcius | | -| 1 | | Fahrenheit | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Size (3 bits) - -This field specifies the number of bytes used for the Value field. The value of this field MUST comply [with Table 138.](04.102-thermostat-setpoint-command-class-version-3.md#41022-thermostat-setpoint-set-command) - -Table 138, Thermostat Setpoint Set::Size encoding - -| | Size | | | Size of Value field | | -| --- | --- | --- | --- | --- | --- | -| 1 | | | 8 bit | | | -| 2 | | | 16 bit | | | -| 4 | | | 32 bit | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Value (N bytes) - -This field carries the actual setpoint value. The size of the field MUST comply with the size advertised by the Size field. - -[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The field Value 1 MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -## 4.102.3 Thermostat Setpoint Get Command - -This command is used to query the value of a specified setpoint type. - -The Thermostat Setpoint Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -Refer to description under the Thermostat Setpoint Set Command. - -If a supported Setpoint Type value is received, the same value MUST be returned in the Thermostat Setpoint Report Command. - -If an unsupported Setpoint Type value is received, the value 0x00 (N/A) MUST be returned in the Thermostat Setpoint Report Command. - -## 4.102.4 Thermostat Setpoint Report Command - -This command is used to advertise the value of a setpoint type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT REPORT _ _ | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | - -Refer to Thermostat Setpoint Set command for parameter/field descriptions. - -## 4.102.5 Thermostat Setpoint Supported Get Command - -This command is used to query the supported setpoint types. - -The Thermostat Setpoint Supported Report Command MUST be returned in response to this command. - -[This command is known to cause interoperability issues. Refer to section 4.102.1.](04.102-thermostat-setpoint-command-class-version-3.md#41021-interoperability-considerations) - -A controlling device SHOULD NOT rely on the information returned in the Thermostat Setpoint Supported Report Command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | - -## 4.102.6 Thermostat Setpoint Supported Report Command - -This command is used to advertise the supported setpoint types. - -[This command is known to cause interoperability issues. Refer to section 4.102.1.](04.102-thermostat-setpoint-command-class-version-3.md#41021-interoperability-considerations) - -A controlling device SHOULD NOT rely on the information returned in the Thermostat Setpoint Supported Report Command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask field advertises the supported Setpoint Types. - -[Refer to section 4.102.1 for details on the encoding of the Bit Mask field.](04.102-thermostat-setpoint-command-class-version-3.md#41021-interoperability-considerations) - -If the Setpoint Type is supported, the corresponding bit MUST be set to 1. If the Setpoint Type is not supported the corresponding bit MUST be set to 0. - -A node SHOULD send only the Bit Mask fields from 1 and up to the one indicating the last supported mode. - -The number of Bit Mask fields MUST be determined from the length field of the frame. - -## 4.102.7 Thermostat Setpoint Capabilities Get Command - -This command is used query the minimum and maximum setpoint values for the specified Setpoint Type. - -The Thermostat Setpoint Capabilities Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT CAPABILITIES GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Setpoint Type (4 bits) - -Refer to description under the Thermostat Setpoint Set Command. - -If a supported Setpoint Type value is received, the same value MUST be returned in the Thermostat Setpoint Capabilities Report Command. - -If an unsupported Setpoint Type value is received, the value 0x00 (N/A) MUST be returned in the Thermostat Setpoint Report Command. - -## 4.102.8 Thermostat Setpoint Capabilities Report Command - -This command is used to advertise the minimum and maximum values for the advertised Setpoint Type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT SETPOINT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT SETPOINT CAPABILITIES REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Min Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Min Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Max Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Max Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Refer to Thermostat Setpoint Set command for field descriptions. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.103-time-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.103-time-command-class-version-1.md deleted file mode 100644 index cf19142..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.103-time-command-class-version-1.md +++ /dev/null @@ -1,115 +0,0 @@ - -# 4.103 Time Command Class, version 1 - -The Time Command Class, version1 is used to read date and time from a supporting node in a Z-Wave network. - -## 4.103.1 Compatibility considerations - -Notice that the former Time Command Class version 1 (Revision 4 of this document) is discontinued and replaced by a new one. - -### 4.103.1.1 Node Information Frame (NIF) - -A supporting node MUST always advertise the Time Command Class in its NIF, regardless of the security bootstrapping outcome. - -This allows other nodes bootstrapped on any security level to request the current time from a supporting node. - -## 4.103.2 Interoperability considerations - -Nodes supporting this Command Class are time servers for other nodes in a Z-Wave network. Other nodes can learn the current date and time by querying nodes supporting this Command Class. - -For nodes based on a slave Role Type, it is RECOMMENDED to support a dedicated Association Group which issues the Time Get Command and/or the Date Get Command. Controlling nodes SHOULD automatically associate such association groups to a node supporting the Time Command Class. - -## 4.103.3 Time Get Command - -This command is used to request the current time from a supporting node. - -[The Time Report Command MUST be returned in response to this command.](04.103-time-command-class-version-1.md#41034-time-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.103.4 Time Report Command - -This command is used to report the current time. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| RTC failure | | | Reserved | | | | | | Hour Local Time | | | | | | | | | | | | | | | -| Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -RTC failure (1 bit) - -Many RTC chips have a stop bit indicating if the oscillator has been stopped. The RTC failure bit MUST be set to 1 in order to indicate to the receiving node that the RTC has been stopped and that the advertised time might be inaccurate. - -If the sending node does not support this feature or if the oscillator has not been stopped, it MUST set this field to 0. If the receiving node does not support this feature, it MUST ignore this field. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Hour Local Time (8 bits) - -This field is used to indicate the number of complete hours that have passed since midnight in local time. This field MUST be in the range 0..23. - -Minute Local Time (8 bits) - -This field is used to indicate the number of complete minutes that have passed since the start of the hour in local time. This field MUST be in the range 0..59. - -Second Local Time (8 bits) - -This field is used to indicate the number of complete seconds that have passed since the start of the minute in local time. This field MUST be in the range 0..59. - -Note: the time synchronization between nodes may vary by a few seconds due to delays introduced by the wireless communication. - -## 4.103.5 Date Get Command - -This command is used to request the current date adjusted according to the local time zone and Daylight Saving Time from a supporting node. - -[The Date Report Command MUST be returned in response to this command.](04.103-time-command-class-version-1.md#41036-date-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DATE GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.103.6 Date Report Command - -This command is used to advertise the current date adjusted according to the local time zone and Daylight Saving Time. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DATE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | - -Year (16 bits) - -This field MUST specify the current year using the Gregorian calendar. The first byte (Year 1) MUST be the most significant byte. - -For example, Year1= 0x07 and Year2 =0xD7 MUST indicate year 2007 - -Month (8 bits) - -This field MUST specify the current month of the year. This field MUST be in the range 1..12 (representing respectively January...December). - -Day (8 bits) - -This field MUST specify current the day of the month. This field MUST be in the range 1..31. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.104-time-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.104-time-command-class-version-2.md deleted file mode 100644 index a5eb0c6..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.104-time-command-class-version-2.md +++ /dev/null @@ -1,131 +0,0 @@ - -# 4.104 Time Command Class, version 2 - -The Time Command Class, version 2 is used to read date and time from a supporting node in a Z-Wave network. - -## 4.104.1 Compatibility considerations - -The Time Command Class, version 2 is backwards compatible with the Time Command Class, version 1. - -The Time Command Class, version 2 enables reading and setting Time Zone Offset and Daylight Saving Time parameters. The data formats are based on the International Standard ISO 8601. - -Commands not described in this version MUST remain unchanged from version 1. - -### 4.104.1.1 Node Information Frame (NIF) - -A supporting node MUST always advertise the Time Command Class in its NIF, regardless of the security bootstrapping outcome. - -This allows other nodes bootstrapped on any security level to request the current time from a supporting node. - -## 4.104.2 Interoperability considerations - -Nodes supporting this Command Class are time servers for other nodes in a Z-Wave network. Other nodes can learn the current date and time by querying nodes supporting this Command Class. - -For nodes based on a slave Role Type, it is RECOMMENDED to support a dedicated Association Group which issues the Time Get Command, the Date Get Command and/or the Time Offset Get Command. Controlling nodes SHOULD automatically associate such association groups to a node supporting the Time Command Class, version 2. - -The purpose of this Command Class is to read the current date and time information from supporting nodes. Hence, supporting nodes MAY ignore the Time Offset Set Command introduced in version 2 if they rely on another source to retrieve the Time Zone Offset and Daylight Saving Time information. - -## 4.104.3 Time Offset Get Command - -This command is used to request the Time Zone Offset (TZO) and Daylight Savings Time (DST) parameters from a supporting node. - -[The Time Offset Report Command MUST be returned in response to this command.](04.104-time-command-class-version-2.md#41045-time-offset-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME OFFSET GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.104.4 Time Offset Set Command - -This command is used to set Time Zone Offset (TZO) and Daylight Savings Time (DST) at the supporting node. - -This command MAY be ignored by a supporting node if it relies on another source to retrieve the TZO/DST information. This command SHOULD be ignored if it is not received at the highest granted security level. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME OFFSET SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sign TZO | | | Hour TZO | | | | | | | | | | | | | | | | | | | | | -| Minute TZO | | | | | | | | | | | | | | | | | | | | | | | | -| Sign Offset DST | | | Minute Offset DST | | | | | | | | | | | | | | | | | | | | | -| Month Start DST | | | | | | | | | | | | | | | | | | | | | | | | -| Day Start DST | | | | | | | | | | | | | | | | | | | | | | | | -| Hour Start DST | | | | | | | | | | | | | | | | | | | | | | | | -| Month End DST | | | | | | | | | | | | | | | | | | | | | | | | -| Day End DST | | | | | | | | | | | | | | | | | | | | | | | | -| Hour End DST | | | | | | | | | | | | | | | | | | | | | | | | - -Sign TZO (1 bit) - -This field is used to indicate the sign (plus or minus) to apply to the Hour TZO and Minute TZO fields. - -The value 0 MUST indicate the Plus sign (positive offset from UTC) The value 1 MUST indicate the Minus sign (negative offset from UTC) - -Hour TZO (7 bits) - -This field is used to indicate the number of hours that the originating time zone deviates from UTC. This field SHOULD be in the range 0..14. - -Minute TZO (7 bits) - -This field is used to indicate the number of minutes that the originating time zone deviates UTC. This field MUST be in the range 0..59. - -Sign Offset DST (1 bit) - -This field is used to indicate the sign (plus or minus) for the Minute Offset DST field to apply to the current time while in the Daylight Saving Time. - -The value 0 MUST indicate the Plus sign (positive offset from current time), The value 1 MUST indicate the Minus sign (negative offset from current time). - -Minute Offset DST (7 bits) - -This field MUST indicate the number of minutes by which the current time is to be adjusted when Daylight Saving Time starts. - -Month Start DST (8 bits) - -This field MUST indicate the month of the year when Daylight Saving Time starts. This field MUST be in the range 1..12 (representing respectively January...December). - -Day Start DST (8 bits) - -This field MUST indicate the day of the month when Daylight Saving Time starts. This field MUST be in the range 1..31. - -Hour Start DST (8 bits) - -This field MUST indicate the hour of the day when Daylight Saving Time starts. This field MUST be in the range 0..23. - -Month End DST (8 bits) - -This field MUST indicate the month of the year when Daylight Saving Time ends. This field MUST be in the range 1..12 (representing respectively January...December). - -Day End DST (8 bits) - -This field MUST indicate the day of the month when Daylight Saving Time ends. This field MUST be in the range 1..31 Hour End DST (8 bits) - -This field MUST indicate the hour of the day when Daylight Saving Time ends. This field MUST be in the range 0..23. - -## 4.104.5 Time Offset Report Command - -This command is used to advertise the Time Zone Offset (TZO) and Daylight Savings Time (DST) parameters. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME OFFSET REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sign TZO | | | Hour TZO | | | | | | | | | | | | | | | | | | | | | -| Minute TZO | | | | | | | | | | | | | | | | | | | | | | | | -| Sign Offset DST | | | Minute Offset DST | | | | | | | | | | | | | | | | | | | | | -| Month Start DST | | | | | | | | | | | | | | | | | | | | | | | | -| Day Start DST | | | | | | | | | | | | | | | | | | | | | | | | -| Hour Start DST | | | | | | | | | | | | | | | | | | | | | | | | -| Month End DST | | | | | | | | | | | | | | | | | | | | | | | | -| Day End DST | | | | | | | | | | | | | | | | | | | | | | | | -| Hour End DST | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.104.4 Time Offset Set Command. A sending node MUST comply with fields’ description from 4.104.4 Time Offset Set Command.](04.104-time-command-class-version-2.md#41044-time-offset-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.105-time-parameters-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.105-time-parameters-command-class-version-1.md deleted file mode 100644 index f708241..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.105-time-parameters-command-class-version-1.md +++ /dev/null @@ -1,81 +0,0 @@ - -# 4.105 Time Parameters Command Class, version 1 - -The Time Parameters Command Class is used to set date and time in a device hosting this facility. In case the clock is updated via an external source such as SAT, internet, Rugby/Frankfurt source, omit this command class. Time zone offset and daylight savings may be set in the Time Command Class if necessary. The data formats are based on the International Standard ISO 8601. - -## 4.105.1 Time Parameters Set Command - -This command is used to set current date and time in Universal Time (UTC). Be aware that the communication overhead may be significant in case routing is necessary. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME PARAMETERS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME PARAMETERS SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | -| Hour UTC | | | | | | | | | | | | | | | | | | | | | | | | -| Minute UTC | | | | | | | | | | | | | | | | | | | | | | | | -| Second UTC | | | | | | | | | | | | | | | | | | | | | | | | - -Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Day (8 bits) - -Specify the day of the month between 01 and 31. - -Hour UTC (8 bits) - -Specify the number of complete hours that have passed since midnight (00..23) in UTC. - -Minute UTC (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00..59) in UTC. Minutes are measured in Universal Time (UTC). - -Second UTC (8 bits) - -Specify the number of complete seconds since the start of the minute (00..59) in UTC. Seconds are measured in Universal Time (UTC). - -## 4.105.2 Time Parameters Get Command - -This command is used to request date and time parameters. - -The Time Parameters Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME PARAMETERS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME PARAMETERS GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.105.3 Time Parameters Report Command - -This command is used to advertise date and time. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TIME PARAMETERS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TIME PARAMETERS REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | -| Hour UTC | | | | | | | | | | | | | | | | | | | | | | | | -| Minute UTC | | | | | | | | | | | | | | | | | | | | | | | | -| Second UTC | | | | | | | | | | | | | | | | | | | | | | | | - -Refer to description under the Time Parameters Set Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.106-user-code-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.106-user-code-command-class-version-1.md deleted file mode 100644 index 3337d2b..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.106-user-code-command-class-version-1.md +++ /dev/null @@ -1,134 +0,0 @@ - -# 4.106 User Code Command Class, version 1 - -The User Code Command Class is used to manage User Codes in access control systems. - -## 4.106.1 Interoperability considerations - -A node supporting the Door Lock Command Class SHOULD reflect user code inputs in the door lock status when relevant. (e.g. when the door becomes unlocked by a User Code input, the Door Lock Mode is also updated to unlocked) - -This Command Class can be used in conjunction with Schedule Entry Lock Command Class in order to schedule access for users. - -A node receiving a User Code Get Command MUST advertise what User Code is set in the User Code Report Command. It has been found that some version 1 nodes wrongfully report obfuscated User Codes in the User Code Report (e.g. ‘******’). A controlling node SHOULD understand that a code has been set correctly but cannot be read back with such nodes. - -## 4.106.2 User Code Set Command - -This command is used to set a User Code at the receiving node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS USER CODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = USER CODE SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| User ID Status | | | | | | | | | | | | | | | | | | | | | | | | -| User Code 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| User Code N | | | | | | | | | | | | | | | | | | | | | | | | - -User Identifier (8 bits) - -This field is used to specify the actual User Identifier. - -The implemented User Identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 User Identifiers MUST accept values in the range 1..10. - -A receiving node MAY ignore this field if it only supports one User Code. - -The value 0 MUST indicate that the receiving node MUST set the User Code and User Status for all available users. The value 0 SHOULD be used only with User ID Status set to 0x00. - -[If a non-existing User Identifier (higher than the advertised supported users number in the Users Number Report Command) is specified in this command, a receiving node MUST ignore the command](04.106-user-code-command-class-version-1.md#41066-users-number-report-command) User ID Status (8 bits) - -[The User ID Status field indicates the status of the User Identifier. This field MUST comply with Table 139.](04.106-user-code-command-class-version-1.md#41062-user-code-set-command) The User ID Status 0xFE SHOULD NOT be used in this command. - -Table 139, User Code Set::User ID Status encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Available (not set) | | | -| 0x01 | | | Occupied | | | -| 0x02 | | | Reserved by administrator | | | -| 0xFE | | | Status not available | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -User Code (N bytes) - -This field is used to advertise the User Code to be set for the User Identifier. - -The length of this field MUST be between 4 and 10 bytes. The field’s length MUST be determined using the length of the frame. - -Each byte in this field MUST be a digit encoded with ASCII representation (from 0x30 to 0x39). A node receiving an invalid User Code MUST ignore the command. - -The User Code field MUST be set to 0x00000000 (4 bytes) when User ID Status is equal to 0x00. - -## 4.106.3 User Code Get Command - -This command is used to request the User Code of a specific User Identifier. - -[The User Code Report Command MUST be returned in response to this command.](04.106-user-code-command-class-version-1.md#41064-user-code-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS USER CODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = USER CODE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | - -User Identifier (8 bits) - -This field is used to specify the requested User Identifier. - -The value 0 MUST NOT be specified in the User Code Get Command. - -[If the specified User Identifier is not supported, a responding node SHOULD return a User Code Report Command with the User ID Status set to 0xFE “Status not available”.](04.106-user-code-command-class-version-1.md#41064-user-code-report-command) - -## 4.106.4 User Code Report Command - -This command is used to advertise a User Code and its current status. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS USER CODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = USER CODE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| User ID Status | | | | | | | | | | | | | | | | | | | | | | | | -| User Code 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| User Code N | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.106.2 User Code Set Command.](04.106-user-code-command-class-version-1.md#41062-user-code-set-command) - -## 4.106.5 Users Number Get Command - -This command is used to request the number of user codes supported by the receiving node. - -[The Users Number Report Command MUST be returned in response to this command.](04.106-user-code-command-class-version-1.md#41066-users-number-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS USER CODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = USERS NUMBER GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.106.6 Users Number Report Command - -This command is used to report the number of User Codes supported by the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS USER CODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = USERS NUMBER REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Users | | | | | | | | | | | | | | | | | | | | | | | | - -Supported Users (8 bits) - -This field is used to advertise the number of supported User Codes. - -This field MUST be set to the total amount of supported User Codes. The value ‘0’ MUST indicate that no User Code is supported by the node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.107-window-covering-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.107-window-covering-command-class-version-1.md deleted file mode 100644 index 2ad8535..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.107-window-covering-command-class-version-1.md +++ /dev/null @@ -1,381 +0,0 @@ - -# 4.107 Window Covering Command Class, version 1 - -The Window Covering Command Class is used to control window covering devices. - -[The Window Covering Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.107.1 Terminology - -A window covering device may be closed or open. The term closed represents the lowest light throughput, while open represents the highest light throughput. - -A window covering device may provide one or more properties such as up/down movement combined with for example slats angle control. - -Each of the available properties is advertised. A window covering device may offer precise control of the position of a property or it may offer a more limited movement control, where it is possible to start and stop movement in one of two directions but where the target position cannot be specified. - -If a window covering parameter is marked as position unknown, this indicates that the actual property can only be controlled via start and stop of movement. - -[The parameters controlling edges are identified as outlined in Table 140.](04.107-window-covering-command-class-version-1.md#41071-terminology) - -Table 140, Identification of edges - -| | Edge | | Description | Usage examples | -| --- | --- | --- | --- | --- | -| | Title | | | | -| out left _ | | | Outbound edge towards the left | | -| out right _ | | | Outbound edge towards the right | | -| in left _ | | | Inbound edge towards the left | | -| in right _ | | | Inbound edge towards the right | | -| in right left _ _ | | | Inbound edges controlled horizontally as one | | - -![figure p578](assets/img-fbc9bfea32.png) - -![figure p578](assets/img-91ca87aebd.png) - -![figure p578](assets/img-95385a795f.png) - -![figure p578](assets/img-234b052b98.png) - -![figure p578](assets/img-0d25374112.png) - -| | Edge | | Description | Usage examples | -| --- | --- | --- | --- | --- | -| | Title | | | | -| out bottom _ | | | Outbound edge towards the bottom | | -| out top _ | | | Outbound edge towards the top | | -| in bottom _ | | | Inbound edge towards the bottom | | -| in top _ | | | Inbound edge towards the top | | -| in top bottom _ _ | | | Inbound edges controlled vertically as one | | - -![figure p579](assets/img-f8baa4593b.png) - -![figure p579](assets/img-b897b5e07d.png) - -![figure p579](assets/img-ec65ec745a.png) - -![figure p579](assets/img-f5af822b72.png) - -![figure p579](assets/img-762e99613e.png) - -## 4.107.2 Compatibility considerations - -This Command Class replaces the following command classes: - - Basic Window Covering Command Class [OBSOLETED]  Move To Position Window Covering Command Class [OBSOLETED] - -### 4.107.2.1 Motor Control Device Class support - -A device supporting this command class SHOULD comply with the Motor Control Specific Device Class [B or C [1] for backwards compatibility with existing window covering control applications.](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -### 4.107.2.2 Multilevel Switch Command Class support - -A device supporting the Window Covering Command Class, Version 1 MUST support the Multilevel Switch Command Class, version 3 or newer. - -With the exception for slats angle control, the following mapping MUST apply: - -The Multilevel Switch value 0x00 MUST represent the least light, i.e. covering fully closed. The Multilevel Switch value 0x63 MUST represent the most light, i.e. covering fully opened. - -For slats angle control, the following mapping MUST apply: - -The Multilevel Switch value 0x00 MUST represent slats closed to the one side. The Multilevel Switch value 0x32 MUST represent slats open. The Multilevel Switch value 0x63 MUST represent slats closed to the other side. - -The purpose of supporting the Multilevel Switch Command Class is to allow a general purpose remote control to control window covering devices even though that remote control does not implement the Window Covering Command Class. By mapping the Multilevel Switch value 0 to the closed position, a multicasted or broadcasted Multilevel Switch Command that turns off light sources will also cause window coverings to close, thus reducing light from the outside. - -An implementation MAY allow the Multilevel Switch Command Class to control multiple features like up/down control as well as slats angle control. For instance, the Start Level Change command may start changing the slats angle towards the extreme angle and when reaching that extreme angle, it may start moving up or down. This way, multiple functions can be controlled from a general purpose remote control, although with less convenience than if a dedicated window covering remote control is used. - -### 4.107.2.3 Basic Command Class support - -A device supporting the Window Covering Command Class, version 1 MUST support the Basic Command Class, version 2 or newer. - -[The Basic Command Class MUST be mapped according to the actual Device Class, refer to [1].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -## 4.107.3 Window Covering Parameters - -Each distinct property of a window covering device is accessed via a dedicated parameter. - -Two variants are defined for many parameters: One allows full position control, including movement control. The other variant is limited to movement control. - -If a device implements full position control of a property, it MUST NOT implement the parameter limited to movement control. - -The term “Closed” represents the lowest light throughput, while “Open” represents the highest light throughput of the window covering. - -Table 141, Window Covering Parameter IDs - -| | Parm | | Description | | Value | | Encoding | -| --- | --- | --- | --- | --- | --- | --- | --- | -| | ID | | | | range | | | -| Outbound horizontal control | | | | | | | | -| 0 | | | out left: Outbound edge towards the left _ Right/Left movement (Position unknown) | NA | | | Level Change Up = Opening Level Change Down = Closing | -| 1 | | | out left: Outbound edge towards the left _ Right/Left position Parm 0 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| 2 | | | out right: Outbound edge towards the right _ Right/Left movement (Position unknown) | NA | | | Level Change Up = Opening Level Change Down = Closing | -| 3 | | | out right: Outbound edge towards the right _ Right/Left position Parm 2 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | - -| | Parm | | Description | | Value | | Encoding | -| --- | --- | --- | --- | --- | --- | --- | --- | -| | ID | | | | range | | | -| Inbound horizontal control | | | | | | | | -| 4 | | | in left: Inbound edge towards the left _ Right/Left movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 5 | | | in left: Inbound edge towards the left _ Right/Left position Parm 4 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| 6 | | | in right: Inbound edge towards the right _ Right/Left movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 7 | | | in right: Inbound edge towards the right _ Right/Left position Parm 0x18 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| 8 | | | in right left: _ _ Inbound edges controlled horizontally as one Right/Left movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 9 | | | in right left: _ _ Inbound edges controlled horizontally as one Right/Left position Parm 8 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| Angle control of vertical slats | | | | | | | | -| 10 | | | Vertical slats angle Right/Left movement (Position unknown) | NA | | | Level Change Down = Closing; to the right inside Level Change Up = Closing; to the left inside (Open is passed midway between the two closing positions) | -| 11 | | | Vertical slats angle Right/Left position Parm 10 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed; to the right inside 0x32 = Open 0x63 = Closed; to the left inside | -| Outbound vertical control | | | | | | | | -| 12 | | | out bottom: Outbound edge towards the bottom _ Up/Down movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 13 | | | out bottom: Outbound edge towards the bottom _ Up/Down position Parm 12 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | - -| | Parm | | Description | | Value | | Encoding | -| --- | --- | --- | --- | --- | --- | --- | --- | -| | ID | | | | range | | | -| 14 | | | out top: Outbound edge towards the top _ Up/Down movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 15 | | | out top: Outbound edge towards the top _ Up/Down position Parm 14 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| Inbound vertical control | | | | | | | | -| 16 | | | in bottom: Inbound edge towards the bottom _ Up/Down movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 17 | | | in bottom: Inbound edge towards the bottom _ Up/Down position Parm 16 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| 18 | | | in top: Inbound edge towards the top _ Up/Down movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 19 | | | in top: Inbound edge towards the top _ Up/Down position Parm 18 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| 20 | | | in top bottom: _ _ Inbound edges controlled vertically as one Up/Down movement (Position unknown) | NA | | | Level Change Down = Closing Level Change Up = Opening | -| 21 | | | in top bottom: _ _ Inbound edges controlled vertically as one Up/Down position Parm 20 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed 0x63 = Open | -| Angle control of horizontal slats | | | | | | | | -| 22 | | | Horizontal slats angle Up/Down movement (Position unknown) | NA | | | Level Change Down = Closing; up inside Level Change Up = Closing; down inside (Open is passed midway between the two closing positions) | -| 23 | | | Horizontal slats angle Up/Down position Parm 22 MUST NOT be supported | 0x00 – 0x63 | | | 0x00 = Closed; up inside 0x32 = Open 0x63 = Closed; down inside | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. A device MAY implement up to 100 hardware levels (including 0) for a given parameter. If a device implements less than 100 hardware levels, the hardware levels MUST be distributed uniformly over the entire range. The mapping of parameter values to hardware levels MUST be monotonous, i.e. a higher value MUST [be mapped to either the same or a higher hardware level. An example is found in Table 142.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Table 142, Parameter value mapping to a limited number of hardware levels (example) - -| | Horizontal Slats Angle | | | Hardware level | | -| --- | --- | --- | --- | --- | --- | -| 0x00..0x13 | | | 100% Up inside | | | -| 0x14..0x27 | | | 50% Up inside | | | -| 0x28..0x3B | | | Open | | | -| 0x3C..0x4F | | | 50% Down inside | | | -| 0x50..0x63 | | | 100% Down inside | | | - -## 4.107.4 Window Covering Supported Get Command - -This command is used to request the supported properties of a device. - -[The Window Covering Supported Report Command MUST be returned in response to this command.](04.107-window-covering-command-class-version-1.md#41075-window-covering-supported-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.107.5 Window Covering Supported Report Command - -This command is used to advertise the supported properties of a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Number of Parameter Mask bytes | | | | | | | | | | | | -| Parameter Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Number of Parameter Mask bytes (4 bits) - -The Number of Parameter Masks field MUST advertise the number of bytes carrying the Covering Parameter Mask field. - -The value MUST be in the range 1..15. - -Parameter Mask (N Bytes) - -The Parameter Mask field MUST advertise the Parameters supported by the device. - -The length of this field MUST be advertised by the Number of Parameter Masks field. - - Bit 0 in Bit Mask 1 indicates if Parameter ID 0 is supported  Bit 1 in Bit Mask 1 indicates if Parameter ID 1 is supported  … - -[For the definition of Parameter IDs, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -## 4.107.6 Window Covering Get Command - -This command is used to request the status of a specified Covering Parameter. - -The Window Covering Report command MUST be returned in response to this command. - -This command SHOULD NOT be used for parameters marked as (position unknown). A receiving node returning a Window Covering Report command for a parameter marked as (position unknown) MUST return the value 0x00 in the Current Value and Target Value fields while the Duration field value MUST be 0xFE. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter ID | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter ID (8 bits) - -This field MUST specify the Parameter for which the status is requested. [For the definition of Parameter IDs, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -## 4.107.7 Window Covering Report Command - -This command is used to advertise the status of a Parameter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter ID | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter ID (8 bits) - -This field MUST advertise the Parameter covered by this report. [For the definition of Parameter IDs, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Current Value (8 bits) - -The Current Value field MUST advertise the current value of the Parameter identified by the Parameter ID field. - -The Current Value SHOULD be identical to the Target Value when a transition has ended. - -[For the definition of valid parameter values, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Target Value (8 bits) - -The Target Value field MUST advertise the target value of an ongoing transition or the most recent transition for the advertised Parameter ID. - -If a transition is initiated in an interactive fashion via a local user interface or via a Start Level Change command, the advertised Target Value MUST be 0x00 or 0x63, depending on the direction. - -[For the definition of valid parameter values, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Duration (8 bits) - -The Duration field SHOULD advertise the time needed to reach the Target Value at the actual transition [rate. The encoding of the Duration field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) - -The Duration is defined as the interval from start of the transition until the Target Value is reached. - -## 4.107.8 Window Covering Set Command - -This command is used to control one or more parameters in a window covering device. - -A node receiving this command MUST ignore parameters marked as (position unknown). [Refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Parameter Count | | | | | | | | | | | | | | | -| | Parameter ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Value 1 | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Value N | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Parameter Count (5 bits) - -This field MUST specify the number of (Parameter ID, Value) datasets contained in the Window Covering Set command. - -Parameter ID (N bytes) - -This field MUST specify the Parameter to receive a new value. [For the definition of Parameter IDs, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Value (N bytes) - -This field MUST specify the value of the Parameter identified by the Parameter ID field. [For the definition of valid parameter ID values, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Duration (8 bits) - -The Duration field MUST specify the time that the transition should take from the current value to the new target value. A supporting device SHOULD respect the specified Duration value. - -[The encoding of the Duration field MUST be according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) - -## 4.107.9 Window Covering Start Level Change Command - -This command is used to initiate a transition of one parameter to a new level. - -A receiving node MUST initiate the transition to a new value for the specified Parameter ID. - -A node receiving this command MUST accept all parameter IDs supported by the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING START LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Res | | | Up/ Down | | | Res | | | | | | | | | | | | | | | | | | -| Parameter ID | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Up/Down (1 bit) - -This field MUST specify the direction of the level change. - -If the Up/Down bit is set to 0 the level change MUST be increasing. If the Up/Down bit is set to 1 the level change MUST be decreasing. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Parameter ID (8 bits) - -This field MUST specify the Parameter to start a transition. [For the definition of Parameter IDs, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) - -Duration (8 bits) - -The level change rate MUST be calculated to match a level change from the minimum value to the maximum value during the time specified by the Duration field. A supporting device SHOULD respect the specified Duration value. - -[The encoding of the Duration field MUST be according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) - -## 4.107.10 Window Covering Stop Level Change Command - -This command is used to stop an ongoing transition. - -A receiving node MUST stop the transition if the specified Parameter ID is currently in transition to a new value. A receiving node MUST NOT stop ongoing transitions for other Parameter IDs than the one specified. - -A node receiving this command MUST accept all parameter IDs supported by the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS WINDOW COVERING _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = WINDOW COVERING STOP LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter ID | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter ID (8 bits) - -This field MUST specify the parameter to stop a transition. [For the definition of Parameter IDs, refer to Table 141.](04.107-window-covering-command-class-version-1.md#41073-window-covering-parameters) APPENDIX A ASCII CODES - -The standard ASCII table defines 128 character codes (from 0 to 127), of which, the first 32 are control codes (non-printable), and the remaining 96 character codes are printable characters. The table below shows the hexadecimal values of the ASCII character codes, e.g. the ASCII code for the capital letter “A” is equal to 0x41: - -Table 143, The standard ASCII Table - -![figure p590](assets/img-bda7a771b4.jpeg) - -In addition to the 128 standard ASCII codes (the ones listed above ranging from 0 to 127), most systems have another 128 extra codes which form what is known as extended ASCII (with ranges from 128 to 255). The OEM Extended ASCII character set is included in all PC-compatible computers as the default character set when the system boots before loading any operating system and under MS-DOS. It includes some foreign signs, some marked characters and also pieces to draw simple panels. The table below shows the hexadecimal values of the OEM Extended ASCII character codes, e.g. the ASCII code for the capital letter “Æ” is equal to 0x92: Table 144, OEM Extended ASCII Table - -![figure p591](assets/img-031d09cc57.jpeg) - -Below are listed codes for players, radios etc. as an alternative to the OEM Extended ASCII codes. Undefined values MUST be ignored. - -Table 145, Players Table - -![figure p591](assets/img-9fde74cbd0.jpeg) - -REFERENCES - -[1] Sigma Designs, SDS10242, Software Design Spec., Z-Wave Device Class Specification. [2] Sigma Designs, SDS12657, Z-Wave Command Class Specification A-M. [3] Sigma Designs, SDS12652, Z-Wave Command Class Specification N-Z. [4] IETF RFC 4861, Neighbor Discovery for IP version 6 (IPv6), [http://tools.ietf.org/pdf/rfc4861.pdf](http://tools.ietf.org/pdf/rfc4861.pdf) [5] IETF RFC 3122, Extensions to IPv6 Neighbor Discovery for Inverse Discovery Specification, [http://tools.ietf.org/pdf/rfc3122.pdf](http://tools.ietf.org/pdf/rfc3122.pdf) [6] IETF RFC 2119, Key words for use in RFCs to Indicate Requirement Levels, [http://tools.ietf.org/pdf/rfc2119.pdf](http://tools.ietf.org/pdf/rfc2119.pdf) [7] IETF RFC 2460, Internet Protocol, Version 6 (IPv6) Specification, [http://tools.ietf.org/pdf/rfc2460.pdf](http://tools.ietf.org/pdf/rfc2460.pdf) [8] IETF RFC 4291, IP Version6 Addressing Architecture, [http://tools.ietf.org/pdf/rfc4291.pdf](http://tools.ietf.org/pdf/rfc4291.pdf) [9] Sigma Designs, SDS11846, Z-Wave Plus Role Types Specification. [10] Sigma Designs, SDS11847, Z-Wave Plus Device Types Specification. [11] Graphical UI elements, [http://en.wikipedia.org/wiki/Graphical_user_interface_elements](http://en.wikipedia.org/wiki/Graphical_user_interface_elements) [12] Sigma Designs, SDS13425. Z-Wave Plus Assigned Manufacturer IDs. [13] Sigma Designs, SDS13548, List of defined Z-Wave Command Classes [14] Sigma Designs, SDS13783, Z-Wave Transport-Encapsulation Command Class Specification [15] Sigma Designs, SDS13782, Z-Wave Management Command Class Specification [16] Sigma Designs, SDS13784, Z-Wave Network-Protocol Command Class Specification [17] Sigma Designs, SDS13812, Multilevel Sensor Command Class, list of assigned Multilevel Sensor types and scales [18] Sigma Designs, SDS13713, Notification Command Class, list of assigned Notifications [19] Sigma Designs, SDS13907, Simple AV Command Class, list of assigned AV Control codes diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.11-binary-switch-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.11-binary-switch-command-class-version-1.md deleted file mode 100644 index 20b8872..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.11-binary-switch-command-class-version-1.md +++ /dev/null @@ -1,77 +0,0 @@ - -# 4.11 Binary Switch Command Class, version 1 - -The Binary Switch Command Class is used to control the On/Off state of supporting nodes. [The Binary Switch Command Class is an actuator control Command Class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.11.1 Binary Switch Set Command - -This command is used to set the On/Off state at the receiving node. A receiving node MAY apply a non-zero duration to the transition from one value to a new value. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH BINARY SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -This field is used to specify the On/Off state that the receiving node MUST assume. This field MUST be [encoded according to Table 19.](04.11-binary-switch-command-class-version-1.md#4111-binary-switch-set-command) - -Table 19, Binary Switch Set :: Value - -| | Value | | | Level | | | State | -| --- | --- | --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | | 0% | | | Off | | -| 1..99 (0x01..0x63) | | | 100% | | | On | | -| 255 (0xFF) | | | 100% | | | On | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -The above value mapping of the Binary Switch Command Class Value allows a controlling node to control a mixed group of Binary Switch and Multilevel Switch supporting nodes via Basic Set commands. Nodes supporting the Binary Switch Command Class turn On or Off while nodes supporting the Multilevel Switch Command Class are set at the specified value level. - -## 4.11.2 Binary Switch Get Command - -This command is used to request the current On/Off state from a node. - -The Binary Switch Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH BINARY GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.11.3 Binary Switch Report Command - -This command is used to advertise the current On/Off state at the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH BINARY REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -This field is used to advertise the current On/Off state at the sending node. This field MUST be encoded [according to Table 20](04.11-binary-switch-command-class-version-1.md#4113-binary-switch-report-command) - -Table 20, Binary Switch Report :: Value - -| | Value | | | Level | | | State | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | | 0% | | | Off | | | -| 254 (0xFE) | | | Unknown | | | Unknown | | | -| 255 (0xFF) | | | 100% | | | On | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -This field SHOULD advertise the current value of the node’s hardware; also while in transition to a new value. - -A controlling node MUST NOT assume that this field’s value is identical to the value previously issued with a Binary Switch Set Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.12-binary-switch-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.12-binary-switch-command-class-version-2.md deleted file mode 100644 index be5c38d..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.12-binary-switch-command-class-version-2.md +++ /dev/null @@ -1,65 +0,0 @@ - -# 4.12 Binary Switch Command Class, version 2 - -The Binary Switch Command Class is used to control the On/Off state of supporting nodes. [The Binary Switch Command Class is an actuator control Command Class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.12.1 Compatibility considerations - -A node supporting Binary Switch Command Class, version 2 MUST support the Binary Switch Command Class, version 1. - -Commands not described in this version MUST remain unchanged from version 1. - -Version 2 adds duration and target value control and reporting. - -## 4.12.2 Binary Switch Set Command - -This command is used to set the binary state at the receiving node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH BINARY SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Target Value (8 bits) - -This field is used to specify the On/Off state that the receiving node MUST assume. This field MUST be [encoded according to Table 19.](04.11-binary-switch-command-class-version-1.md#4111-binary-switch-set-command) - -Duration (8 bits) - -This field is used to specify the duration that the transition from the current value to the Target Value SHOULD take. A supporting node SHOULD respect the specified duration value. - -[The encoding of the Duration value MUST be according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) - -## 4.12.3 Binary Switch Report Command - -This command is used to advertise the current On/Off state at the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH BINARY _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH BINARY REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value | | | | | | | | | | | | | | | | | | | | | | | | -| Target Value | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Current Value (8 bits) - -This field is used to advertise the current On/Off state at the sending node. This field MUST be encoded [according to Table 20](04.11-binary-switch-command-class-version-1.md#4113-binary-switch-report-command) - -The advertised Current Value MUST NOT be updated to the Target Value before the hardware actuator has actually reached the Target Value. - -Target Value (8 bits) - -This field MUST advertise the target value of an ongoing transition or the most recent transition. [This field MUST be encoded according to Table 20.](04.11-binary-switch-command-class-version-1.md#4113-binary-switch-report-command) - -Duration (8 bits) - -The duration field SHOULD advertise the duration of a transition from the Current Value to the Target Value. [The encoding of the Duration field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.13-binary-toggle-switch-command-class-version-1-obsoleted.md b/docs/specs/command-class-specification/04-command-class-definitions/04.13-binary-toggle-switch-command-class-version-1-obsoleted.md deleted file mode 100644 index b11e14a..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.13-binary-toggle-switch-command-class-version-1-obsoleted.md +++ /dev/null @@ -1,50 +0,0 @@ - -# 4.13 Binary Toggle Switch Command Class, version 1 [OBSOLETED] - -THIS COMMAND CLASS HAS BEEN OBSOLETED - -A node MUST NOT implement this Command Class. New implementations MUST use the Binary Switch Command Class. - -The Binary Toggle Switch Command Class is used for toggle-style control of binary actuator devices. - -## 4.13.1 Binary Toggle Switch Set Command - -This command is used to toggle a device e.g. from on to off and from off to on. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE BINARY _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE BINARY SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.13.2 Binary Toggle Switch Get Command - -This command is used to request the state of the load controlled by the device. - -The Binary Toggle Switch Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE BINARY _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE BINARY GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.13.3 Binary Toggle Switch Report Command - -This command is used to advertise the value of a toggle switch. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH TOGGLE BINARY _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH TOGGLE BINARY REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -The value MAY be 0x00 (off) or 0xFF (on). diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.14-climate-control-schedule-command-class-version-1-deprecated.md b/docs/specs/command-class-specification/04-command-class-definitions/04.14-climate-control-schedule-command-class-version-1-deprecated.md deleted file mode 100644 index 7128beb..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.14-climate-control-schedule-command-class-version-1-deprecated.md +++ /dev/null @@ -1,234 +0,0 @@ - -# 4.14 Climate Control Schedule Command Class, version 1 [DEPRECATED] - -THIS COMMAND CLASS HAS BEEN DEPRECATED - -A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Schedule Command Class. If implementing this command class, it is RECOMMENDED that the Schedule Command Class is also implemented. - -The Climate Control Schedule Command Class allows devices to exchange schedules and overrides, which specify when to perform a setback on the setpoint. - -Note: The setpoint is the temperature a device will try to maintain. The setback is a deviation from the setpoint. When a setback is in use the device will apply the setback to the setpoint, resulting in a different temperature. When using schedules and overrides it is possible to define several setbacks occurring at specific times. - -Schedules are exchanged using the Schedule Commands. Overrides of schedules are exchanged using the Schedule Override Commands. Detection of updated schedules is done using the Schedule Changed Commands. - -The Climate Control Schedule uses the Schedule State type to define each setback. The Schedule State type has the following format: - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Schedule State | | | | | | | | | | | | | | | | | | | | | | | | - -Schedule State (8 bits) - -The values are as follows: - -| | Schedule State | | | | | Description | -| --- | --- | --- | --- | --- | --- | --- | -| | Hexadecimal | | | Decimal | | | -| 0x80 … 0xFF 0x00 0x01 … 0x78 | | | -128 … -1 0 1 … 120 | | | The setback in 1/10 degrees (Kelvin) Example: 0 = 0 degrees setback 1 = 0.1 degrees is added to the setpoint 2 = 0.2 degrees is added to the setpoint -1 = 0.1 degrees is subtracted from the setpoint -2 = 0.2 degrees is subtracted from the setpoint | -| 0x79 | | | 121 | | | Frost Protection | -| 0x7A | | | 122 | | | Energy Saving Mode | -| 0x7B – 0x7E | | | 123 – 126 | | | Reserved | -| 0x7F | | | 127 | | | Unused State | - -When converting between Celsius and Fahrenheit proper rounding MUST be applied with at least two decimals in the internal calculations of a device to avoid rounding errors. - -When displaying converted Fahrenheit values it is RECOMMENDED that the displayed value is rounded to nearest quarter of a degree. - -## 4.14.1 Schedule Set Command - -This command is used to set the climate control schedule in a device for a specific weekday. A climate control schedule defines when to use a setback on the setpoint in a device. A schedule can hold a maximum of 9 switchpoints. A switchpoint defines one setback from the current setpoint. - -The entire list of switchpoints in the Command MUST be ordered by time, ascending from 00:00 towards 23:59. Switchpoints which have a Schedule State set to “Unused” MUST be placed last. Duplicates MUST NOT be allowed for Switchpoints which have a Schedule State different from “Unused”. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Weekday | | | | | | | | | -| | Switchpoint 0 Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 0 Byte 2 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 0 Byte 3 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 8 Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 8 Byte 2 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 8 Byte 3 | | | | | | | | | | | | | | | | | | | | | | | - -Weekday (3 bits) - -[This field MUST be encoded according to Table 21.](04.14-climate-control-schedule-command-class-version-1-deprecated.md#4141-schedule-set-command) - -Table 21, Climate Control Schedule Set::Weekday encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 | | | Reserved Monday Tuesday Wednesday Thursday Friday Saturday Sunday | | | - -Switchpoint (9*24 bits) - -| | 7 | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Reserved | | | | | | | Hour | | | | | | | | | | | | | | | -| Reserved | | | | Minute | | | | | | | | | | | | | | | | | | -| Schedule State | | | | | | | | | | | | | | | | | | | | | | - -Hour (5 bits) - -This field is used to specify the hour of the of the actual switchpoint. This field MUST be in the range 0..23. - -Minute (6 bits) - -This field is used to specifiy the minute of the actual switchpoint. This field MUST be in the range 0..59. - -Schedule State (8 bits) - -[Schedule State uses the Schedule State type format, see section 4.14. If Schedule State has the value](04.14-climate-control-schedule-command-class-version-1-deprecated.md#414-climate-control-schedule-command-class-version-1-deprecated) of “Unused”, the Hour and Minute field MUST be ignored. Once a Schedule State of “Unused” is encountered, the parsing of switchpoints must stop. - -## 4.14.2 Schedule Get Command - -This command is used to request the climate control schedule in a device for a specific weekday. - -The Schedule Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE GET _ | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | Weekday | | | | | | | | | - -[For fields’ description, refer to 4.14.1 Schedule Set Command](04.14-climate-control-schedule-command-class-version-1-deprecated.md#4141-schedule-set-command) - -## 4.14.3 Schedule Report Command - -This command is used to report the climate control schedule in a device for a specific weekday. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Weekday | | | | | | | | | -| | Switchpoint 0 Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 0 Byte 2 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 0 Byte 3 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 8 Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 8 Byte 2 | | | | | | | | | | | | | | | | | | | | | | | -| | Switchpoint 8 Byte 3 | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.14.1 Schedule Set Command](04.14-climate-control-schedule-command-class-version-1-deprecated.md#4141-schedule-set-command) - -## 4.14.4 Schedule Changed Get Command - -This command is used to check if the climate control schedule has changed. - -The Schedule Changed Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE CHANGED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.14.5 Schedule Changed Report Command - -This command is used to report if the climate control schedule has changed. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE CHANGED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| ChangeCounter | | | | | | | | | | | | | | | | | | | | | | | | - -ChangeCounter (8 bits) - -The ChangeCounter is a timestamp for a climate control schedule and it is kept in devices which exchange climate control schedules. - -One device holds a climate control schedule and other devices uses this climate control schedule. Whenever the climate control schedule changes, the device MUST update its ChangeCounter, and the other devices MUST regularly use the Schedule Changed Get Command on the device which holds the Climate Control Schedule to see if the ChangeCounter is different from last time – indicating a change in a climate control schedule. - -The possible values are: - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | The climate control schedule change mechanism is temporarily disabled by the override function. | | | -| 0x01..0xFF | | | The climate control schedule change mechanism is enabled. ChangeCounter is incremented by one every time climate control schedule changes. When ChangeCounter eventually reach 0xFF, the next increment MUST rollover to 0x01. | | | - -When a device is fresh and has no climate control schedule it MUST retrieve a climate control schedule using the Schedule Get Command and it MUST also use the Schedule Changed Get to get the first copy of the current ChangeCounter, thus avoiding getting the climate control schedule initially twice. - -When a device is awake after sleep mode it SHOULD use this Command to detect if the schedule has been changed. - -## 4.14.6 Schedule Override Set Command - -This command is used to set the override in a device. - -The purpose of an override is to inform a device to ignore its current climate control schedule and assume the setting provided by the Override Type and Override State fields. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE OVERRIDE SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Override Type | | | | | | -| Override State | | | | | | | | | | | | | | | | | | | | | | | | - -Override Type (2 bits) - -[This field MUST be encoded according to Table 22.](04.14-climate-control-schedule-command-class-version-1-deprecated.md#4146-schedule-override-set-command) - -Table 22, Climate Control Schedule Override Set::Override Type encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 0x01 0x02 0x03 | | | No override Temporary override Permanent override Reserved | | | - -Note: The difference between a temporary and a permanent override is that a temporary override only overrides the current switchpoint in the climate control schedule. - -Both temporary and permanent overrides MAY be cancelled in the device, which receives the SCHEDULE_OVERRIDE_SET. This cancellation MUST be notified in an unsolicited SCHEDULE_OVERRIDE_REPORT as specified in the following sequence diagram: - -Controller Thermostat - -Figure 4, Sequence diagram for cancellation of a Schedule Override Set - -Override State (8 bits) - -[The Override State uses the Schedule State type format, see section 4.14](04.14-climate-control-schedule-command-class-version-1-deprecated.md#414-climate-control-schedule-command-class-version-1-deprecated) - -## 4.14.7 Schedule Override Get Command - -This command is used to request the override, currently in use in a device. - -The Schedule Override Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE OVERRIDE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.14.8 Schedule Override Report Command - -The Schedule Override Report Command is used to report the override, currently in use in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLIMATE CONTROL SCHEDULE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE OVERRIDE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Override Type | | | | | | -| Override State | | | | | | | | | | | | | | | | | | | | | | | | - -Override Type (2 bits) - -[This field MUST be encoded according to Table 22.](04.14-climate-control-schedule-command-class-version-1-deprecated.md#4146-schedule-override-set-command) - -Both temporary and permanent overrides MAY be cancelled in the device, which receives the SCHEDULE_OVERRIDE_SET. This cancellation MUST be notified in an unsolicited [SCHEDULE_OVERRIDE_REPORT as shown on figure in section 4.14.6](04.14-climate-control-schedule-command-class-version-1-deprecated.md#4146-schedule-override-set-command) - -Override State (8 bits) - -[The Override State uses the Schedule State type format, see section 4.14](04.14-climate-control-schedule-command-class-version-1-deprecated.md#414-climate-control-schedule-command-class-version-1-deprecated) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.16-central-scene-command-class-version-2-obsoleted.md b/docs/specs/command-class-specification/04-command-class-definitions/04.16-central-scene-command-class-version-2-obsoleted.md deleted file mode 100644 index 4b4a625..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.16-central-scene-command-class-version-2-obsoleted.md +++ /dev/null @@ -1,113 +0,0 @@ - -# 4.16 Central Scene Command Class, version 2 [OBSOLETED] - -THIS COMMAND CLASS HAS BEEN OBSOLETED - -New implementations MUST support the Central Scene Command Class, version 3 or newer. - -The Central Scene Command Class is used to communicate central scene activations to a central controller using the lifeline concept. - -## 4.16.1 Compatibility considerations - -Central Scene Command Class version 2 is extended on the following areas: - - The Central Scene Supported Report Command is updated to advertise Key Attributes support for each scene.  Additional Key Attributes are defined. - -Commands and paragraphs not mentioned in this version remain unchanged from version 1. - -## 4.16.2 Central Scene Supported Report Command - -This command is used to report the maximum number of supported scenes and the Key Attributes supported for each scene. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Scenes | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Number of Bit Mask Bytes | | | | | | Identical | | | -| | Supported Key Attributes for Scene 1 – Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Key Attributes for Scene 1 – Byte N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Key Attributes for Scene M – Byte 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Key Attributes for Scene M – Byte N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Number of Bit Mask Bytes (2 bits) - -This field advertises the size of each “Supported Key Attributes” field measured in bytes. The value MUST be in the range 1..3. - -Identical (1 bit) - -This field indicates if all scenes are supporting the same Key Attributes: - -The value 1 MUST indicate that all scenes support the same set of Key Attributes. In this case, the field “Supported Key Attributes for Scene 1” MUST advertise the supported Key Attributes for all scenes - -The value 0 MUST indicate that scenes support different Key Attributes. In this case, Supported Key Attributes MUST be advertised for each individual scene. - -Supported Key Attributes (N bytes) - -This Bit Mask field advertises the attributes supported by the corresponding scene. The field MUST be [encoded according to Table 24.](04.16-central-scene-command-class-version-2-obsoleted.md#4162-central-scene-supported-report-command) - -Table 24: Central Scene Supported Report::Supported Key Attributes - -| | Byte:Bit | | | Supported Key Attributes | | -| --- | --- | --- | --- | --- | --- | -| 1:0 | | | Key Pressed 1 time | | | -| 1:1 | | | Key Released. | | | -| 1:2 | | | Key Held Down. | | | -| 1:3 | | | Key Pressed 2 times | | | -| 1:4 | | | Key Pressed 3 times | | | -| 1:5 | | | Key Pressed 4 times | | | -| 1:6 | | | Key Pressed 5 times | | | -| 1:7 | | | Reserved | | | - -If the Key Released attribute is supported, the Key Held Down attribute MUST also be supported. If the Key Held Down attribute is supported, the Key Released attribute MUST also be supported. - -## 4.16.3 Central Scene Notification Command - -This command is used to advertise one or more key events. - -If the device implements Z-Wave Plus Lifeline support is implemented, the device MUST send the Central Scene Notification Command to the actual Lifeline targets. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CENTRAL SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = CENTRAL SCENE NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Key Attributes | | | | | | | | -| Scene Number | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Key Attributes (3 bits) - -This field advertises one or more events detected by the key. The field MUST be encoded according to [Table 25](04.16-central-scene-command-class-version-2-obsoleted.md#4163-central-scene-notification-command) - -Table 25: Central Scene Notification::Key Attributes - -| | Key Attribute | | | Description | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Key Pressed 1 time | | 1 | | | -| 0x01 | | | Key Released | | 1 | | | -| 0x02 | | | Key Held Down | | 1 | | | -| 0x03 | | | Key Pressed 2 times | | 2 | | | -| 0x04 | | | Key Pressed 3 times | | 2 | | | -| 0x05 | | | Key Pressed 4 times | | 2 | | | -| 0x06 | | | Key Pressed 5 times | | 2 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -[Notification carrying these Key Attributes MUST comply with Figure 8.](04.16-central-scene-command-class-version-2-obsoleted.md#4163-central-scene-notification-command) - -![Figure 8, Central Scene button press decoding and timer management](assets/img-73381c079f.png) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.18-clock-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.18-clock-command-class-version-1.md deleted file mode 100644 index eacfb5c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.18-clock-command-class-version-1.md +++ /dev/null @@ -1,82 +0,0 @@ - -# 4.18 Clock Command Class, version 1 - -The Clock Command Class is used to implement a simple clock functionality. - -## 4.18.1 Interoperability considerations - -A controlling node SHOULD configure the current time and weekday in a supporting node during node commissioning. - -It has been found that some version 1 nodes issue Clock Get Command to controllers in order to learn the current time and use the returned Clock Report Command as a Clock Set Command. A supporting node SHOULD NOT learn the current time with a Clock Get Command. - -A node SHOULD control the Time Command Class to read the current time from supporting nodes (time servers) or support the Clock Command Class and wait to be set the current time by a controlling node. - -A Z-Wave Plus node SHOULD issue a Clock Report Command via the Lifeline Association Group if they suspect to have inaccurate time and/or weekdays (e.g. after battery removal). A controlling node SHOULD compare the received time and weekday with its current time and set the time again at the supporting node if a deviation is observed (e.g. different weekday or more than a minute difference) - -## 4.18.2 Clock Set Command - -This command is used to set the current time in a supporting node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLOCK _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CLOCK SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Weekday | | | | | | | | | Hour | | | | | | | | | | | | | | | -| Minute | | | | | | | | | | | | | | | | | | | | | | | | - -Weekday (3 bits) - -This field is used to indicate the current weekday that the receiving node MUST assume. [This field MUST comply with Table 26](04.18-clock-command-class-version-1.md#4182-clock-set-command) Table 26, Clock Set Command::Weekday encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Unused/unknown This value may be specified if the weekday is not used or not known | | | -| 0x01 | | | Monday | | | -| 0x02 | | | Tuesday | | | -| 0x03 | | | Wednesday | | | -| 0x04 | | | Thursday | | | -| 0x05 | | | Friday | | | -| 0x06 | | | Saturday | | | -| 0x07 | | | Sunday | | | - -Hour (5 bits) - -This field is used to indicate the hour of the current time that the receiving node MUST assume. This field MUST be in the range 0..23. - -Minute (8 bits) - -This field is used to indicate the minute of the current time that the receiving node MUST assume. This field MUST be in the range 0..59. - -A sending node knowing the current time with seconds precision SHOULD round its current time to the nearest minute when sending this command. - -## 4.18.3 Clock Get Command - -This command is used to request the current time set at a supporting node. - -[The Clock Report Command MUST be returned in response to this command.](04.18-clock-command-class-version-1.md#4184-clock-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLOCK _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CLOCK GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.18.4 Clock Report Command - -This command is used to advertise the current time set at the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CLOCK _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CLOCK REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Weekday | | | | | | | | | Hour | | | | | | | | | | | | | | | -| Minute | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.18.2 Clock Set Command. A sending node MUST comply with fields’ description from 4.18.2 Clock Set Command](04.18-clock-command-class-version-1.md#4182-clock-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.19-color-switch-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.19-color-switch-command-class-version-1.md deleted file mode 100644 index b9160d3..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.19-color-switch-command-class-version-1.md +++ /dev/null @@ -1,218 +0,0 @@ - -# 4.19 Color Switch Command Class, version 1 - -The Color Switch Command Class is used to control color capable devices. - -The Color Switch Command Class manipulates the color components of a device. Each color component is scaled by the brightness level previously set by a Multilevel Switch Set, Binary Switch Set or Basic Set Command. - -[The Color Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.19.1 Compatibility considerations - -The Color Switch Command Class, version 1 was previously named the Color Control Command Class, version 1. The Color Switch Command Class, version 1 is binary compatible with the Color Control Command Class, version 1. - -### 4.19.1.1 Command Class dependencies - -Nodes supporting the Color Switch Command Class, version 1 MUST support one of the following command classes in order to control the color brightness: - - Multilevel Switch Command Class, version 2  Binary Switch Command Cass, version 2. - -## 4.19.2 Interoperability considerations - -The Color Switch Command Class MUST be treated as a separate Command Class. Basic and Binary/Multilevel Switch Command Class commands MUST NOT affect color component levels controlled by the Color Switch Command Class. The Color Switch Command Class commands MUST NOT affect the brightness level controlled by Basic or Binary/Multilevel Switch Command Classes. - -If the brightness level is requested via a Basic Get or Binary/Multilevel Switch Get command, the reported value MUST reflect the brightness level previously set via Basic or Multilevel Switch commands. If a color component is requested via the Color Switch Get command, the reported value MUST reflect the color component level previously set via Color Switch commands. - -An implementation MUST scale color component levels by the brightness level . Thus, to achieve a resulting light level of 100% for a given color component, the color component level must be set to 100% (via the Color Switch Command Class) and the brightness level must be set to 100% (via Basic or Multilevel Switch Command Class). - -A controlling device SHOULD specify the highest possible color component levels of a given color tone to achieve the highest light yield when scaled by the brightness level. The controlling device MAY however limit color component levels to achieve the same brightness for blended color tones as for pure colors. For this reason, a supporting device MUST NOT normalize color components manipulated by the Color Switch Command Class. Likewise, a supporting device implementing indexed colors should reduce its internal color component levels for blended colors to achieve the same brightness for all color tones. - -## 4.19.3 Color Switch Supported Get Command - -This command is used to request the supported color components of a device. - -The Color Switch Supported Report command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.19.4 Color Switch Supported Report Command - -This command is used to report the supported color components of a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Color Component Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Color Component Mask 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Color Component Mask (variable length) - -The Color Component Mask field MUST advertise the color components supported by the device. - - Bit 0 in Bit Mask 1 indicates if color component 0 is supported  Bit 1 in Bit Mask 1 indicates if color component 1 is supported  … - -[For the definition of Color Component IDs, refer to section 4.19.7.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) - -## 4.19.5 Color Switch Get Command - -This command is used to request the status of a specified color component. - -The Color Switch Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Color Component ID | | | | | | | | | | | | | | | | | | | | | | | | - -Color Component ID (8 bits) - -This field MUST specify the color component for which the status is requested. - -[For the definition of Color Component IDs, refer to section 4.19.7.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) - -## 4.19.6 Color Switch Report Command - -This command is used to advertise the status of a color component. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Color Component ID | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Color Component ID (8 bits) - -This field MUST advertise the color component covered by this report. - -[For the definition of Color Component IDs, refer to section 4.19.7.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) - -Value (8 bits) - -The Value field MUST advertise the value of the color component identified by the Color Component ID. - -The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. - -A controlling device MUST NOT assume that the Value is identical to a value previously issued with a Set command; not even when a transition has ended. - -## 4.19.7 Color Switch Set Command - -This command is used to control one or more color components in a device. - -[Color component levels MUST be scaled by the brightness level. Refer to 4.19.2.](04.19-color-switch-command-class-version-1.md#4192-interoperability-considerations) - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Color Component Count | | | | | | | | | | | | | | | -| | Color Component ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Value 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Color Component ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Value N | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Color Component Count (5 bits) - -This field MUST specify the number of (Color Component ID, Value) datasets contained in the Color Switch Set command. - -Color Component ID (8 bits) - -[This field MUST specify the color component to receive a new value. Refer to Table 27.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) - -Table 27, Color Switch Component IDs - -| | Component ID | | | Label | | | Value | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Warm White | | | 0x00 – 0xFF: 0 – 100% | | | -| 1 | | | Cold White | | | 0x00: - 0xFF: 0 – 100% | | | -| 2 | | | Red | | | 0x00 – 0xFF: 0 – 100% | | | -| 3 | | | Green | | | 0x00 – 0xFF: 0 – 100% | | | -| 4 | | | Blue | | | 0x00 – 0xFF: 0 – 100% | | | -| 5 | | | Amber (for 6ch Color mixing) | | | 0x00 – 0xFF: 0 – 100% | | | -| 6 | | | Cyan (for 6ch Color mixing) | | | 0x00 – 0xFF: 0 – 100% | | | -| 7 | | | Purple (for 6ch Color mixing) | | | 0x00 – 0xFF: 0 – 100% | | | -| 8 | | | Indexed Color | | | 0x00 – 0xFF: Color Index 0-255 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Value (8 bits) - -This field MUST specify the value of the color component identified by the Color Component ID field. - -Unlike other actuator control command classes, the Value used by the Color Switch Command Class spans the entire range from 0x00 to 0xFF. Thus, except for the Indexed Color, the value 0x00 MUST represent 0% and 0xFF MUST represent 100% of the actual color component. - -## 4.19.8 Color Switch Start Level Change Command - -This command is used to initiate a transition of one color component to a new level. - -A receiving device MUST initiate the transition to a new value for the specified Color Component ID. - -The device MAY apply a non-zero duration to the transition from one value to a new value. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR START LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | Up/ Down | | | Ignore Start Level | | | Reserved | | | | | | | | | | | | | | | -| Color Component ID | | | | | | | | | | | | | | | | | | | | | | | | -| Start Level | | | | | | | | | | | | | | | | | | | | | | | | - -Up/Down (1 bit) - -This field MUST specify the direction of the level change. - -If the Up/Down bit is set to 0 the level change MUST be increasing. If the Up/Down bit is set to 1 the level change MUST be decreasing. - -Ignore Start Level (1 bit) - -A receiving device SHOULD respect the Start Level if the Ignore Start Level bit is 0. A receiving device MUST ignore the Start Level if the Ignore Start Level bit is 1. - -A controlling device SHOULD set the Ignore Start Level bit to 1. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Color Component ID (8 bits) - -This field MUST specify the color component to start a transition. - -[For the definition of Color Component IDs, refer to section 4.19.7.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) Start Level (8 bits) - -The Start Level field MUST specify the initial value of the level change. - -## 4.19.9 Color Switch Stop Level Change Command - -[This command is used to stop an ongoing transition initiated by a Color Switch Start Level Change Command.](04.19-color-switch-command-class-version-1.md#4198-color-switch-start-level-change-command) - -A receiving device MUST stop the transition if the specified Color Component ID is currently in transition to a new value. A receiving device MUST NOT stop ongoing transitions for other Color Component IDs than the one specified. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR STOP LEVEL CHANGE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Color Component ID | | | | | | | | | | | | | | | | | | | | | | | | - -Color Component ID (8 bits) - -This field MUST specify the color component to stop a transition. - -[For the definition of Color Component IDs, refer to section 4.19.7.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.20-color-switch-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.20-color-switch-command-class-version-2.md deleted file mode 100644 index 9827b21..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.20-color-switch-command-class-version-2.md +++ /dev/null @@ -1,76 +0,0 @@ - -# 4.20 Color Switch Command Class, version 2 - -The Color Switch Command Class, version 2 is used to control color capable devices. - -[The Color Switch Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.20.1 Compatibility considerations - -A device supporting Color Switch Command Class, version 2 MUST support Color Switch Command Class, version 1. - -Version 2 adds a duration parameter to the Color Switch Set Command. - -Commands not described in this version remain unchanged from version 1. - -### 4.20.1.1 Command Class dependencies - -Nodes supporting the Color Switch Command Class, version 2 MUST support one of the following command classes in order to control the color brightness: - - Multilevel Switch Command Class, version 2  Binary Switch Command Cass, version 2. - -## 4.20.2 Interoperability considerations - -[Refer to 4.19.2.](04.19-color-switch-command-class-version-1.md#4192-interoperability-considerations) - -## 4.20.3 Color Switch Set Command - -This command is used to control one or more color components in a device. - -[Color component levels MUST be scaled by the brightness level. Refer to 4.19.2.](04.19-color-switch-command-class-version-1.md#4192-interoperability-considerations) - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SWITCH COLOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SWITCH COLOR SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Color Component Count | | | | | | | | | | | | | | | -| | Color Component ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Value 1 | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| | Color Component ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Value N | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Color Component Count (5 bits) - -This field MUST specify the number of (Color Component ID, Value) datasets contained in the Color Switch Set command. - -Color Component ID (8 bits) - -This field MUST specify the color component to receive a new value. - -[For the definition of Color Component IDs, refer to section 4.19.7.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) - -Value (8 bits) - -This field MUST specify the value of the color component identified by the Component ID field. - -[Refer to section Table 27.](04.19-color-switch-command-class-version-1.md#4197-color-switch-set-command) - -Duration (8 bits) - -The Duration field MUST specify the time that the transition should take from the current value to the new target value. A supporting device SHOULD respect the specified Duration value. - -[The encoding of the Duration field MUST be according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) - -The factory default duration SHOULD be the same as the duration used for the Color Switch Set command, version 1. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.22-configuration-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.22-configuration-command-class-version-1.md deleted file mode 100644 index 6ab6243..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.22-configuration-command-class-version-1.md +++ /dev/null @@ -1,118 +0,0 @@ - -# 4.22 Configuration Command Class, version 1 - -The Configuration Command Class allows product specific configuration parameters to be changed. One example could be the default dimming rate of a light dimmer. - -Configuration parameters MUST be specified in the product documentation. Configuration parameters accessed via this command class MUST NOT replace similar commands provided by other existing Command Classes. - -A device MUST be able to operate with default factory configuration parameter values. - -It is RECOMMENDED that configuration parameters can be manipulated via a local user interface. It is RECOMMENDED that default factory configuration parameter values can be restored via a local user interface. - -## 4.22.1 Compatibility considerations - -### 4.22.1.1 “Default” flag - -Earlier text revisions of the Configuration Command Class, versions 1-3 presented conflicting interpretations of the default field. Controllers should be aware that nodes with version 3 or less MAY reset all configuration parameters to default when receiving a Configuration Set or Configuration Bulk Set Command with the Default bit set to 1. - -A controller SHOULD probe a node in order to discover what behavior it implements. The following steps are RECOMMENDED: - - If the device is version 1- 2, scan the node for available configuration parameters. Else discover the available parameters thanks to the Configuration Properties Get Command.  Determine how the default bit works if the node implements 2 or more parameters - -Step 1: - - One at a time, issue a Configuration Set for a parameter number, and check whether the value can be read back. Try each parameter for 1, 2 and 4 bytes sizes.  Store the discovered parameter list for future use. - -Step 2: - - Choose 2 parameters and issue a Configuration Set with the default bit set to 1 for each parameter.  Read back both parameters value with a Configuration Get.  Try to modify both parameters to non-default values (it is recommended to try the default value ± 1)  Send a Configuration Set for one of parameters with the default bit set to 1.  Read back both parameters and check whether one or both returned to the default value - -## 4.22.2 Configuration Set Command - -The Configuration Set Command is used to set the value of a configuration parameter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Reserved | | | | | | | | | | | | Size | | | | | | | | | -| Configuration Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Configuration Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Number (8 bits) - -This field is used to specify the actual configuration parameter. Parameter Numbers MAY be product specific. Parameter Numbers SHOULD be assigned in a sequence starting from 1. - -Default (1 bit) - -This field is used to specify if the default value is to be restored for the specified configuration parameter. - -The value 1 MUST indicate that default factory settings must be restored for the specified Parameter Number. In this case, the Configuration Value field MUST be ignored and the receiving node MUST reset the specified parameter and SHOULD NOT reset any other parameters. - -The value 0 MUST indicate that the specified Parameter Number must assume the value specified by the Configuration Value field. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Size (3 bits) - -This field is used to specify the size of the actual parameter. The advertised size of a given parameter CC:0070.01.04.11.005 [MUST always be the same. The value of this field MUST comply with Table 28.](04.22-configuration-command-class-version-1.md#4222-configuration-set-command) - -Table 28, Configuration Set::Size encoding - -| | Size | | | Size of Value field | | -| --- | --- | --- | --- | --- | --- | -| 1 | | | 8 bit | | | -| 2 | | | 16 bit | | | -| 4 | | | 32 bit | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Configuration Value (N bytes) - -This field carries the value to be assigned. The size of the field MUST comply with the size advertised by the Size field. - -[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The field Value 1 MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -## 4.22.3 Configuration Get Command - -This command is used to query the value of a configuration parameter. - -The Configuration Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Number (8 bits) - -This field is used to specify the requested configuration parameter. Parameter Numbers MAY be product specific. Parameter Numbers SHOULD be assigned in a sequence starting from 1. - -A node receiving this command for an unsupported parameter SHOULD return a Report advertising the value of the first available parameter in the node. - -## 4.22.4 Configuration Report Command - -This command is used to advertise the actual value of the advertised parameter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Size | | | | | | | | | -| Configuration Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Configuration Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Refer to the Configuration Set Command for parameter details. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.23-configuration-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.23-configuration-command-class-version-2.md deleted file mode 100644 index e3952a4..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.23-configuration-command-class-version-2.md +++ /dev/null @@ -1,237 +0,0 @@ - -# 4.23 Configuration Command Class, version 2 - -The Configuration Command Class allows product specific configuration parameters to be changed. One example could be the default dimming rate of a light dimmer. - -Configuration parameters MUST be specified in the product documentation. Configuration parameters accessed via this command class MUST NOT replace similar commands provided by other existing Command Classes. - -A device MUST be able to operate with default factory configuration parameter values. - -It is RECOMMENDED that configuration parameters can be manipulated via a local user interface. It is RECOMMENDED that default factory configuration parameter values can be restored via a local user interface. - -## 4.23.1 Compatibility considerations - -Configuration Command Class, version 2 extends the addressing space to 65.535 product specific configuration parameters. Further, Configuration Command Class, version 2 makes it possible to set multiple configuration parameters with one Command. - -A device supporting Configuration Command Class, version 2 MUST support Configuration Command Class, version 1. - -### 4.23.1.1 “Default” flag - -[Refer to 4.22.1.1](04.22-configuration-command-class-version-1.md#42211-default-flag) - -## 4.23.2 Interoperability considerations - -Configuration Command Class, version 2 is backwards compatible with Configuration Command Class, version 1. - -Configuration Command Class, version 2 does not extend any existing commands of Configuration Command Class, version 1. The 255 parameters that can be addressed by the Configuration Set Command MUST be identical to the first 255 parameters that can be addressed by the (version 2) Configuration Bulk Set Command. - -## 4.23.3 Configuration Set Command - -This command is used to set the value of a configuration parameter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Reserved | | | | | | | | | | | | Size | | | | | | | | | -| Configuration Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Configuration Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Number (8 bits) - -This field is used to specify the actual configuration parameter. Parameter Numbers MAY be product specific. Parameter Numbers SHOULD be assigned in a sequence starting from 1. - -Default (1 bit) - -This field is used to specify if the default value is to be restored for the specified configuration parameter. - -The value 1 MUST indicate that default factory settings must be restored for the specified Parameter Number. In this case, the Configuration Value field MUST be ignored and the receiving node MUST reset the specified parameter and SHOULD NOT reset any other parameters. - -The value 0 MUST indicate that the specified Parameter Number must assume the value specified by the Configuration Value field. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Size (3 bits) - -This field is used to specify the size of the actual parameter. The advertised size of a given parameter [MUST always be the same. The value of this field MUST comply with Table 28.](04.22-configuration-command-class-version-1.md#4222-configuration-set-command) - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Configuration Value (N bytes) - -This field carries the value to be assigned. The size of the field MUST comply with the size advertised by the Size field. - -[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The field Value 1 MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -## 4.23.4 Configuration Bulk Set Command - -This command is used to set the value of one or more configuration parameters. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION BULK SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Parameters | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Hand- shake | | | Reserved | | | | | | | | | Size | | | | | | | | | -| | Parameter 1 – Configuration Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter 1 – Configuration Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter M – Configuration Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter M – Configuration Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Offset (16 bits) - -This field is used to specify the first parameter in a range of one or more parameters. The first byte CC:0070.02.07.11.001 MUST carry the most significant byte of the 16 bit value. - -Number of Parameters (8 bits) - -This field is used to specify the number (M) of configuration parameters contained in this command. - -The value of this field MUST be in the range 1..255. - -The advertised parameters MUST be in a consecutive range. For example, Parameter Offset set to 4 and Number of Parameters set to 3 MUST represent parameters number 4, 5 and 6. - -A receiving node MUST ignore values for non-existing parameters - -Default (1 bit) - -This field is used to specify if the default value is to be restored for the specified configuration parameters. - -The value 1 MUST indicate that default factory settings must be restored for the Parameter Numbers defined by the Parameter Offset and Number of Parameters fields. In this case, the Configuration Value field MUST be ignored and the receiving node MUST reset the specified parameters and SHOULD NOT CC:0070.02.07.11.004 reset any other parameters. The value 0 MUST indicate that the specified Parameter Numbers must assume the value specified by the Configuration Value field. - -Handshake (1 bit) - -This field is used to indicate if a Configuration Bulk Report Command is to be returned when the specified configuration parameters have been stored in non-volatile memory. - -If the Handshake bit is set to 1, a Configuration Bulk Report Command MUST be returned. The command MUST echo all parameters found in this Configuration Bulk Set Command. A node returning a Configuration Bulk Report Command with the Handshake bit set MUST be ready to receive another Configuration Bulk Set Command. If the Handshake bit is set, an originating node MUST wait for the Configuration Bulk Report Command for at least one second. If not receiving a report, the originating node SHOULD assume that the operation failed and resend the same Configuration Bulk Set Command one more time. - -If the Handshake bit is set to 0, a receiving node MUST NOT return a Configuration Bulk Report in response. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Size (3 bits) - -This field is used to specify the size of the actual parameters. The advertised size of a given parameter [MUST always be the same. The value of this field MUST comply with Table 28.](04.22-configuration-command-class-version-1.md#4222-configuration-set-command) - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Parameter – Configuration Value (M*N bytes) - -These fields carry the values to be assigned. Each field MUST have the same size. The size of each field MUST comply with the size advertised by the Size field. - -[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The Value 1 field MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -## 4.23.5 Configuration Bulk Get Command - -This command is used to query the value of one or more configuration parameters. - -The Configuration Bulk Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION BULK GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Parameters | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Offset (16 bits) - -This field is used to specify the first parameter in a range of one or more parameters. The first byte MUST carry the most significant byte of the 16 bit value. - -Parameter Numbers SHOULD be assigned in a sequence starting from 1. - -Number of Parameters (8 bits) - -This field is used to specify the number of requested configuration parameters. - -The value of this field MUST be in the range 1..255. - -The advertised parameters MUST be in a consecutive range. For example, Parameter Offset set to 4 and Number of Parameters set to 3 MUST represent parameters number 4, 5 and 6. - -## 4.23.6 Configuration Bulk Report Command - -This command is used to advertise the actual value of one or more advertised parameters. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION BULK REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Parameters | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to follow | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Hand- shake | | | Reserved | | | | | | | | | Size | | | | | | | | | -| | Parameter 1 – Configuration Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter 1 – Configuration Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter M – Configuration Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter M – Configuration Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Offset (16 bits) - -This field is used to advertise the first parameter in a range of one or more parameters. The first byte MUST carry the most significant byte of the 16 bit value. CC:0070.02.09.11.001 - -Number of Parameters (8 bits) - -This field is used to advertise the number (M) of configuration parameters contained in this command. - -The value of this field MUST be in the range 1..255. - -The advertised parameters MUST be in a consecutive range. For example, Parameter Offset set to 4 and Number of Parameters set to 3 MUST represent parameters number 4, 5 and 6, regardless of whether they exist at the sending node. - -Reports to follow (8 bits) - -This field MUST be used to advertise the number of reports left before all requested configuration parameters values have been transferred. - -The value 0 MUST indicate that this is the last report. - -If the Handshake field is 1 , this field MUST be set to 0. - -The value of this field MUST be in the range 0..255. Default (1 bit) - -This field MUST be used to advertise if all advertised configuration parameters have the factory default value. - -The value 1 MUST indicate that all advertised configuration parameters have the factory default value. The value 0 MUST indicate that one or more of the advertised configuration parameters do not have the factory default value. - -Handshake (1 bit) - -This field is used to indicate if this report is returned in response to a Configuration Bulk Set Command. - -The value 1 MUST indicate that all configuration parameters have been stored in non-volatile memory and that the sending node is ready to receive another Configuration Bulk Set Command. Except for the Reports to Follow field, all other fields MUST echo the values received in the Configuration Bulk Set Command. The Reports to Follow field MUST be 0. - -The value 0 MUST indicate that this report is returned in response to a Configuration Bulk Get Command. - -Size (3 bits) - -This field is used to advertise the size of the actual parameter. The advertised size of a given parameter CC:0070.02.09.11.00E [MUST always be the same. The value of this field MUST comply with Table 28.](04.22-configuration-command-class-version-1.md#4222-configuration-set-command) - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Parameter – Configuration Value (M*N bytes) - -These fields carry the values advertised by the Parameter Offset and Number of Parameters fields. Each field MUST have the same size. The size of each field MUST comply with the size advertised by the Size field. - -[The field MUST carry a signed value. The binary encoding of the signed value MUST comply with Table 10. The Value 1 field MUST be the most significant byte.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -A sending node SHOULD set this field to 0 for non-existing parameters. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.25-configuration-command-class-version-4.md b/docs/specs/command-class-specification/04-command-class-definitions/04.25-configuration-command-class-version-4.md deleted file mode 100644 index 6c6c2e9..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.25-configuration-command-class-version-4.md +++ /dev/null @@ -1,205 +0,0 @@ - -# 4.25 Configuration Command Class, version 4 - -The Configuration Command Class, version 4 introduces the support of read-only parameters, parameters requiring network re-inclusion and advanced parameters as well as allows optional support for Bulk Commands. - -A read-only parameter can be accessed with Get commands but cannot be modified with Set Commands. A parameter requiring re-inclusion is typically a parameter altering the node capabilities, which requires performing the inclusion again in order to have the controller to learn about the node capabilities once more. A parameter may be advertised as "advanced" to indicate to the controlling application that the actual parameter is intended only for advanced use, e.g. calibration. - -The following commands are modified in version 4: - - [Configuration Set Command](04.25-configuration-command-class-version-4.md#4252-configuration-set-command)  [Configuration Bulk Set Command](04.25-configuration-command-class-version-4.md#4253-configuration-bulk-set-command)  [Configuration Properties Report Command](04.25-configuration-command-class-version-4.md#4254-configuration-properties-report-command) - -The following new command is introduced: - - [Configuration Default Reset Command](04.25-configuration-command-class-version-4.md#4255-configuration-default-reset-command) - -All commands not mentioned in this version remain unchanged from previous versions. - -## 4.25.1 Compatibility considerations - -Configuration Command Class, version 4 is backwards compatible with the previous versions of Configuration Command Class. - -A device supporting Configuration Command Class, version 4 MUST support Configuration Command Class, version 3. - -### 4.25.1.1 “Default” flag - -[Refer to 4.22.1.1](04.22-configuration-command-class-version-1.md#42211-default-flag) - -From version 4 and onwards, a node MUST NOT reset all Configuration Parameters when receiving a Set or Bulk Set Command with the default flag set to 1. - -### 4.25.1.2 Configuration Properties Report - -[Refer to 4.24.1.2.](04.24-configuration-command-class-version-3.md#42412-configuration-properties-report) - -The recommendation given in version 3 does not apply to version 4 supporting nodes as new fields are [appended at the end of the Configuration Properties Report Command in version 4.](04.24-configuration-command-class-version-3.md#4248-configuration-properties-report-command) - -### 4.25.1.3 “Re-inclusion required” flag - -Configuration parameters modifying a node’s NIF and/or (non-dynamic) Multi Channel End Point capabilities MUST be advertised as “Re-inclusion required”. - -When such a parameter is modified, the node MUST NOT advertise the new NIF and/or (non dynamic) Multi Channel End Point capabilities before being excluded from its current network. - -### 4.25.1.4 “Advanced” flag - -The difference between normal and advanced parameters lies on the controlling node side. - -A parameter MAY be advertised as "advanced" in order to simplify the configuration of a node by normally not showing such a parameter to the end user. Advanced parameters SHOULD be presented to the user only when an [Advanced] option is selected in the controller user interface. - -### 4.25.1.5 Parameters value and network inclusion/exclusion - -From version 4 and onwards, a node MUST NOT modify or reset any configuration parameter when being included or excluded of a Z-Wave network. - -A node MUST reset all its configuration parameters if either: - - It is manually reset to factory default  [It receives a Configuration Default Reset Command.](04.25-configuration-command-class-version-4.md#4255-configuration-default-reset-command) - -A node MUST NOT reset all its configuration parameters in any other case. - -### 4.25.1.6 Bulk commands support - -A node supporting Configuration Command Class, version 4 MAY elect to ignore the following Commands: - - Configuration Bulk Set Command  Configuration Bulk Get Command  Configuration Bulk Report Command. - -If it is the case, the node MUST: - - Return an Application Rejected Request Command when receiving one of the ignored commands (if received without Supervision encapsulation).  Advertise that it ignores the Bulk Commands in the Configuration Properties Report. - -If Bulk Commands are supported, they MUST be supported for all parameters. If Bulk Commands are ignored, they MUST be ignored for all parameters. - -## 4.25.2 Configuration Set Command - -This command is used to set the value of a configuration parameter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Reserved | | | | | | | | | | | | Size | | | | | | | | | -| Configuration Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Configuration Value N | | | | | | | | | | | | | | | | | | | | | | | | - -A receiving node MUST ignore this command if the specified parameter is advertised as a Read-only parameter. - -All fields not specified below are unchanged from version 2 Configuration Set Command. - -Default (1 bit) - -This field is used to specify if the default value is to be restored for the specified configuration parameter. - -The value 1 MUST indicate that default factory settings must be restored for the specified Parameter Number. In this case, the Configuration value field MUST be ignored and any other parameters MUST NOT be reset by a receiving node. - -The value 0 MUST indicate that the specified Parameter Number MUST assume the value specified by the Configuration Value field. - -Configuration Value (N bytes) - -This field carries the value to be assigned. The size of the field MUST comply with the size advertised by the Size field. - -The configuration value MUST be encoded according to the Format field advertised in the Configuration Properties Report Command for the parameter number. - -## 4.25.3 Configuration Bulk Set Command - -This command is used to set the value of one or more configuration parameters. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION BULK SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Offset 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Parameters | | | | | | | | | | | | | | | | | | | | | | | | -| Default | | | Hand- shake | | | Reserved | | | | | | | | | Size | | | | | | | | | -| | Parameter 1 – Configuration Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter 1 – Configuration Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter M – Configuration Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Parameter M – Configuration Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | - -A receiving node MUST ignore this command for parameters that are advertised as Read-only parameters. - -All fields not specified below are unchanged from version 2 Configuration Bulk Set Command. - -Default (1 bit) - -This field is used to specify if the default value is to be restored for the specified configuration parameters. - -The value 1 MUST indicate that default factory settings must be restored for all the Parameter Numbers defined by the Parameter Offset and Number of Parameters fields. In this case, the Configuration Value field MUST be ignored and any other parameters MUST NOT be reset by a receiving node. - -The value 0 MUST indicate that the specified Parameter Numbers MUST assume the value specified by the Configuration Value field. - -Parameter –Configuration Value (M*N bytes) - -These fields carry the parameter values to be assigned. Each parameter value field MUST have the same size. The size of each field MUST comply with the size advertised by the Size field. - -The values MUST be encoded according to the Format field advertised in the Configuration Properties Report Command for each parameter number. - -## 4.25.4 Configuration Properties Report Command - -This command is used to advertise the properties of a configuration parameter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION PROPERTIES REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Re-inclusion required | | | Read- only | | | Format | | | | | | | | | Size | | | | | | | | | -| Min Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Min Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Max Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Max Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Default Value 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| Default Value N (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Next Parameter Number 1 (MSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Next Parameter Number 2 (LSB) | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | No Bulk support | | | Advanced | | | - -All fields not specified below are unchanged from version 3 Configuration Properties Report Command. - -Read-only (1 bit) - -This field is used to indicate if the parameter is read-only. - -The value 1 MUST indicate that the advertised parameter is read-only. The value 0 MUST indicate that the advertised parameter is not read-only. - -Re-inclusion required (1 bit) - -This field is used to indicate if the advertised parameter requires the node to be re-included in the network before the parameter value change takes effect. - -The value 1 MUST indicate that the advertised parameter requires re-inclusion after being changed. The value 0 MUST indicate that the advertised parameter does not require re-inclusion after being changed. Advanced (1 bit) - -This field is used to indicate if the advertised parameter is to be presented in the “Advanced” parameter section in the controller GUI. - -The value 1 MUST indicate that the advertised parameter is an Advanced parameter. The value 0 MUST indicate that the advertised parameter is not an Advanced parameter. - -No Bulk support (1 bit) - -This field is used to advertise if the sending node supports Bulk Commands. - -The value 1 MUST indicate that the Bulk Commands will be ignored by the sending node. The value 0 MUST indicate that the Bulk Commands are supported by the sending node - -A sending node MUST always advertise the same value in this field, regardless of the parameter number. - -## 4.25.5 Configuration Default Reset Command - -This command is used to reset all configuration parameters to their default value. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONFIGURATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CONFIGURATION DEFAULT RESET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -A node receiving this command MUST reset all its Configuration Parameters to their default value. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.26-controller-replication-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.26-controller-replication-command-class-version-1.md deleted file mode 100644 index 1953b07..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.26-controller-replication-command-class-version-1.md +++ /dev/null @@ -1,115 +0,0 @@ - -# 4.26 Controller Replication Command Class, version 1 - -The Controller Replication Command Class is used to copy scene and group data to another controlling node. The Command Class may be used in conjunction with a controller shift or when including a new controller to the network. It is OPTIONAL to use this command class during a controller shift or when including a new controller to the network. - -## 4.26.1 Transfer Group Command - -This command is used to replicate mappings between Group ID and Node ID. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CTRL REPLICATION TRANSFER GROUP _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Group ID | | | | | | | | | | | | | | | | | | | | | | | | -| Node ID | | | | | | | | | | | | | | | | | | | | | | | | - -Sequence Number (8 bits) - -Sequence Number of this particular command. - -Group ID (8 bits) - -Group ID of the group that the node is member of. - -Node ID (8 bits) - -Node ID of slave device. - -## 4.26.2 Transfer Group Name Command - -This command is used to replicate group names. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CTRL REPLICATION TRANSFER GROUP NAME _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Group ID | | | | | | | | | | | | | | | | | | | | | | | | -| Group Name 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Group Name N | | | | | | | | | | | | | | | | | | | | | | | | - -Sequence Number (8 bits) - -Sequence Number of this particular command. - -Group ID (8 bits) - -Group ID associated with a specific group. - -Group Name (N bytes) - -The Group Name fields contain the assign group name in ASCII characters. - -## 4.26.3 Transfer Scene Command - -This command is used to replicate mappings between Scene ID and Node ID. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CTRL REPLICATION TRANSFER SCENE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Node ID | | | | | | | | | | | | | | | | | | | | | | | | -| Level | | | | | | | | | | | | | | | | | | | | | | | | - -Sequence Number (8 bits) - -Sequence Number of this particular command. - -Scene ID (8 bits) - -The scene ID is the parameter used to link together the different devices that takes part of a scene. - -Node ID (8 bits) - -The Node ID for a device that is part of the scene. - -Level (8 bits) - -The level is the parameter used for the specified scene. - -## 4.26.4 Transfer Scene Name Command - -This command is used to replicate scene names. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS CONTROLLER REPLICATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CTRL REPLICATION TRANSFER SCENE NAME _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Scene Name 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Scene Name N | | | | | | | | | | | | | | | | | | | | | | | | - -Sequence Number (8 bits) - -Sequence Number of this particular command. - -Scene ID (8 bits) - -Scene ID associated with a specific scene. - -Scene Name (N bytes) - -The Scene Name fields contain the assign scene name in ASCII characters. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.28-demand-control-plan-monitor-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.28-demand-control-plan-monitor-command-class-version-1.md deleted file mode 100644 index bb8abf7..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.28-demand-control-plan-monitor-command-class-version-1.md +++ /dev/null @@ -1,124 +0,0 @@ - -# 4.28 Demand Control Plan Monitor Command Class, version 1 - -The Demand Control Plan Monitor Command Class allows devices to monitor the list of Demand Control Plan (DCP). A DCP event contains information regarding criticality, products involved, requested reduction, time duration and if a certain rate (identified by a Demand Control Plan Rate ID, refer to the Rate Table Configuration Command Class) is associated with the event. When a DCP event is outdated, it is removed from the list. Each DCP event is uniquely identified by a timestamp issued the Utility Supplier. - -## 4.28.1 DCP List Get Command - -This command is used to request the pending DCP event in a device. - -The DCP List Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP LIST GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.28.2 DCP List Report Command - -This command reports the pending DCP event in a device. If more than one DCP event is pending – the reports will be submitted in chronically order as to when the events was placed on the list. Newest entry will be reported first. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP LIST REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Month | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Day | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| DCP ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Number of DC | | | | | | -| | Generic Device Class 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Specific Device Class 1 | | | | | | | | | | | | | | | | | | | | | | | -| …. | | | | | | | | | | | | | | | | | | | | | | | | -| | Generic Device Class N | | | | | | | | | | | | | | | | | | | | | | | -| | Specific Device Class N | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Hour Time | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute Time | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Second Time | | | | | | | | | | | | | | | | | | | | | | | | -| Event Priority | | | | | | | | | | | | | | | | | | | | | | | | -| Load shedding | | | | | | | | | | | | | | | | | | | | | | | | -| Start Association Group | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Association Group | | | | | | | | | | | | | | | | | | | | | | | | -| Randomization interval | | | | | | | | | | | | | | | | | | | | | | | | - -Reports to Follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. - -[Refer to DCP List Set command class (section 4.27.3) for detailed description of the fields.](04.27-demand-control-plan-configuration-command-class-version-1.md#4273-dcp-list-set-command) - -## 4.28.3 DCP Event Status Get - -This command is used to query the status of a specific DCP event in the DCP list. - -The DCP Event Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP EVENT STATUS GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Month | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Day | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to DCP List Set command class (section 4.27.3) for detailed description of the fields.](04.27-demand-control-plan-configuration-command-class-version-1.md#4273-dcp-list-set-command) - -## 4.28.4 DCP Event Status Report - -This command is used to provide the status of a specific DCP event in the DCP list. - -| | 7 | | | 6 | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DCP MONITOR _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = DCP EVENT STATUS GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 1 | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Year 2 | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Month | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Day | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp -Second Local Time | | | | | | | | | | | | | | | | | | | | | | | -| Event status | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to DCP List report command class (section 4.28.2) for description of fields](04.28-demand-control-plan-monitor-command-class-version-1.md#4282-dcp-list-report-command) - -Event Status (8 bits) - -The field contains the status of the event. - -Table 31, DCP Event Status Report::Event Status encoding - -| Event status | | | Description | | -| --- | --- | --- | --- | --- | -| 0x01 | | Event Started | | | -| 0x02 | | Event Completed | | | -| 0x03 | | Event Rejected by the user | | | -| 0x04 | | Event not Applicable | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.29-door-lock-command-class-version-1-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.29-door-lock-command-class-version-1-2.md deleted file mode 100644 index d313cb1..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.29-door-lock-command-class-version-1-2.md +++ /dev/null @@ -1,277 +0,0 @@ - -# 4.29 Door Lock Command Class, version 1-2 - -The Door Lock Command Class is used to operate and configure a door lock device. - -[The Door Lock Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.29.1 Compatibility considerations - -A device supporting Door Lock CC, Version 2 MUST support Door Lock CC, version 1. - -The Door Lock Command Class, version 2 adds the “unknown” state to the Door Lock Operation Report Command. - -A supporting node MAY implement a subset of the features represented by the Door Lock Mode, Door Handles Mode and Door Condition fields which are provided by the commands of this Command Class. - -## 4.29.2 Door Lock Operation Set Command - -This command is used to set the operation mode of a supporting door lock device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK OPERATION SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Door Lock Mode | | | | | | | | | | | | | | | | | | | | | | | | - -Door Lock Mode (8 bits) - -The Door Lock Mode field is used to specify the operation mode of the door lock device. - -[The encoding of this field MUST be according to Table 32.](04.29-door-lock-command-class-version-1-2.md#4292-door-lock-operation-set-command) - -Table 32, Door Lock Operation Set :: Mode - -| | Mode | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Door Unsecured 1) | | | 1 | | | -| 0x01 | | | Door Unsecured with timeout 2) | | | 1 | | | -| 0x10 | | | Door Unsecured for inside Door Handles 1) | | | 1 | | | -| 0x11 | | | Door Unsecured for inside Door Handles with timeout 2) | | | 1 | | | -| 0x20 | | | Door Unsecured for outside Door Handles 1) | | | 1 | | | -| 0x21 | | | Door Unsecured for outside Door Handles with timeout 2) | | | 1 | | | -| 0xFF | | | Door Secured | | | 1 | | | - -1) Constant mode. Door will be unsecured until set to secured mode by another command. 2) Timeout mode. Fallback to secured mode after timeout has expired. All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -A controlling node MUST NOT specify modes using timeout-based fall back if the Operation Type of the supporting device is set to Constant operation (set by Door Lock Configuration Set). A supporting node MUST ignore modes using timeout-based fall back if Operation Type is set to Constant operation. A supporting node MUST apply the constant modes without any timeout even if it is set to Timed Operation Type. - -[A supporting node MAY implement a subset of the Door Lock Modes defined by Table 32.](04.29-door-lock-command-class-version-1-2.md#4292-door-lock-operation-set-command) A supporting node MUST accept the Door Lock Mode values 0x00 and 0xFF. - -## 4.29.3 Door Lock Operation Get Command - -This command is used to request the status of a door lock device. - -The Door Lock Operation Report command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK OPERATION GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.29.4 Door Lock Operation Report Command - -This command is used to advertise the status of a door lock device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK OPERATION REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Door Lock Mode | | | | | | | | | | | | | | | | | | | | | | | | -| Outside Door Handles Mode | | | | | | | | | | | | Inside Door Handles Mode | | | | | | | | | | | | -| Door Condition | | | | | | | | | | | | | | | | | | | | | | | | -| Lock Timeout Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| Lock Timeout Seconds | | | | | | | | | | | | | | | | | | | | | | | | - -Door Lock Mode (8 bits) - -The Door Lock Mode field MUST advertise the mode of the door lock device. - -[The encoding of this field MUST be according to Table 33.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -[Table 33, Door Lock Operation Report :: Door Lock Mode](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -| | Mode | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Door Unsecured 1) | | | 1 | | | -| 0x01 | | | Door Unsecured with timeout 2) | | | 1 | | | -| 0x10 | | | Door Unsecured for inside Door Handles 1) | | | 1 | | | -| 0x11 | | | Door Unsecured for inside Door Handles with timeout 2) | | | 1 | | | -| 0x20 | | | Door Unsecured for outside Door Handles 1) | | | 1 | | | -| 0x21 | | | Door Unsecured for outside Door Handles with timeout 2) | | | 1 | | | -| 0xFE | | | Door/Lock State Unknown 3) | | | 2 | | | -| 0xFF | | | Door Secured | | | 1 | | | - -1) Constant mode. Door will be unsecured until set back to secured mode by command 2) Timeout mode. Fallback to secured mode after timeout has expired 3) Bolt is not fully retracted/engaged - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -A supporing node MAY advertise a subset of the available Door Lock Mode values. A controlling node MUST accept all Door Lock Mode values. - -The Door Lock Mode field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. - -Outside Door Handles Mode (4 bits) - -This field MUST advertise the status of each individual outside door handle. - -[The encoding of the Outside Door Handles Mode bitmask field MUST be according to Table 34 and Table 35.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -Table 34, Door Handles Mode bitmask - -| | Bit 3 | | | Bit 2 | | | Bit 1 | | | Bit 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | Handle 4 | | | Handle 3 | | | Handle 2 | | | Handle 1 | | - -Table 35, Door Handles Mode bit encoding - -| | Bit value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| | ‘0’ | | | Disabled | | -| | ‘1’ | | | Enabled | | - -The value ‘0’ MUST signify that the actual handle cannot open the door locally. The value ‘1’ MUST signify that the actual handle can open the door locally. - -A supporting node MAY advertise just a subset of the available Door Handles Mode values. A controlling node MUST accept all Door Handles Mode values. - -Inside Door Handles Mode (4 bits) - -This field MUST advertise the status of each individual inside door handle. - -[The encoding of the Inside Door Handles Mode bitmask field MUST be according to Table 34 and Table 35.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -A supporting node MAY advertise just a subset of the available Door Handles Mode values. A controlling node MUST accept all Door Handles Mode values. - -Door Condition (8 bits) - -The Door Condition field MUST advertise the status of the door lock components. - -[The encoding of the Door Condition bitmask field MUST be according to Table 36.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -Table 36, Door Condition bitmask - -| | | | | Bit 7..3 | | | Bit 2 | | | Bit 1 | | | Bit 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | bit = ‘0’ | | | Reserved | | | Latch Open | | | Bolt Locked | | | Door Open | | -| | bit = ‘1’ | | | Reserved | | | Latch Closed | | | Bolt Unlocked | | | Door Closed | | - -All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -A supporting node MAY advertise just a subset of the available Door Condition values. A controlling node MUST accept all Door Condition values. Lock Timeout Minutes (8 bits) - -This field MUST advertise the remaining time before the door lock will automatically be locked again. - -[The encoding of the Lock Timeout Minutes field MUST be according to Table 37. The time the supporting](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) node stays unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. - -Table 37, Door Lock Operation Report :: Lock Timeout Minutes - -| | Value | | | Operation | | -| --- | --- | --- | --- | --- | --- | -| 0x00..0xFC | | | Unlocked 0 .. 253 minutes (Operation Type = Timed Operation) | | | -| 0xFE | | | No unlocked period (Operation Type = Constant Operation) | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -A supporting node MAY advertise just a subset of the available Lock Timeout values. A controlling node MUST accept all Lock Timeout values. - -Lock Timeout Seconds (8 bits) - -This field MUST advertise the remaining time before the door lock will automatically be locked again. - -[The encoding of the Lock Timeout Seconds field MUST be according to Table 38. The time to stay](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. - -Table 38, Door Lock Operation Report :: Lock Timeout Seconds - -| | Value | | | Operation | | -| --- | --- | --- | --- | --- | --- | -| 0..59 (0x00..0x3B) | | | Unlocked 0 .. 59 seconds (Operation Type = Timed Operation) | | | -| 254 (0xFE) | | | No unlocked period (Operation Type = Constant Operation) | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -A supporting node MAY advertise just a subset of the available Lock Timeout values. A controlling de MUST accept all Lock Timeout values. - -## 4.29.5 Door Lock Configuration Set Command - -This command is used to set the configuration of a supporting door lock device. - -A door lock device MUST be able to operate with the factory default settings. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK CONFIGURATION SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Operation Type | | | | | | | | | | | | | | | | | | | | | | | | -| Outside Door Handles Mode | | | | | | | | | | | | Inside Door Handles Mode | | | | | | | | | | | | -| Lock Timeout Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| Lock Timeout Seconds | | | | | | | | | | | | | | | | | | | | | | | | - -Operation Type (1 byte) - -[The Operation Type field MUST be set according to Table 39. When timed operation is specified, the](04.29-door-lock-command-class-version-1-2.md#4295-door-lock-configuration-set-command) Lock Timeout Minutes and Lock Timeout Seconds fields MUST be set to valid values. - -Table 39, Door Lock Operation Type - -| Operation Type | Description | | Valid Lock | | -| --- | --- | --- | --- | --- | -| | | | Timeout values | | -| 0x01 | Constant operation | Minutes = 0xFE Seconds= 0xFE | | | -| 0x02 | Timed operation | Minutes = 0x00..0xFD Seconds= 0x00..0x3B | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -A supporting node MAY accept just a subset of the available Operation Type values. A supporting node MUST accept the Operation Type value 0x01. - -Outside Door Handles Mode (4 bits) - -This field is used to advertise the status of each individual outside door handle. - -[The encoding of the Outside Door Handles Mode bitmask field MUST be according to Table 34 and Table 35.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -A supporting node MAY ignore the Door Handles Mode value. - -Inside Door Handles Mode (4 bits) - -This field MUST advertise the status of each individual inside door handle. - -[The encoding of the Inside Door Handles Mode bitmask field MUST be according to Table 34 and Table 35.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) A supporting node MAY ignore the Door Handles Mode value. - -Lock Timeout Minutes (1 byte) - -This field MUST specify the time that a door lock must wait before automatically being locked again. - -[The encoding of the Lock Timeout Minutes field MUST be according to Table 37. The time to stay](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. - -A supporting node MAY ignore the Lock Timeout values if it implements only the Operation Type = 0x01 (Constant operation). - -Lock Timeout Seconds (1 byte) - -This field MUST specify the time that a door lock must wait before automatically being locked again. - -[The encoding of the Lock Timeout Seconds field MUST be according to Table 38. The time to stay](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) unlocked MUST be determined by combining the Lock Timeout Minutes and Lock Timeout Seconds fields. - -A supporting node MAY ignore the Lock Timeout values if it implements only the Operation Type = 0x01 (Constant operation). - -## 4.29.6 Door Lock Configuration Get Command - -This command is used to request the configuration parameters of a door lock device. - -The Door Lock Configuration Report command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK CONFIGURATION GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.29.7 Door Lock Configuration Report Command - -This command is used to advertise the configuration parameters of a door lock device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK CONFIGURATION REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Operation Type | | | | | | | | | | | | | | | | | | | | | | | | -| Outside Door Handles Mode | | | | | | | | | | | | Inside Door Handles Mode | | | | | | | | | | | | -| Lock Timeout Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| Lock Timeout Seconds | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.29.5 Door Lock Configuration Set Command.](04.29-door-lock-command-class-version-1-2.md#4295-door-lock-configuration-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.30-door-lock-command-class-version-3.md b/docs/specs/command-class-specification/04-command-class-definitions/04.30-door-lock-command-class-version-3.md deleted file mode 100644 index cb55631..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.30-door-lock-command-class-version-3.md +++ /dev/null @@ -1,54 +0,0 @@ - -# 4.30 Door Lock Command Class, version 3 - -The Door Lock Command Class is used to operate and configure a door lock device. - -[The Door Lock Command Class is an actuator control command class. Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -Commands and fields not described in version 3 remain unchanged from version 2. - -## 4.30.1 Compatibility considerations - -A node supporting the Door Lock Command Class, version 3 MUST support the Door Lock Command Class, version 2. - -Version 3 adds duration and target value reporting to the Door Lock Operation Report Command. - -## 4.30.2 Door Lock Operation Report Command - -This command is used to advertise the status of a door lock device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK OPERATION REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Current Door Lock Mode | | | | | | | | | | | | | | | | | | | | | | | | -| Outside Door Handles Mode | | | | | | | | | | | | Inside Door Handles Mode | | | | | | | | | | | | -| Door Condition | | | | | | | | | | | | | | | | | | | | | | | | -| Lock Timeout Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| Lock Timeout Seconds | | | | | | | | | | | | | | | | | | | | | | | | -| Target Door Lock Mode | | | | | | | | | | | | | | | | | | | | | | | | -| Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from previous versions. - -Current Door Lock Mode (8 bits) - -The Current Door Lock Mode field MUST advertise the current mode of the door lock device. - -[The encoding of this field MUST be according to Table 33.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -An Operation Set Command may be used to initiate a transition to a new target mode. The device may be queried for its current mode while in transition to a new mode. The response to an Operation Get SHOULD be the current mode of the device hardware, e.g. Door/Lock State Unknown. (applies to Version 2 and newer). Target Door Lock Mode (8 bits) - -The Target Door Lock Mode field MUST advertise the target mode of an ongoing transition or the most recent transition. - -[The encoding of this field MUST be according to Table 33.](04.29-door-lock-command-class-version-1-2.md#4294-door-lock-operation-report-command) - -Duration (8 bits) - -The Duration field SHOULD advertise the remaining time before the target mode is reached. [The encoding of this field MUST be according to Table 8.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.31-door-lock-logging-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.31-door-lock-logging-command-class-version-1.md deleted file mode 100644 index 1bff0ac..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.31-door-lock-logging-command-class-version-1.md +++ /dev/null @@ -1,171 +0,0 @@ - -# 4.31 Door Lock Logging Command Class, version 1 - -This Door Lock Logging Command Class provides an audit trail in an access control application. Each time an event takes place at the door lock, the system logs the user's ID, date, time etc. - -## 4.31.1 Door Lock Logging Records Supported Get Command - -This command is used to request the number of records that the audit trail supports. - -The Door Lock Logging Records Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK LOGGING RECORDS SUPPORTED GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.31.2 Door Lock Logging Records Supported Report Command - -This command is used to report the maximum number of reports the audit trail supports. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = DOOR LOCK LOGGING RECORDS SUPPORTED REPORT _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Max records stored | | | | | | | | | | | | | | | | | | | | | | | | - -Max records stored (8 bits) - -The number of records the audit trail supports stored in a queue. - -## 4.31.3 Door Lock Logging Record Get Command - -This command is used to request the audit trail. - -The Door Lock Logging Record Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RECORD GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Record number | | | | | | | | | | | | | | | | | | | | | | | | - -Record number (8 bits) - -The Record number field indicates the record to be requested. - -A value 0 – Max records stored is acceptable with a value of 0 being the most recent entry. When requesting with a value of 0, the report will contain the record number so the latest record is known. - -## 4.31.4 Door Lock Logging Record Report Command - -This command returns records from the audit trail. - -To provide flexibility the user associated with the record may be identified by one of two methods: the user identifier or the user code. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS DOOR LOCK LOGGING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RECORD REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Record number | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp – Month | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp – Day | | | | | | | | | | | | | | | | | | | | | | | | -| Record status | | | | | | | | | Timestamp - Hour Local Time | | | | | | | | | | | | | | | -| Timestamp - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Timestamp - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Event Type | | | | | | | | | | | | | | | | | | | | | | | | -| User Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| User Code Length | | | | | | | | | | | | | | | | | | | | | | | | -| USER CODE 1 _ | | | | | | | | | | | | | | | | | | | | | | | | -| .. | | | | | | | | | | | | | | | | | | | | | | | | -| USER CODE N _ | | | | | | | | | | | | | | | | | | | | | | | | - -Record number (8 bits) - -Record number requested (1- 255). - -Timestamp - Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Timestamp - Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Timestamp - Day (8 bits) - -Specify the day of the month between 01 and 31. Record status (3-bits) - -The Record Status field is used to indicate if legal data is stored in the record. - -| | Record State | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Requested record is empty. | | | -| 1 | | | Requested record holds legal data. | | | - -Timestamp - Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Timestamp - Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Timestamp - Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Note: If RTC (Real Time Clock) all values in Time Stamp record SHOULD be set to 0. Most recent Record MUST be stored under Record Number 1. - -User Identifier (8 bits) - -The User Identifier is used to recognize the user identity. A valid User Identifier MUST be a value starting from 1 to the maximum number of users supported by the device; refer to the User Code Command Class. A User Identifier of 0 is acceptable when the record does not need to identify a user or if the User Code is provided in this report. - -User Code Length (8 bits) - -The User Code Length field indicates the number of bytes used to hold the User Code. A length of 0 is acceptable when the record does not need to identify a User Code or when the User Identifier field is non-zero. - -USER_CODE (N bytes) - -These fields contain the user code. Minimum code length is 4 and maximum 10 ASCII digits. For further details about the user code, refer to the User Code Command Class. Event Type (8 bits) - -[This field MUST be encoded according to Table 40.](04.31-door-lock-logging-command-class-version-1.md#4314-door-lock-logging-record-report-command) - -Table 40, Door Lock Logging Record Report::Event Type encoding - -| | Event type | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 1 | | | Lock Command: Keypad access code verified lock command | | | -| 2 | | | Unlock Command: Keypad access code verified unlock command | | | -| 3 | | | Lock Command: Keypad lock button pressed | | | -| 4 | | | Unlock command: Keypad unlock button pressed | | | -| 5 | | | Lock Command: Keypad access code out of schedule | | | -| 6 | | | Unlock Command: Keypad access code out of schedule | | | -| 7 | | | Keypad illegal access code entered | | | -| 8 | | | Key or latch operation locked (manual) | | | -| 9 | | | Key or latch operation unlocked (manual) | | | -| 10 | | | Auto lock operation | | | -| 11 | | | Auto unlock operation | | | -| 12 | | | Lock Command: Z-Wave access code verified | | | -| 13 | | | Unlock Command: Z-Wave access code verified | | | -| 14 | | | Lock Command: Z-Wave (no code) | | | -| 15 | | | Unlock Command: Z-Wave (no code) | | | -| 16 | | | Lock Command: Z-Wave access code out of schedule | | | -| 17 | | | Unlock Command Z-Wave access code out of schedule | | | -| 18 | | | Z-Wave illegal access code entered | | | -| 19 | | | Key or latch operation locked (manual) | | | -| 20 | | | Key or latch operation unlocked (manual) | | | -| 21 | | | Lock secured | | | -| 22 | | | Lock unsecured | | | -| 23 | | | User code added | | | -| 24 | | | User code deleted | | | -| 25 | | | All user codes deleted | | | -| 26 | | | Master code changed | | | -| 27 | | | User code changed | | | -| 28 | | | Lock reset | | | -| 29 | | | Configuration changed | | | -| 30 | | | Low battery | | | -| 31 | | | New Battery installed | | | - -Not all events types are supported and it is up to manufacturer to decide which ones are to be supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.32-energy-production-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.32-energy-production-command-class-version-1.md deleted file mode 100644 index 31feb22..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.32-energy-production-command-class-version-1.md +++ /dev/null @@ -1,79 +0,0 @@ - -# 4.32 Energy Production Command Class, version 1 - -The Energy Production Command Class is used to retrieve various production data from the device. - -## 4.32.1 Energy Production Get Command - -This command is used to request various production data from the device. - -The Energy Production Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENERGY PRODUCTION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENERGY PRODUCTION GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Number (8 bits) - -The parameter number specifies the kind of production data to retrieve. Currently the following parameter numbers are defined: - -| | Parameter Number | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Instant energy production | | | -| 0x01 | | | Total energy production | | | -| 0x02 | | | Energy production today | | | -| 0x03 | | | Total production time | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -## 4.32.2 Energy Production Report Command - -This command is used to retrieve various production data from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS ENERGY PRODUCTION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = ENERGY PRODUCTION REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Number | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Parameter Number (8 bits) - -Refer to description under the Energy Production Get Command. - -Precision (3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Scale (2 bits) - -The Scale field indicates the scale used for the specified parameter number: - -| | Parameter Number | | | Scale | | | Description | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | 0x00 | | | W | | | -| 0x01 | | | 0x00 | | | Wh | | | -| 0x02 | | | 0x00 | | | Wh | | | -| 0x03 | | | 0x00 | | | Seconds | | | -| | | | 0x01 | | | Hours | | | - -Size (3 bits) - -The size field indicates the number of bytes used for the value. This field can take values from 1 (001b), 2 (010b) or 4 (100b). - -Value (N bytes) - -[The value is MUST be treated as a signed field (Table 10). The field MAY be 1, 2 or 4 bytes in size. The](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) first byte is the most significant byte. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.34-geographic-location-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.34-geographic-location-command-class-version-1.md deleted file mode 100644 index 059348c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.34-geographic-location-command-class-version-1.md +++ /dev/null @@ -1,59 +0,0 @@ - -# 4.34 Geographic Location Command Class, version 1 - -The Geographic Location Command Class is used to read latitude and longitude from another device. The latitude and longitude may also be set according to the geographic location in question. Date and geographic location may be used to calculate sunrise and sunset for e.g. automatic lighting control. - -## 4.34.1 Geographic Location Set Command - -This command is used to set latitude and longitude. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS GEOGRAPHIC LOCATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = GEOGRAPHIC LOCATION SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Longitude Degrees | | | | | | | | | | | | | | | | | | | | | | | | -| Long. Sign | | | Longitude Minutes | | | | | | | | | | | | | | | | | | | | | -| Latitude Degrees | | | | | | | | | | | | | | | | | | | | | | | | -| Lat. Sign | | | Latitude Minutes | | | | | | | | | | | | | | | | | | | | | - -Longitude (16 bits) - -The longitude determines one's location on the earth's surface, East or West of the Greenwich Meridian. The Greenwich Meridian is located at the Greenwich observatory, in Greenwich, England to be the geographic point for where East and West meet. Therefore, Greenwich Meridian is indicated as 0° longitude. Longitude values for points East of the Meridian are always positive, while points West of the Meridian are always negative. Valid ranges are for degrees (from -180 to 180) and minutes (0-59). Other values will be interpreted as 0. - -Latitude (16 bits) - -The latitude determines one's location on the earth's surface, North or South of the Equator. Latitude is measured between -90° South, and +90° North of the Equator point (0°). Valid ranges are for degrees (from -90 to 90) and minutes (0-59). Other values will be interpreted as 0. - -## 4.34.2 Geographic Location Get Command - -This command is used to request latitude and longitude from a device. - -The Geographic Location Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS GEOGRAPHIC LOCATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = GEOGRAPHIC LOCATION GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.34.3 Geographic Location Report Command - -This command returns latitude and longitude from a device in a Z-Wave network. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS GEOGRAPHIC LOCATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = GEOGRAPHIC LOCATION REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Longitude Degrees | | | | | | | | | | | | | | | | | | | | | | | | -| Long. Sign | | | Longitude Minutes | | | | | | | | | | | | | | | | | | | | | -| Latitude Degrees | | | | | | | | | | | | | | | | | | | | | | | | -| Lat. Sign | | | Latitude Minutes | | | | | | | | | | | | | | | | | | | | | - -Refer to description under the Geographic Location Set Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.35-hrv-status-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.35-hrv-status-command-class-version-1.md deleted file mode 100644 index 4a6d318..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.35-hrv-status-command-class-version-1.md +++ /dev/null @@ -1,118 +0,0 @@ - -# 4.35 HRV Status Command Class, version 1 - -The residential Heat Recovery Ventilation (HRV) Status Command Class is used to read out a number of parameters in the ventilation system. - -## 4.35.1 HRV Status Get Command - -This command is used to request specific parameters from the ventilation system. - -The HRV Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV STATUS GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Status Parameter | | | | | | | | | | | | | | | | | | | | | | | | - -Status Parameter (8 bits) - -The status parameter used to indicate which status parameter that is requested. - -| | Value | | | Status Parameter | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Outdoor Air temperature | | | -| 0x01 | | | Supply Air (to room) temperature | | | -| 0x02 | | | Exhaust Air (from room) temperature | | | -| 0x03 | | | Discharge Air temperature | | | -| 0x04 | | | Room temperature | | | -| 0x05 | | | Relative Humidity in room | | | -| 0x06 | | | Remaining filter life | | | - -## 4.35.2 HRV Status Report Command - -This command is used to report a specific status parameter in response to a HRV Status Get. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV STATUS REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Status Parameter | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| …. | | | | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Status Parameter (8 bits) - -[The status parameter used to indicate which status parameter that is reported. Refer to 4.35.1 HRV Status Get for possible values.](04.35-hrv-status-command-class-version-1.md#4351-hrv-status-get-command) - -Precision (3 bits) - -The precision field describes what the precision of the setpoint value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Scale (2 bits) - -The scale field indicates the scale used the list of possible scales are given below: - -| | Status Parameter | | | Scale | | | Value | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Outdoor Air temperature | | | Celsius (C) | | | 0 | | | -| | | | Fahrenheit (F) | | | 1 | | | -| Supply Air (to room) temperature | | | Celsius (C) | | | 0 | | | -| | | | Fahrenheit (F) | | | 1 | | | -| Exhaust Air (from room) temperature | | | Celsius (C) | | | 0 | | | -| | | | Fahrenheit (F) | | | 1 | | | -| Discharge Air temperature | | | Celsius (C) | | | 0 | | | -| | | | Fahrenheit (F) | | | 1 | | | -| Room temperature | | | Celsius (C) | | | 0 | | | -| | | | Fahrenheit (F) | | | 1 | | | -| Relative Humidity in room | | | Percentage (%) | | | 0 | | | -| Remaining filter life | | | Percentage (%) | | | 0 | | | - -Size (3 bits) - -The size field indicates the number of bytes used for the sensor value. This field can take values from 1 (001b), 2 (010b) or 4 (100b). - -Value (N bytes) - -[The value MUST be treated as a signed field (Table 10). The value MAY be 1, 2 or 4 bytes in size. This](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) first byte is the most significant byte. - -## 4.35.3 HRV Status Supported Get Command - -This command is used to request a bitmap of the supported status parameters. - -The HRV Status Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV STATUS SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.35.4 HRV Status Supported Report Command - -This command is used to report a bitmap indicating the supported status parameters. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV STATUS _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV STATUS SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields describe the supported status parameters from the ventilation system. Bit 0 in the Bit Mask 1 field used to indicate if the status parameter “Outdoor Air Temperature” is supported, 0 indicating not supported and 1 indicating supported. Bit 1 in the Bit Mask 1 field used to indicate if the status parameter “Supply Air Temperature” is supported and so forth. All available status parameters are given [in Section 4.35.1 HRV Status Get.](04.35-hrv-status-command-class-version-1.md#4351-hrv-status-get-command) - -It is only necessary to send the Bit Mask fields 1 and up to the one indicating the last support status parameter. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.36-hrv-control-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.36-hrv-control-command-class-version-1.md deleted file mode 100644 index 496e243..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.36-hrv-control-command-class-version-1.md +++ /dev/null @@ -1,212 +0,0 @@ - -# 4.36 HRV Control Command Class, version 1 - -The Heat Recovery Ventilation (HRV) Control Command Class is introducing control of Heat Recovery Ventilation systems via the Z-Wave interface. - -## 4.36.1 HRV Mode Set - -This command is used to set the desired mode in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL MODE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Mode | | | | | | | | | | | | | | | - -Mode (5 bits) - -The mode identifier MAY be set to the following values: - -| | Mode | | | Name | | | Description | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Off | | | The HRV system is in the off state, frost protection can occur. | | | -| 1 | | | Demand / Automatic | | | The HRV system is controlled based on sensor input. | | | -| 2 | | | Schedule | | | The HRV system is controlled based on predefined input from the factory and/or user/installer. | | | -| 3 | | | Energy Savings Mode | | | The HRV system will be put into a reduced heat / ventilation mode. | | | -| 4 | | | Manual | | | The HRV system is in manual mode. The command HRV Manual Control Set may be used to manually control the device. | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.36.2 HRV Mode Get Command - -This command is used to request the current mode from the device. - -The HRV Mode Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL MODE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.36.3 HRV Mode Report Command - -The HRV Mode Report Command is used to report the mode from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL MODE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Mode | | | | | | | | | | | | | | | - -Mode (8 bits) - -Refer to description under the HRV Mode Set command. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.36.4 HRV Bypass Set Command - -This command is used to set the bypass mode when the ventilation system is set to manual mode. If the system is not in manual mode while receiving this command it MUST be ignored. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL BYPASS SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bypass | | | | | | | | | | | | | | | | | | | | | | | | - -Bypass (8 bits) - -The value MAY be 0x00 (close) or 0xFF (open). - -Furthermore, the field MAY carry a percentage value between 1 to 99 (0x01 - 0x63). If the ventilation system supports modulated bypass, the percentage value will represent the aperture of the bypass. If the system does not support the full range of aperture steps, the values SHOULD be mapped linearly over the entire scale. - -If ventilation system does support modulated bypass the values from 1 to 99 MUST be interpreted as fully open. - -The value 254 (0xFE) MAY be used to set the bypass into automatic mode. - -## 4.36.5 HRV Bypass Get Command - -This command is used to request the current bypass setting. - -The HRV Bypass Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL BYPASS GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.36.6 HRV Bypass Report Command - -This command is used to report the current bypass parameters. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL BYPASS REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bypass | | | | | | | | | | | | | | | | | | | | | | | | - -Bypass (8 bits) - -[See description in 4.36.4 HRV Bypass Set.](04.36-hrv-control-command-class-version-1.md#4364-hrv-bypass-set-command) - -## 4.36.7 HRV Ventilation Rate Set Command - -This command is used to set the ventilation rate when the ventilation system is set to manual mode. If the system is not in manual mode while receiving this command it MUST be ignored. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL VENTILATION RATE SET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Ventilation Rate | | | | | | | | | | | | | | | | | | | | | | | | - -Ventilation Rate (8 bits) - -The value MAY be 0x00 (off) or 0xFF (on). - -The field MAY carry a percentage value between 1 to 99 (0x01 - 0x63). A ventilation system MAY map the values 1..99 to less than 99 steps. - -## 4.36.8 HRV Ventilation Rate Get Command - -This command is used to request the current ventilation rate setting. - -The HRV Ventilation Rate Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL VENTILATION RATE GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.36.9 HRV Ventilation Rate Report Command - -This command is used to report the current ventilation rate setting. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL VENTILATION RATE REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Ventilation Rate | | | | | | | | | | | | | | | | | | | | | | | | - -Ventilation Rate (8 bits) - -[See description under Section 4.36.7 HRV Ventilation Rate Set.](04.36-hrv-control-command-class-version-1.md#4367-hrv-ventilation-rate-set-command) - -## 4.36.10 HRV Mode Supported Get Command - -This command is used to request the supported modes from the device. - -The HRV Mode Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL MODE SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | - -## 4.36.11 HRV Mode Supported Report Command - -This command is used to report the supported modes from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HRV CONTROL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = HRV CONTROL MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | Manual Control Supported | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Manual Control Supported (3 bits) - -The manual control supported bits describes the supported manual control modes of the ventilation system. The mode is supported if the bit is 1. If the bit is 0, the mode is not supported. - -The bits are mapped to the following controls: - -| Bit | | | Name | | -| --- | --- | --- | --- | --- | -| 0 | | Bypass Open / Close | | | -| 1 | | Bypass Auto | | | -| 2 | | Modulated Bypass | | | -| 3 | | Ventilation Rate | | | - -E.g. a ventilation system supporting only open and close would report Manual Control Supported = 0x01. Bit Mask (N bytes) - -The Bit Mask fields describe the supported modes by the device. - - Bit 0 in Bit Mask 1 field indicates if Mode = 0 (Off) is supported.  Bit 1 in Bit Mask 1 field indicates if Mode = 1 (Demand / Automatic) is supported.  … - -If the Mode is supported the bit MUST be set to 1. If the Mode is not supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported mode. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. - -[All available modes are given in Section 4.36.1 HRV Mode Set.](04.36-hrv-control-command-class-version-1.md#4361-hrv-mode-set) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.37-humidity-control-mode-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.37-humidity-control-mode-command-class-version-1.md deleted file mode 100644 index d8e7ce0..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.37-humidity-control-mode-command-class-version-1.md +++ /dev/null @@ -1,110 +0,0 @@ - -# 4.37 Humidity Control Mode Command Class, version 1 - -The Humidity Control Mode Command Class is used to control a humidity control device. - -## 4.37.1 Humidity Control Mode Set Command - -This command is used to set the humidity control mode in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL MODE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Mode | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Mode (4 bits) - -[The encoding of the humidity control mode field MUST be according to Table 43.](04.37-humidity-control-mode-command-class-version-1.md#4371-humidity-control-mode-set-command) - -Table 43, Mode - -| | Mode | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Off – Humidity control system is off. | | | 1 | | | -| 1 | | | Humidify – The system will attempt to raise humidity to the humidifier setpoint. | | | 1 | | | -| 2 | | | De-humidify – The system will attempt to lower the humidity to the de- humidifier setpoint. | | | 1 | | | - -All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. - -## 4.37.2 Humidity Control Mode Get Command - -This command is used to request the supported humidity control modes from the device. - -The Humidity Control Mode Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL MODE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -Humidity Control Mode Report Command 4.37.3 - -This command is used to report the humidity control mode from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL MODE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Mode | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Mode (4 bits) - -Refer to the description under the Humidity Control Mode Set Command. - -## 4.37.4 Humidity Control Mode Supported Get Command - -This command is used to request the supported modes from the device. - -The Humidity Control Mode Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL MODE SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | - -## 4.37.5 Humidity Control Mode Supported Report Command - -This command is used to report the supported humidity control modes from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL MODE SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields MUST advertise the supported humidity control modes by the device. The encoding [of the Size field MUST be according to Table 44.](04.37-humidity-control-mode-command-class-version-1.md#4375-humidity-control-mode-supported-report-command) - -Table 44, Supported Humidity Control Mode - -| | Field | | Bit | | | Support for Control Mode | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Bit Mask 1 | | | 0 | | Reserved | | | 1 | | | -| Bit Mask 1 | | | 1 | | 1 (Humidifier) | | | 1 | | | -| Bit Mask 1 | | | 2 | | 2 (De-humidifer) | | | 1 | | | - -All Bit Mask fields and bits not specified above are reserved. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -For each individual bit, The value ‘0’ MUST signify that the actual Mode is not supported. The value ‘1’ MUST signify that the actual Mode is supported. A sending node MAY omit trailing Bit Mask fields if they are not needed. The number of Bit Mask fields MUST be determined from the length field in the frame. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.38-humidity-control-operating-state-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.38-humidity-control-operating-state-command-class-version-1.md deleted file mode 100644 index 4285f8f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.38-humidity-control-operating-state-command-class-version-1.md +++ /dev/null @@ -1,51 +0,0 @@ - -# 4.38 Humidity Control Operating State Command Class, version 1 - -The Humidity Control Operating State Command Class is used to obtain the operating state of the humidity control device. - -## 4.38.1 Humidity Control Operating State Get Command - -This command is used to request the operating state of the humidity control device. - -The Humidity Control Operating State Report Command MUST be returned in response to thiscommand. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL OPERATING STATE _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL OPERATING STATE GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.38.2 Humidity Control Operating State Report Command - -This command is used to report the operating state of the humidity control device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL OPERATING STATE _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL OPERATING STATE REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Operating State | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Operating State (4 bits) - -The Operating State field MUST advertise the current operating state. - -[The encoding of the Operating State field MUST be according to Table 45.](04.38-humidity-control-operating-state-command-class-version-1.md#4382-humidity-control-operating-state-report-command) Table 45, Operating State - -| | Operating State | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Idle | | | 1 | | | -| 1 | | | Humidifying | | | 1 | | | -| 2 | | | De-humidifying | | | 1 | | | - -All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.39-humidity-control-setpoint-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.39-humidity-control-setpoint-command-class-version-1.md deleted file mode 100644 index 25a46ec..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.39-humidity-control-setpoint-command-class-version-1.md +++ /dev/null @@ -1,237 +0,0 @@ - -# 4.39 Humidity Control Setpoint Command Class, version 1 - -The Humidity Control Setpoint Command Class is used for humidity control setpoint handling. - -## 4.39.1 Humidity Control Setpoint Set Command - -This command is used to set the humidity control setpoint in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -The Setpoint Type field MUST specify the humidity control setpoint to be set in the humidity control [device. The encoding of the Setpoint Type field MUST be according to Table 46.](04.39-humidity-control-setpoint-command-class-version-1.md#4391-humidity-control-setpoint-set-command) - -Table 46, Setpoint Type - -| | Setpoint Type | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | | | Humidifier | | | 1 | | | -| 2 | | | De-humidifier | | | 1 | | | - -All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. - -Precision (3 bits) - -The precision field MUST specify the precision of the setpoint value. The number indicates the number of decimals. As an example, the decimal value 1025 with precision two (2) is equal to 10.25. Scale (2 bits) - -The Scale field MUST specify the humidity scale used. The encoding of the Scale field MUST be [according to Table 47.](04.39-humidity-control-setpoint-command-class-version-1.md#4391-humidity-control-setpoint-set-command) - -Table 47, Scale values - -| | Scale | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Percentage value | | | 1 | | | -| 1 | | | Absolute humidity (g/m3) | | | 1 | | | - -All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. - -Size (3 bits) - -The Size field MUST specify the number of bytes used for the Value field. The encoding of the Size field [MUST be according to Table 48.](04.39-humidity-control-setpoint-command-class-version-1.md#4391-humidity-control-setpoint-set-command) - -Table 48, Size values - -| | Size | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | | | Value field is 1 byte long | | | 1 | | | -| 2 | | | Value field is 2 bytes long | | | 1 | | | -| 4 | | | Value field is 4 bytes long | | | 1 | | | - -All other values are reserved. Reserved values MUST NOT be used by a sending node and MUST be ignored by a receiving node. - -Value (N bytes) - -The value is a signed field. The field MAY be one, two, or four bytes in size as specified by the Size field. Value 1 is the most significant byte. - -## 4.39.2 Humidity Control Setpoint Get Command - -This command is used to request the given humidity control setpoint type in a device. - -The Humidity Control Setpoint Report MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -Refer to the description under the Humidity Control Setpoint Set Command. - -## 4.39.3 Humidity Control Setpoint Report Command - -This command is used to report the value of the humidity control setpoint type in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -[For fields’ description, refer to 4.39.1 Humidity Control Setpoint Set Command](04.39-humidity-control-setpoint-command-class-version-1.md#4391-humidity-control-setpoint-set-command) - -## 4.39.4 Humidity Control Setpoint Supported Get Command - -This command is used to request the humidity control setpoint types supported by the device. - -The Humidity Control Setpoint Supported Report Command MUST be returned in response to a this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.39.5 Humidity Control Setpoint Supported Report Command - -This command is used to report the humidity control setpoint types supported by the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields MUST advertise the humidity control setpoint types supported by the device.The [encoding of the Size field MUST be according to Table 49.](04.39-humidity-control-setpoint-command-class-version-1.md#4395-humidity-control-setpoint-supported-report-command) - -Table 49, Humidity Control Setpoint Supported Report values - -| | Field | | | Bit | | | Support for Setpoint Type | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Bit Mask 1 | | | 0 | | | Reserved | | | 1 | | | -| Bit Mask 1 | | | 1 | | | 1 (Humidifier) | | | 1 | | | -| Bit Mask 1 | | | 2 | | | 2 (De-humidifer) | | | 1 | | | - -All Bit Mask fields and bits not specified above are reserved. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. For each individual bit, The value ‘0’ MUST signify that the actual Setpoint Type is not supported. The value ‘1’ MUST signify that the actual Setpoint Type is supported. - -A sending node MAY omit trailing Bit Mask fields if they are not needed. The number of Bit Mask fields MUST be determined from the length field in the frame. - -## 4.39.6 Humidity Control Setpoint Scale Supported Get Command - -This command is used to retrieve the supported scales of the humidity control setpoints in the device. - -The Humidity Control Scale Supported Report Command MUST be returned in response to this command. - -| | 7 | 6 | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT SCALE SUPPORTED GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Setpoint Type | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -Refer to the description under the Humidity Control Setpoint Set Command. - -## 4.39.7 Humidity Control Setpoint Scale Supported Report Command - -This command indicates the supported scales of the humidity control setpoint in a bit mask format. - -| | 7 | 6 | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT SCALE SUPPORTED REPORT _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Scale Bit Mask | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Scale Bit Mask (4 bits) - -Refer to the description under the Humidity Control Setpoint Set Command. - -## 4.39.8 Humidity Control Setpoint Capabilities Get Command - -This command is used to request the minimum and maximum setpoint values for a given humidity control Setpoint Type. - -The Humidity Control Setpoint Capabilities Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT CAPABILITIES GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | - -Reserved - -The reserved field is for future use. Reserved bits MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Setpoint Type (4 bits) - -Refer to the description under the Humidity Control Setpoint Set Command. - -## 4.39.9 Humidity Control Setpoint Capabilities Report Command - -This command is used to report the minimum and maximum values of the requested humidity control setpoint type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS HUMIDITY CONTROL SETPOINT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = HUMIDITY CONTROL SETPOINT CAPABILITIES REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Setpoint Type | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Minimum Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Minimum Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Maximum Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Refer to the description under the Humidity Control Setpoint Set Command for other parameter/field descriptions. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.40-indicator-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.40-indicator-command-class-version-1.md deleted file mode 100644 index 705f932..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.40-indicator-command-class-version-1.md +++ /dev/null @@ -1,53 +0,0 @@ - -# 4.40 Indicator Command Class, version 1 - -The Indicator Command Class is used to show the actual state, level etc. on a supporting node. - -## 4.40.1 Indicator Set Command - -This command is used to enable or disable an indicator. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -The value MAY be 0x00 (off/disable) or 0xFF (on/enable). - -The field MAY carry values from 1 to 99. In case the indicator does not have the capability to show the range from 1 to 99, the values 1 to 99 MUST be presented as (on/enable). - -## 4.40.2 Indicator Get Command - -This command is used to request the state of an indicator. - -The Indicator Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.40.3 Indicator Report Command - -This command is used to advertise the state of an indicator. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -Refer to description under the Indicator Set Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.41-indicator-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.41-indicator-command-class-version-2.md deleted file mode 100644 index b73ef55..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.41-indicator-command-class-version-2.md +++ /dev/null @@ -1,298 +0,0 @@ - -# 4.41 Indicator Command Class, version 2 - -The Indicator Command Class, version 2 is used to manipulate indicator resources in a supporting node. An indicator may be an LED, an LCD display or a buzzer. - -One example of use is a central entry control application that uses the indicators of an entry control keypad device to advertise system status information. - -If the Indicator Command Class is implemented in a devices based on Role Type RSS (using Wake Up Command Class), the control of indicators must be synchronized with the Wake Up Notification. The controller must therefore wait for the Wake Up Notification, before it can control the indicators. The device implementing the indicator Command Class must therefore send the Wake Up Notification in case it expects to be controlled. - -## 4.41.1 Compatibility Considerations - -A supporting device MAY use its indicator resources for local status reporting until the first Indicator Set command is received. After receiving an Indicator Set command, the supporting device MUST NOT use its indicator resources for local status reporting until it has been reset to default or re-included in the network. An exception to this MAY be interface feedback functionality like a short beep on each button press. Likewise, transmission failure to the central controller MAY be advertised via the use of local indications. As an example, an entry control keypad device may feature an LCD backlight. If the backlight is advertised as an indicator resource, a central control application also has to control the backlight of the keypad, e.g. in response to local user activity and to temporarily draw attention to all keypads when an alarm is enabled. - -The Indicator Command Class, version 1 provides a single unspecified indicator resource. - -The Indicator Command Class, version 2 supports multiple indicator resources. Each indicator resource may implement a number of properties such as on/off and color. - -The Indicator Command Class, version 2 renames the Value field of version 1 to “Indicator 0 Value”. The Indicator 0 Value field properties are unspecified as in version 1. - -A supporting version 2 device MUST ignore the Indicator 0 Value of the Indicator Set command if other Value fields are specified. A supporting version 2 device MUST map the Indicator 0 Value of the Indicator Set command to a supported indicator if no other fields are specified. - -Since the Indicator 0 Value field is always present in Indicator Set commands, a controlling device MUST send the correct value in every Indicator Set command. A controlling version 2 device MUST ignore the Indicator 0 Value of the Indicator Report command if other Value fields are specified. A controlling version 2 device MUST interpret the Indicator 0 Value of the Indicator Report command the same way as in the Indicator Set command. - -## 4.41.2 Service Discovery Considerations - -A control application may discover available indicators and their properties via the Indicator Supported Report Command. Color properties allow the application to discover the color of actual indicators. A single indicator, e.g. ARMED_NOT_ARMED, may provide two colors; red and green. - -Likewise, a control application may detect the availability of indicator resources using LCD, e-paper or similar technologies to implement an indicator resource that keeps its state when the device goes to sleep. The device may advertise the property “Low_power” to indicate this. - -## 4.41.3 Indicator Set Command - -This command is used to manipulate one or more indicator resources of a supporting device. - -A supporting device MAY use its indicator resources for local status reporting until the first Indicator Set command is received. After receiving an Indicator Set command, the supporting device MUST NOT use its indicator resources for local status reporting until it has been reset to default or re-included in the network. An exception to this MAY be interface feedback functionality like a short beep on each button press. Likewise, transmission failure to the central controller MAY be advertised via the use of local indications. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Indicator 0 Value (Indicator ID 0 = 0x00, Property ID 0 = 0x01) | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Indicator Object Count | | | | | | | | | | | | | | | -| | Indicator ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Property ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Value 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Indicator ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Property ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Value N | | | | | | | | | | | | | | | | | | | | | | | - -Indicator 0 Value (1 byte) - -This field provides backwards compatibility with devices implementing the Indicator Command Class, version 1. - -A receiving device MUST ignore this field if other indicator resources are specified. A receiving device MUST map this value to a supported indicator resource if no other fields are specified. - -[Refer to the compatibility considerations found in 4.41.1.](04.41-indicator-command-class-version-2.md#4411-compatibility-considerations) Reserved - -This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. - -Indicator Object Count (1 byte) - -This field is used to advertise the number of indicator objects carried in the actual command. An indicator object MUST comprise an Indicator ID, Property ID and Value field. There MAY be several indicator objects carrying the same Indicator ID but different Property IDs, e.g. Color and Blink pattern. - -A receiving device MUST ignore an indicator object if an unsupported Indicator ID or Property ID is specified. The receiving device MUST continue parsing the command if more fields follow the ignored indicator object. - -Indicator ID n (1 byte) - -This field is used to identify the actual indicator resource. - -There MAY be several indicator objects carrying the same Indicator ID but different Property IDs, e.g. Color and Blink pattern. - -Property ID n (1 byte) - -This field is used to identify the specific property of the indicator resource identified by the Indicator ID. - -There MAY be several indicator objects carrying the same Indicator ID but different Property IDs, e.g. Color and Blink pattern. - -Value n (1 byte) - -This field is used to specify the value to assign to the specific property identified by the Indicator ID and the Property ID fields. - -### 4.41.3.1 Indicator IDs - -[The identifiers used in Indicator ID fields MUST comply with the definitions found in Table 50.](04.41-indicator-command-class-version-2.md#44131-indicator-ids) - -Table 50, Indicator CC :: Indicator IDs - -| | Indicator | | Description | Appearance and use | -| --- | --- | --- | --- | --- | -| | ID | | | | -| 0x00 | | | NA | Not Applicable. MUST NOT be used for other purposes than service discovery and rejecting invalid requests. | -| 0x01 | | | ARMED | Use to indicate that alarm is armed (RECOMMENDED color: Red) | -| 0x02 | | | NOT ARMED _ | Use to indicate that alarm is disarmed (RECOMMENDED color: Green) | -| 0x03 | | | READY | Use to indicate that device is ready (RECOMMENDED color: Green) | -| 0x04 | | | FAULT | Use to indicate a general error (RECOMMENDED color: Red) | -| 0x05 | | | BUSY | Use to indicate that device is temporarily busy (RECOMMENDED color: Yellow) | -| 0x06 | | | ENTER ID _ | Use to signal that device is waiting for ID (RECOMMENDED color: Yellow) | -| 0x07 | | | ENTER PIN _ | Use to signal that device is waiting for PIN code (RECOMMENDED color: Yellow) | -| 0x08 | | | OK | Use to indicate OK e.g. the entered code is accepted (RECOMMENDED color: Green) | -| 0x09 | | | NOT OK _ | Use to indicate NOT OK e.g. the entered code is NOT accepted (RECOMMENDED color: Red) | -| … | | | | | -| 0x20 | | | ZONE1 ARMED _ | Use to indicate that alarm zone 1 is armed (RECOMMENDED color: Red) | -| 0x21 | | | ZONE2 ARMED _ | Use to indicate that alarm zone 2 is armed (RECOMMENDED color: Red) | -| 0x22 | | | ZONE3 ARMED _ | Use to indicate that alarm zone 3 is armed (RECOMMENDED color: Red) | -| 0x23 | | | ZONE4 ARMED _ | Use to indicate that alarm zone 4 is armed (RECOMMENDED color: Red) | -| 0x24 | | | ZONE5 ARMED _ | Use to indicate that alarm zone 5 is armed (RECOMMENDED color: Red) | -| 0x25 | | | ZONE6 ARMED _ | Use to indicate that alarm zone 6 is armed (RECOMMENDED color: Red) | -| … | | | | | -| 0x30 | | | LCD BACKLIGHT _ | Use to turn on LCD backlight, e.g. to shortly draw attention when alarm is activated from another entry control keypad. | -| … | | | | | -| 0x40 | | | BUTTON BACKLIGHT _ _ LETTERS | Use to indicate that buttons are ready for user input | - -| | Indicator | | Description | Appearance and use | -| --- | --- | --- | --- | --- | -| | ID | | | | -| 0x41 | | | BUTTON BACKLIGHT _ _ DIGITS | Use to indicate that buttons are ready for user input | -| 0x42 | | | BUTTON BACKLIGHT _ _ COMMAND | Use to indicate that buttons are ready for user input | -| 0x43 | | | BUTTON1 INDICATION _ | Use to draw attention to button 1 (RECOMMENDED for button backlight or LED next to button) | -| 0x44 | | | BUTTON2 INDICATION _ | Use to draw attention to button 2 (RECOMMENDED for button backlight or LED next to button) | -| 0x45 | | | BUTTON3 INDICATION _ | Use to draw attention to button 3 (RECOMMENDED for button backlight or LED next to button) | -| 0x46 | | | BUTTON4 INDICATION _ | Use to draw attention to button 4 (RECOMMENDED for button backlight or LED next to button) | -| 0x47 | | | BUTTON5 INDICATION _ | Use to draw attention to button 5 (RECOMMENDED for button backlight or LED next to button) | -| 0x48 | | | BUTTON6 INDICATION _ | Use to draw attention to button 6 (RECOMMENDED for button backlight or LED next to button) | -| 0x49 | | | BUTTON7 INDICATION _ | Use to draw attention to button 7 (RECOMMENDED for button backlight or LED next to button) | -| 0x4A | | | BUTTON8 INDICATION _ | Use to draw attention to button 8 (RECOMMENDED for button backlight or LED next to button) | -| 0x4B | | | BUTTON9 INDICATION _ | Use to draw attention to button 9 (RECOMMENDED for button backlight or LED next to button) | -| 0x4C | | | BUTTON10 INDICATION _ | Use to draw attention to button 10 (RECOMMENDED for button backlight or LED next to button) | -| 0x4D | | | BUTTON11 INDICATION _ | Use to draw attention to button 11 (RECOMMENDED for button backlight or LED next to button) | -| 0x4E | | | BUTTON12 INDICATION _ | Use to draw attention to button 12 (RECOMMENDED for button backlight or LED next to button) | -| … | | | | | -| 0xF0 | | | Buzzer | Use to draw attention or provide user feedback | -| | | | | | - -All other values are reserved and MUST NOT be used by a sending device. Reserved values MUST be ignored by a receiving device. - -### 4.41.3.2 Property IDs - -[The identifiers used in Property ID fields MUST comply with the definitions found in Table 51.](04.41-indicator-command-class-version-2.md#44132-property-ids) - -Table 51, Indicator CC :: Property IDs - -| | Value | | | General Description | | | Specific use | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x01 | | | Multilevel | | | Light level, sound level 0x00 = OFF 0x01 – 0x63 = Lowest non-zero level - 100% 0xFF = Restore most recent (non-zero) level. | | | -| 0x02 | | | Binary | | | Turn indication On or Off 0x00 = OFF 0x01 – 0x63, 0xFF = ON | | | -| 0x03 | | | On Off Period _ _ | | | The Period in seconds of one ON/OFF period 0x00 – 0xFF = 0 - 25,5 sec | | | -| 0x04 | | | On Off Cycles _ _ | | | Number of On Off Period to run _ _ 0x00 – 0xFE = 0 – 254 times 0xFF = Run until stopped by On Off _ | | | -| … | | | | | | | | | -| 0x10 | | | Low power - _ | | | ADVERTISE ONLY: This property MAY be used to advertise that the indicator can continue working in sleep mode. The indicator may use LCD, e-paper or similar technologies to achieve this. If this property is not advertised, the indicator MUST be switch Off doing power down. The indicator MUST keep the Off state at next wakeup. | | | - -All other values are reserved and MUST NOT be used by a sending device. Reserved values MUST be ignored by a receiving device. - -If the On_Off_Period property is specified, the On_Off_Cycles property MUST also be specified. A receiving device MUST apply an On_Off_Cycles property value of 5 times if the On_Off_Period property is specified and the On_Off_Cycles property is not specified. - -If the On_Off_Cycles property is specified, the On_Off_Period property MUST also be specified. A receiving device MUST apply an On_Off_Period property value of 1 second if the On_Off_Cycles property is specified and the On_Off_Period property is not specified. - -The Multilevel and Binary properties can be used anytime to stop an alternating period configured the On_Off_Period and On_Off_Cycles properties. - -Properties marked as “ADVERTISE ONLY” MUST be treated as unsupported by the Indicator Set and Indicator Get Commands. - -## 4.41.4 Indicator Get Command - -This command is used to request the state of an indicator. - -The Indicator Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Indicator ID | | | | | | | | | | | | | | | | | | | | | | | | - -Indicator ID n (1 byte) - -This field is used to specify the actual indicator resource. - -If an unsupported Indicator ID is specified, a receiving device MUST advertise an indicator object with all fields set to zero in the Indicator Report Command that is returned in response to this command. - -## 4.41.5 Indicator Report Command - -This command is used to advertise the state of an indicator resource. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Indicator 0 Value (Indicator ID 0 = 0x00, Property ID 0 = 0x01) | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Indicator Object Count | | | | | | | | | | | | | | | -| | Indicator ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | PropertyID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Value 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Indicator ID N | | | | | | | | | | | | | | | | | | | | | | | -| | PropertyID N | | | | | | | | | | | | | | | | | | | | | | | -| | Value N | | | | | | | | | | | | | | | | | | | | | | | - -This field provides backwards compatibility with devices implementing the Indicator Command Class, [version 1. Refer to section 4.41.1 for details.](04.41-indicator-command-class-version-2.md#4411-compatibility-considerations) - -A controlling version 2 device MUST ignore the Indicator 0 Value field if other values are advertised. Indicator 0 Value (1 byte) - -Refer to the Indicator Set Command. - -[Refer to the compatibility considerations found in 4.41.1.](04.41-indicator-command-class-version-2.md#4411-compatibility-considerations) - -Reserved - -This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. - -Indicator Object Count (1 byte) - -This field is used to advertise the number of indicator objects carried in this command. An indicator object MUST comprise an Indicator ID, Property ID and Value field. Only one Indicator may be advertised at a time. Therefore, all indicator objects MUST carry the same Indicator ID while Property IDs MUST be different, e.g. Color and Blink pattern. This format is compatible w. the Indicator Set Command. - -Indicator ID (1 byte) - -This field is used to identify the actual indicator resource. - -All indicator objects MUST carry the same Indicator ID. - -Property ID n (1 byte) - -Refer to the Indicator Set Command. - -Value n (1 byte) - -Refer to the Indicator Set Command. - -## 4.41.6 Indicator Supported Get Command - -This command is used to request the supported properties of an indicator. - -The Indicator Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Indicator ID | | | | | | | | | | | | | | | | | | | | | | | | - -Indicator ID (1 byte) - -This field is used to specify the actual indicator resource. A sending device SHOULD set this field to zero to discover supporting Indicator IDs. A device receiving an Indicator ID value of zero MUST advertise the first supported Indicator ID in the Indicator Supported Report Command that is returned in response to this command. - -A device receiving a non-zero Indicator ID that is not supported MUST advertise the value zero in all fields of the Indicator Supported Report Command. - -## 4.41.7 Indicator Supported Report Command - -This command is used to advertise the supported properties for a given indicator. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS INDICATOR _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = INDICATOR SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Indicator ID | | | | | | | | | | | | | | | | | | | | | | | | -| Next Indicator ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Property Supported Bit Mask Length | | | | | | | | | | | | | | | -| Property Supported Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Property Supported Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Indicator ID (1 byte) - -This field is used to advertise the actual indicator resource. - -Reserved - -This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. - -Next Indicator ID (1 byte) - -This field is used to advertise if more Indicator IDs are supported. - -If a sending device supports additional Indicator IDs, this field MUST advertise the next supported Indicator ID. If the sending device supports only one Indicator ID, or if this command carries the last supported Indicator ID, this field MUST advertise the value 0. - -A receiving device SHOULD continue requesting supported Indicator IDs via the Indicator Supported Get Command until this field advertises the value zero. - -Property Supported Bit Mask Length (5 bits) - -This field is used to advertise the length of the Property Supported Bit Mask field in bytes. - -The value MUST be in the range 0..32. Property Supported Bit Mask (variable length) - -The Property Supported Bit Mask is used to advertise the properties supported by the actual Indicator ID. - - Bit 0 in Bit Mask 1 is not allocated to any property and MUST be set to zero.  Bit 1 in Bit Mask 1 indicates if Property ID = 1 (Multilevel) is supported.  Bit 2 in Bit Mask 1 indicates if Property ID = 2 (On/Off) is supported.  … - -If the Property ID is supported, the corresponding bit MUST be set to 1. If the Property ID is not supported the corresponding bit MUST be set to 0. - -Note that this Command Class maps bit 1 to Property ID=1. Some Command Classes map bit 0 to the first property diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.02-compatibility-considerations.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.02-compatibility-considerations.md deleted file mode 100644 index 25c0b79..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.02-compatibility-considerations.md +++ /dev/null @@ -1,12 +0,0 @@ - -# 4.42.2 Compatibility considerations - -## 4.42.2.1 Multi Channel considerations - -Multi Channel End Points SHOULD NOT support the Irrigation Command Class. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.04-irrigation-system-info-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.04-irrigation-system-info-get-command.md deleted file mode 100644 index beec399..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.04-irrigation-system-info-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.42.4 Irrigation System Info Get Command - -This command is used to request a receiving node about its irrigation system information. - -[The Irrigation System Info Report Command MUST be returned in response to this command.](04.42.05-irrigation-system-info-report-command.md#4425-irrigation-system-info-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM INFO GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.06-irrigation-system-status-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.06-irrigation-system-status-get-command.md deleted file mode 100644 index 90ab660..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.06-irrigation-system-status-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.42.6 Irrigation System Status Get Command - -This command is used to request a receiving node about its irrigation system status. - -The Irrigation System Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM STATUS GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.07-irrigation-system-status-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.07-irrigation-system-status-report-command.md deleted file mode 100644 index ac3b635..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.07-irrigation-system-status-report-command.md +++ /dev/null @@ -1,136 +0,0 @@ - -# 4.42.7 Irrigation System Status Report Command - -This command is used to advertise irrigation system status. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM STATUS REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| System Voltage | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Status | | | | | | | | | | | | | | | | | | | | | | | | -| Flow Precision | | | | | | | | | Flow Scale=l/h | | | | | | Flow Size | | | | | | | | | -| Flow Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Flow Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Pressure Precision | | | | | | | | | Pressure Scale=kPa | | | | | | Pressure Size | | | | | | | | | -| Pressure Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Pressure Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Shutoff Duration | | | | | | | | | | | | | | | | | | | | | | | | -| System Error Status | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | - -System Voltage (8 bits) - -This field advertises the voltage level applied at the sending node. - -The advertised value MUST be expressed in Volt. This field does not indicate the voltage type (AC or DC). - -If the node does not have a voltage sensor measuring the voltage, this field MUST be set to 0. - -Sensor Status (8 bits) - -This field is used to advertise if optional sensors are currently reporting values or detecting events at the sending node. - -[This field MUST be treated as a bit mask and MUST comply with Table 52.](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) Table 52, Irrigation System Status Report::Sensor Status encoding - -| | Bit | | | Sensor Status | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Flow Sensor currently active If this bit is set to 1, the Flow Value field value MUST advertise a valid sensor reading. | | | -| 1 | | | Pressure Sensor currently active If this bit is set to 1, the Pressure Value field value MUST advertise a valid sensor reading. | | | -| 2 | | | Rain Sensor attached and active If a rain sensor is currently attached to the device and detecting rain, this bit MUST be set to 1. | | | -| 3 | | | Moisture Sensor attached and active If a moisture sensor is currently attached to the device and detecting moisture, this bit MUST be set to 1. | | | -| 4..7 | | | Reserved | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Flow Precision (3 bits) - -This field MUST indicate how many decimals are contained in the “Flow Value” field value. For example, if the “Flow Value” field is set to 1025 and the “Flow Precision” field is set to 2, the Flow Value MUST be interpreted as 10.25. - -If the Sensor Status field’s bit 0 is set to 0, this field MUST be set to 0. - -Flow Scale (2 bits) - -This field MUST indicate which unit is used for the “Flow Value” field. This field MUST be set to 0. - -The value 0 MUST indicate that the unit is l/h (liter/hour) - -Flow Size (3 bits) - -This field is used to advertise the length in bytes of the “Flow Value” field. This field MUST be set to 1, 2 or 4. All other values are reserved and MUST NOT be used by a sending node. - -If the Sensor Status field’s bit 0 is set to 0, this field MUST be set to 1. - -Flow Value (N bytes) - -This field is used to advertise the Flow value measured by the flow sensor. - -The length of this field in byte MUST comply with the value advertised in the Flow Size field. - -If the Sensor Status field’s bit 0 is set to 0, this field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Pressure Precision (3 bits) - -This field MUST indicate how many decimals are contained in the “Pressure Value” field value. For example, if the “Pressure Value” field is set to 1025 and the “Pressure Precision” field is set to 2, the Pressure Value MUST be interpreted as 10.25. - -If the Sensor Status field’s bit 1 is set to 0, this field MUST be set to 0. - -Pressure Scale (2 bits) - -This field MUST indicate which unit is used for the “Pressure Value” field. This field MUST be set to 0. - -The value 0 MUST indicate that the unit is kPa (kilopascal) - -Pressure Size (3 bits) - -This field is used to advertise the length in bytes of the “Pressure Value” field. This field MUST be set to 1, 2 or 4. All other values are reserved and MUST NOT be used by a sending node. - -If the Sensor Status field’s bit 1 is set to 0, this field MUST be set to 1. - -Pressure Value (N bytes) - -This field is used to advertise the Pressure value measured by the pressure sensor. - -The length of this field in bytes MUST comply with the value advertised in the Pressure Size field. - -If the Sensor Status field’s bit 1 is set to 0, this field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Shutoff Duration (8 bits) - -This field is used to indicate how many hours are left in the “shut off” mode. - -[For description, refer to 4.42.21 Irrigation System Shutoff Command.](04.42.21-irrigation-system-shutoff-command.md#44221-irrigation-system-shutoff-command) - -System Error Status (8 bits) - -This field is used to advertise if any system error is being active at the sending node. [This field MUST be treated as a bit mask and MUST comply with Table 53.](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) Table 53, System Status Report::System Error Status encoding - -| | Bit | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | The device has not been programmed | | | -| 1 | | | The device has experienced an emergency shutdown. | | | -| 2 | | | The device’s pressure high threshold has been triggered. | | | -| 3 | | | The device’s pressure low threshold has been triggered. | | | -| 4 | | | A valve or the master valve is reporting error. Valves can be individually checked using the Irrigation Valve Info Get Command | | | -| 5..7 | | | Reserved | | | - -In some cases, errors are no longer active. Any inactive errors (except valve errors) can be cleared by [sending an Irrigation System Config Set Command. Refer to the Irrigation Valve Info Report Command](04.42.08-irrigation-system-config-set-command.md#4428-irrigation-system-config-set-command) for more details on valve specific errors. - -Master Valve (1 bit) - -This field is used to indicate if a master valve is currently open or closed. - -The value 1 MUST indicate that the master valve is On / Open. The value 0 MUST indicate that the master valve is Off / Closed. - -Valve ID (8 bits) - -This field is used to indicate the Valve ID of the first open zone valve currently On / Open. - -If no zone valve is On / Open, this field MUST be set to 0. Else, this field MUST be to a value in the range 1..{Total number of supported zone valves} by a sending node diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.08-irrigation-system-config-set-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.08-irrigation-system-config-set-command.md deleted file mode 100644 index bf5e792..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.08-irrigation-system-config-set-command.md +++ /dev/null @@ -1,68 +0,0 @@ - -# 4.42.8 Irrigation System Config Set Command - -This command allows the irrigation system to be configured accordingly. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM CONFIG SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Master Valve Delay | | | | | | | | | | | | | | | | | | | | | | | | -| High Pressure Threshold Precision | | | | | | | | | High Pressure Threshold Scale=kPa | | | | | | High Pressure Threshold Size | | | | | | | | | -| High Pressure Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| High Pressure Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Low Pressure Threshold Precision | | | | | | | | | Low Pressure Threshold Scale=kPa | | | | | | Low Pressure Threshold Size | | | | | | | | | -| Low Pressure Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Low Pressure Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Polarity | | | | | | | | | | | | | | | | | | | | | | | | - -Master Valve Delay (8 bits) - -This field is used to configure a delay in seconds between turning on the master valve and turning on any “zone” valve. - -This field MUST ignored by a receiving node if it does not implement a master valve. - -The value MUST be expressed in seconds and the value 0 MUST indicate that no delay is applied when turning master and zone valves on. - -Pressure High Threshold - -These fields are used to configure the pressure high threshold at the receiving node. - -A receiving node having no support for pressure sensor MAY ignore this field. - -[If the receiving node supports a Pressure Sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating high pressure when the pressure crosses](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) above this threshold. - -The format of the Pressure High Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in kPa. Pressure Low Threshold - -These fields are used to configure the pressure low threshold at the receiving node. - -A receiving node having no support for pressure sensor MAY ignore this field. - -[If the receiving node supports a Pressure Sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating low pressure when the pressure crosses below](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) this threshold. - -The format of the Pressure Low Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in kPa. - -Sensor Polarity (8 bits) - -This field is used to configure optional sensors’ polarity at the receiving node. - -[This field MUST be treated as a bit mask and MUST comply with Table 54. This field MUST be ignored if](04.42.08-irrigation-system-config-set-command.md#4428-irrigation-system-config-set-command) the ‘valid’ bit (bit 7) is set to 0. - -Table 54, Irrigation System Config Set::Sensor Polarity encoding - -| | Bit | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Rain Sensor Polarity (0 LOW, 1 HIGH) A receiving node having no support for rain sensor MAY ignore this field. | | | -| 1 | | | Moisture Sensor Polarity (0 LOW, 1 HIGH) A receiving node having no support for moisture sensor MAY ignore this field | | | -| 2..6 | | | Reserved | | | -| 7 | | | Valid This bit MUST be set to 1 to indicate that the other bits in the bitmask contain valid data. | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.09-irrigation-system-config-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.09-irrigation-system-config-get-command.md deleted file mode 100644 index ac59940..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.09-irrigation-system-config-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.42.9 Irrigation System Config Get Command - -This command is used to request a receiving node about its current irrigation system configuration. - -[The Irrigation System Config Report Command MUST be returned in response to this command.](04.42.10-irrigation-system-config-report-command.md#44210-irrigation-system-config-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM CONFIG GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.10-irrigation-system-config-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.10-irrigation-system-config-report-command.md deleted file mode 100644 index 0ffbb31..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.10-irrigation-system-config-report-command.md +++ /dev/null @@ -1,27 +0,0 @@ - -# 4.42.10 Irrigation System Config Report Command - -This command is used to advertise the current irrigation system configuration. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION SYSTEM CONFIG REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Master Valve Delay | | | | | | | | | | | | | | | | | | | | | | | | -| High Pressure Threshold Precision | | | | | | | | | High Pressure Threshold Scale=kPa | | | | | | High Pressure Threshold Size | | | | | | | | | -| High Pressure Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| High Pressure Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Low Pressure Threshold Precision | | | | | | | | | Low Pressure Threshold Scale=kPa | | | | | | Low Pressure Threshold Size | | | | | | | | | -| Low Pressure Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Low Pressure Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Polarity | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.42.8 Irrigation System Config Set Command. A sending node MUST comply with field descriptions in 4.42.8 Irrigation System Config Set Command.](04.42.08-irrigation-system-config-set-command.md#4428-irrigation-system-config-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.13-irrigation-valve-config-set-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.13-irrigation-valve-config-set-command.md deleted file mode 100644 index 5a2fec7..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.13-irrigation-valve-config-set-command.md +++ /dev/null @@ -1,108 +0,0 @@ - -# 4.42.13 Irrigation Valve Config Set Command - -This command allows an irrigation valve to be configured accordingly. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE CONFIG SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | -| Nominal Current High Threshold | | | | | | | | | | | | | | | | | | | | | | | | -| Nominal Current Low Threshold | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Flow Precision | | | | | | | | | Maximum Flow Scale=l/h | | | | | | Maximum Flow Size | | | | | | | | | -| Maximum Flow Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Flow Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Flow High Threshold Precision | | | | | | | | | Flow High Threshold Scale=l/h | | | | | | Flow High Threshold Size | | | | | | | | | -| Flow High Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Flow High Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Flow Low Threshold Precision | | | | | | | | | Flow Low Threshold Scale=l/h | | | | | | Flow Low Threshold Size | | | | | | | | | -| Flow Low Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Flow Low Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Usage | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Master Valve (1 bit) - -This field is used to indicate whether the valve to configure is the master valve or a zone valve. - -The value 1 MUST indicate that the valve to configure is the master valve. The value 0 MUST indicate that the valve to configure is the zone valve corresponding to Valve ID field. Valve ID (8 bits) - -This field is used to indicate the Valve ID to configure. - -This field MUST be set to a Valve ID supported by the receiving node. - -If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. - -Nominal Current High Threshold (8 bits) - -This field is used to configure the nominal current high threshold for the actual valve. - -[The receiving node MUST issue an Irrigation System Status Report Command with the System Error](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) Status indicating that a valve is reporting errors when the current crosses above this threshold. - -This field MUST be expressed as a multiple of 10mA. E.g. the value 23 represents 230 mA. - -Nominal Current Low Threshold (8 bits) - -This field is used to configure the nominal current low threshold for the actual valve at the receiving node. - -[The receiving node MUST issue an Irrigation System Status Report Command with the System Error](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) Status indicating that a valve is reporting errors when the current crosses below this threshold. - -This field MUST be expressed as a multiple of 10mA. E.g. the value 23 represents 230 mA. - -Maximum Flow - -These fields are used to configure the maximum allowed water flow for the specified valve. - -These fields MUST be ignored if the Master Valve field is set to 1. A receiving node having no support for flow sensor MAY ignore these fields. - -[If the receiving node supports a flow sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating that a valve is reporting errors when the water flow](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) crosses above this threshold. - -This field MUST be expressed in l/h (liter/hour). - -Flow High Threshold - -These fields are used to configure the flow high threshold for the specified valve. - -These fields MUST be ignored if the Master Valve field is set to 1. A receiving node having no support for flow sensor MAY ignore these fields. - -[If the receiving node supports a flow sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating that a valve is reporting errors when the water flow](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) crosses above this threshold. - -The format of the Flow High Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in l/h (liter/hour). Flow Low Threshold - -These fields are used to configure the flow low threshold for the specified valve. - -These fields MUST be ignored if the Master Valve field is set to 1. A receiving node having no support for flow sensor MAY ignore these fields. - -[If the receiving node supports a flow sensor, the node MUST issue an Irrigation System Status Report Command with the System Error Status indicating that a valve is reporting errors when the water flow](04.42.07-irrigation-system-status-report-command.md#4427-irrigation-system-status-report-command) crosses below this threshold. - -The format of the Flow Low Threshold fields MUST comply with the format used by the Multilevel Sensor Command Class and MUST be expressed in l/h (liter/hour). - -Sensor Usage (8 bits) - -This field is used to configure if the actual valve must turn off / close when the specified sensors are active. - -This field MUST be ignored if the Master Valve field is set to 1. [This field MUST be treated as a bit mask and MUST comply with Table 55.](04.42.13-irrigation-valve-config-set-command.md#44213-irrigation-valve-config-set-command) - -Table 55, Irrigation Valve Config Set::Sensor Usage encoding - -| | Bit | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Use Rain Sensor The valve MUST turn off / close if rain is detected A receiving node having no support for rain sensor MAY ignore this field. | | | -| 1 | | | Use Moisture Sensor The valve MUST turn off / close if moisture is detected A receiving node having no support for moisture sensor MAY ignore this field. | | | -| 2..7 | | | Reserved | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.15-irrigation-valve-config-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.15-irrigation-valve-config-report-command.md deleted file mode 100644 index 75e9040..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.15-irrigation-valve-config-report-command.md +++ /dev/null @@ -1,34 +0,0 @@ - -# 4.42.15 Irrigation Valve Config Report Command - -This command is used to advertise the configuration of a valve. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE CONFIG REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | -| Nominal Current High Threshold | | | | | | | | | | | | | | | | | | | | | | | | -| Nominal Current Low Threshold | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Flow Precision | | | | | | | | | Maximum Flow Scale=l/h | | | | | | Maximum Flow Size | | | | | | | | | -| Maximum Flow Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Flow Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Flow High Threshold Precision | | | | | | | | | Flow High Threshold Scale=l/h | | | | | | Flow High Threshold Size | | | | | | | | | -| Flow High Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Flow High Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Flow Low Threshold Precision | | | | | | | | | Flow Low Threshold Scale=l/h | | | | | | Flow Low Threshold Size | | | | | | | | | -| Flow Low Threshold Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Flow Low Threshold Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Usage | | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.42.13 Irrigation Valve Config Set Command. A sending node MUST comply with field descriptions in 4.42.13 Irrigation Valve Config Set Command.](04.42.13-irrigation-valve-config-set-command.md#44213-irrigation-valve-config-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.16-irrigation-valve-run-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.16-irrigation-valve-run-command.md deleted file mode 100644 index 055c2d0..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.16-irrigation-valve-run-command.md +++ /dev/null @@ -1,43 +0,0 @@ - -# 4.42.16 Irrigation Valve Run Command - -The Irrigation Valve Run Command will run the specified valve for a specified duration. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE RUN _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Master Valve | | | -| Valve ID | | | | | | | | | | | | | | | | | | | | | | | | -| Duration MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Duration LSB | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Master Valve (1 bit) - -This field is used to indicate if the specified valve is the master valve or a zone valve. - -The value 1 MUST indicate that the specified valve is the master valve. The value 0 MUST indicate that the specified valve is the zone valve corresponding to Valve ID field. - -Valve ID (8 bits) - -This field is used to specify the actual Valve ID. - -This field MUST be set to a Valve ID supported by the receiving node. - -If the Master Valve field is set to 1, this field MUST be set to 1. Other values MUST be ignored by a receiving node. - -Duration (16 bits) - -This field is used to specify the duration of the run in seconds. - -The value 0 MUST indicate that the valve MUST be turned off / Closed immediately. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.17-irrigation-valve-table-set-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.17-irrigation-valve-table-set-command.md deleted file mode 100644 index 3c5bfbe..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.17-irrigation-valve-table-set-command.md +++ /dev/null @@ -1,39 +0,0 @@ - -# 4.42.17 Irrigation Valve Table Set Command - -This command is used to set a valve table with a list of valves and durations. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE TABLE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Valve Table ID | | | | | | | | | | | | | | | | | | | | | | | | -| | Valve ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Duration MSB 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Duration LSB 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Valve ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Duration MSB N | | | | | | | | | | | | | | | | | | | | | | | -| | Duration LSB N | | | | | | | | | | | | | | | | | | | | | | | - -Valve Table ID (8 bits) - -This field is used to specify the valve table ID. - -This field MUST be set to a Valve Table ID supported by the receiving node. - -Valve ID and Duration (N * 3 bytes) - -These fields are used to specify valve IDs and their associated run duration. - -A sending node MUST NOT specify more Valve IDs than the “Valve Table Max Size” advertised by a [receiving node in the Irrigation System Info Report Command](04.42.05-irrigation-system-info-report-command.md#4425-irrigation-system-info-report-command) - -The duration MUST be expressed in seconds. - -This field MAY be omitted in order to erase/empty the specified valve table. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.19-irrigation-valve-table-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.19-irrigation-valve-table-report-command.md deleted file mode 100644 index d220d0b..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.19-irrigation-valve-table-report-command.md +++ /dev/null @@ -1,25 +0,0 @@ - -# 4.42.19 Irrigation Valve Table Report Command - -This command provides the contents of the specified Valve Table ID. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE TABLE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Valve Table ID | | | | | | | | | | | | | | | | | | | | | | | | -| | Valve ID 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Duration MSB 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Duration LSB 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Valve ID N | | | | | | | | | | | | | | | | | | | | | | | -| | Duration MSB N | | | | | | | | | | | | | | | | | | | | | | | -| | Duration LSB N | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.42.17 Irrigation Valve Table Set Command. A sending node MUST comply with field descriptions in 4.42.17 Irrigation Valve Table Set Command.](04.42.17-irrigation-valve-table-set-command.md#44217-irrigation-valve-table-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.20-irrigation-valve-table-run-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.20-irrigation-valve-table-run-command.md deleted file mode 100644 index 836de66..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/04.42.20-irrigation-valve-table-run-command.md +++ /dev/null @@ -1,24 +0,0 @@ - -# 4.42.20 Irrigation Valve Table Run Command - -This command is used to run the specified valve tables sequentially. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS IRRIGATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = IRRIGATION VALVE TABLE RUN _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Valve Table ID 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Valve Table ID N | | | | | | | | | | | | | | | | | | | | | | | | - -Valve Table ID (N bytes) - -This field is used to specify the list of Valve Tables to run sequentially. - -A receiving node MUST run the indicated Valve Table ID starting by the entry 1. These fields contain a variable list of valve table IDs that will be run sequentially in the order they are listed. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/index.md b/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/index.md deleted file mode 100644 index 0507df4..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.42-irrigation-command-class-version-1/index.md +++ /dev/null @@ -1,34 +0,0 @@ - -# 4.42 Irrigation Command Class, version 1 - -The Irrigation Command Class provides commands to manage irrigation systems. - -## Contents - -- [4.42.1 Terminology](04.42.01-terminology.md) -- [4.42.2 Compatibility considerations](04.42.02-compatibility-considerations.md) -- [4.42.3 Interoperability considerations](04.42.03-interoperability-considerations.md) -- [4.42.4 Irrigation System Info Get Command](04.42.04-irrigation-system-info-get-command.md) -- [4.42.5 Irrigation System Info Report Command](04.42.05-irrigation-system-info-report-command.md) -- [4.42.6 Irrigation System Status Get Command](04.42.06-irrigation-system-status-get-command.md) -- [4.42.7 Irrigation System Status Report Command](04.42.07-irrigation-system-status-report-command.md) -- [4.42.8 Irrigation System Config Set Command](04.42.08-irrigation-system-config-set-command.md) -- [4.42.9 Irrigation System Config Get Command](04.42.09-irrigation-system-config-get-command.md) -- [4.42.10 Irrigation System Config Report Command](04.42.10-irrigation-system-config-report-command.md) -- [4.42.11 Irrigation Valve Info Get Command](04.42.11-irrigation-valve-info-get-command.md) -- [4.42.12 Irrigation Valve Info Report Command](04.42.12-irrigation-valve-info-report-command.md) -- [4.42.13 Irrigation Valve Config Set Command](04.42.13-irrigation-valve-config-set-command.md) -- [4.42.14 Irrigation Valve Config Get Command](04.42.14-irrigation-valve-config-get-command.md) -- [4.42.15 Irrigation Valve Config Report Command](04.42.15-irrigation-valve-config-report-command.md) -- [4.42.16 Irrigation Valve Run Command](04.42.16-irrigation-valve-run-command.md) -- [4.42.17 Irrigation Valve Table Set Command](04.42.17-irrigation-valve-table-set-command.md) -- [4.42.18 Irrigation Valve Table Get Command](04.42.18-irrigation-valve-table-get-command.md) -- [4.42.19 Irrigation Valve Table Report Command](04.42.19-irrigation-valve-table-report-command.md) -- [4.42.20 Irrigation Valve Table Run Command](04.42.20-irrigation-valve-table-run-command.md) -- [4.42.21 Irrigation System Shutoff Command](04.42.21-irrigation-system-shutoff-command.md) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.43-language-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.43-language-command-class-version-1.md deleted file mode 100644 index 2d9e8ef..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.43-language-command-class-version-1.md +++ /dev/null @@ -1,81 +0,0 @@ - -# 4.43 Language Command Class, version 1 - -The Language Command Class is used to specify the language settings on a device. - -## 4.43.1 Language Set Command - -This command is used to set the language at the receiving node. The receiving node SHOULD use the default language in case the received language is not supported. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS LANGUAGE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = LANGUAGE SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Language 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Language 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Language 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Country 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Country 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Language (24 bits) - -The code definition of the languages may be found in ISO 639-2:1998 ‘Codes for the representation of names of languages – Part 2: Alpha-3 code’. In the table below are some examples of the alpha-3 codes listed: - -| | Language | | | Language 1 | | | Language 2 | | | Language 3 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| English | | | e | | | n | | | g | | | -| Flemish; Dutch | | | d | | | u | | | t | | | -| French | | | f | | | r | | | e | | | -| German | | | g | | | e | | | r | | | -| Italian | | | i | | | t | | | a | | | -| Polish | | | p | | | o | | | l | | | -| Russian | | | r | | | u | | | s | | | -| Walloon | | | w | | | l | | | n | | | - -Country (16 bits) - -The code definition of the countries may be found in ISO 3166-1 ‘Country Codes: Alpha-2 codes’. The use of the country field is OPTIONAL and only defined in case it is necessary for distinguishing geographical variants. The number of data fields transmitted MUST be determined from the length field in the frame. In the table below are some examples of the alpha-2 codes listed: - -| | Language | | | Country 1 | | | Country 2 | -| --- | --- | --- | --- | --- | --- | --- | --- | -| Belgium | | | B | | | E | | -| Italy | | | I | | | T | | -| Netherlands | | | N | | | L | | -| Poland | | | P | | | L | | -| United Kingdom | | | G | | | B | | -| United States | | | U | | | S | | - -## 4.43.2 Language Get Command - -This command is used to request the current language setting in a device. - -The Language Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS LANGUAGE _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = LANGUAGE GET _ | | | | | | | | | | | | | | | | | | | | | | | - -## 4.43.3 Language Report Command - -This commandreturns the current language setting in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS LANGUAGE _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = LANGUAGE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | -| Language 1 | | | | | | | | | | | | | | | | | | | | | | | -| Language 2 | | | | | | | | | | | | | | | | | | | | | | | -| Language 3 | | | | | | | | | | | | | | | | | | | | | | | -| Country 1 | | | | | | | | | | | | | | | | | | | | | | | -| Country 2 | | | | | | | | | | | | | | | | | | | | | | | - -[For fields’ description, refer to 4.43.1 Language Set Command.](04.43-language-command-class-version-1.md#4431-language-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.44-lock-command-class-version-1-deprecated.md b/docs/specs/command-class-specification/04-command-class-definitions/04.44-lock-command-class-version-1-deprecated.md deleted file mode 100644 index 9b17053..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.44-lock-command-class-version-1-deprecated.md +++ /dev/null @@ -1,55 +0,0 @@ - -# 4.44 Lock Command Class, version 1 [DEPRECATED] - -THIS COMMAND CLASS HAS BEEN DEPRECATED - -A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Door Lock Command Class. If implementing this command class, it is RECOMMENDED that the Door Lock Command Class is also implemented. - -The Lock Command Class is used to lock and unlock a “lock” type device, e.g. a door or window lock - -## 4.44.1 Lock Set Command - -This command is used to set the lock state in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS LOCK _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = LOCK SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Lock State | | | | | | | | | | | | | | | | | | | | | | | | - -Lock State (8 bits) - -The lock state field used to set the lock state of the device. The value 0 indicates that the device is unlocked. The value 1 indicates that the device is locked. - -## 4.44.2 Lock Get Command - -This command is used to request the lock state from a device. - -The Lock Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS LOCK _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = LOCK GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.44.3 Lock Report Command - -This command is used to report the lock state of a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS LOCK _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = LOCK REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Lock State | | | | | | | | | | | | | | | | | | | | | | | | - -Lock State (8 bits) - -The Lock state field used to report the lock state of the device. The value 0 indicates that the device is unlocked. The value 1 indicates that the device is locked. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.46-meter-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.46-meter-command-class-version-1.md deleted file mode 100644 index ee9827c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.46-meter-command-class-version-1.md +++ /dev/null @@ -1,93 +0,0 @@ - -# 4.46 Meter Command Class, version 1 - -The Meter Command Class defines the Commands necessary to read accumulated values in physical units from a water meter or metering device (gas, electric etc.) and thereby enabling automatic meter reading capabilities. - -Automatic meter reading (AMR), is the technology of automatically collecting data from water meter or energy metering devices and transferring that data to a central database for billing and/or analyzing. - -## 4.46.1 Terminology - -A meter is used to monitor a resource. The meter accumulates the resource flow over time. As an option, the meter may report not only the most recent accumulated reading but also the previous reading and the time that elapsed since then. A meter may also be able to report the current resource flow. This is known as the instant value. - -Meters may report two rate types. A utility installs production meters in its production facilities, while it installs consumption meters at consumer premises. The difference is the mapping of the physical flow direction to the forward direction of the meter: - - The accumulated value of a production meter grows when more resources are produced  The accumulated value of a production meter drops when more resources are consumed - - The accumulated value of a consumption meter grows when more resources are consumed  The accumulated value of a consumption meter drops when more resources are produced - -If a meter only supports one rate type, the meter may run backwards. If a meter runs backwards, the accumulated value may eventually become negative. While the production meter of a power generator rarely runs backwards, the consumption meter in a private household with solar panels runs backwards every time the solar panels deliver more than is consumed in the household. The actual reading of a one-rate type meter reflects the net accumulated value since the meter was installed with a factory default reading of zero. The accumulated value over an arbitrary interval may be calculated by subtracting a previous accumulated value from the current accumulated value. Normal arithmetic rules ensure that this also works in case of negative values. - -A production meter may be used as a consumption meter by applying a sign change to all production meter readings before using the values as consumption meter readings. - -A meter device may advertise that it implements two separate registers for the production and consumption, respectively. In that case, both of these meters are always running forward: Production makes the production meter run forward while consumption makes the consumption meter run forward. Two meter reports must be used to report the values of the respective meters. - -## 4.46.2 Meter Get Command - -The Meter Get Command is used to request the accumulated consumption in physical units from a metering device. - -The Meter Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.46.3 Meter Report Command - -The Meter Report Command is used to advertise a meter reading. - -This command MUST NOT be transmitted using broadcast. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Type | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Meter Type (8 bits) - -Meter Type specifies what type of metering device this Command originates from. This field MUST be [encoded according to Table 56.](04.46-meter-command-class-version-1.md#4463-meter-report-command) - -Table 56, Meter Report::Meter Type encoding - -| | Value | | | Meter Type | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x01 | | | Electric meter | | | 1 | | | -| 0x02 | | | Gas meter | | | 1 | | | -| 0x03 | | | Water meter | | | 1 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Precision (3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -The value of the precision field MUST be in the range 0..7. - -Scale (2 bits) - -The Scale field MUST advertise the unit used for this report. This field MUST be encoded according to [Table 65.](04.50-meter-command-class-version-5.md#4503-meter-report-command) - -Size (3 bits) - -The size field indicates the number of bytes that used for the meter value. This field can take values from 1 (001b), 2 (010b) or 4 (100b). - -Meter Value (N bytes) - -The Meter Value is a signed field. The field MAY be 1, 2 or 4 bytes in size. The first byte is the most significant byte. - -[The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -The metering device receiving the Meter Report MUST always show the value even though the Metering Device Type and/or Scale are not supported - -A controlling node SHOULD implement the capability to update its list of Meter Type and Scales, so that new Meter Types and scales added in more recent versions are not presented as unknown. If a controlling node receives an unknown Meter Type or Scale, it SHOULD allow the user to assign a free- text description to that Meter reading diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.47-meter-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.47-meter-command-class-version-2.md deleted file mode 100644 index 765b89c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.47-meter-command-class-version-2.md +++ /dev/null @@ -1,246 +0,0 @@ - -# 4.47 Meter Command Class, version 2 - -The Meter Command Class is intended for devices capable of reporting energy measurements in addition to any main functionality or features e.g. an appliance module reporting the current consumption of the connected load. This command class is not intended for residential utility sub-metering such as a water meter counting total consumption. - -Meter Command Class (version 2) is improved with the following functionalities: - - Commands to interview the device for supported Meter types  New field ‘Previous Meter Value’ added to the Meter Report to allow for easy calculation of consumption since previous measurement  Reset of accumulated consumption  Add capability to communicate current consumption (W)  ‘Scale’ entry for pulse meters along with W, kVAh and Cubic feet - -The commands not mentioned are the same as specified for Meter Command Class (Version 1). - -## 4.47.1 Meter Supported Get Command - -This command is used to request the supported scales in a sub meter. - -The Meter Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | 6 | | | 5 | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | -| Command = METER SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | - -## 4.47.2 Meter Supported Report Command - -This command is used to advertise supported scales in a sub meter. - -| | 7 | 6 | | | 5 | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | -| Command = METER SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | -| Meter Reset | | Reserved | | | | Meter Type | | | | | | | | | | | | | | -| Reserved | | | | | | | | Scale Supported | | | | | | | | | | | | - -Meter Reset (1 bit) - -The Meter Reset field set to “1” indicates support for the Meter Reset Command. - -Meter Type (5 bits) - -See Meter Type defined in Meter Report Command. - -Scale Supported (4 bits) - -This field MUST advertise the supported scales of the device. The field MUST be formatted and interpreted as a bitmask. The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. - -The Scale Supported bitmask MUST be interpreted in combination with the Meter Type. - -Table 57, Meter Supported Report v2::Scale Supported encoding - -| | Meter Type | | | Scale | | | Scale Supported Bit position | | | Measurement mode | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Electric meter | | | kWh | | | Bit 0 | | | Accumulated | | | -| | | | kVAh | | | Bit 1 | | | Accumulated | | | -| | | | W | | | Bit 2 | | | Instant | | | -| | | | Pulse count | | | Bit 3 | | | Accumulated | | | -| Gas meter | | | Cubic meters | | | Bit 0 | | | Accumulated | | | -| | | | Cubic feet | | | Bit 1 | | | Accumulated | | | -| | | | Reserved | | | Bit 2 | | | n/a | | | -| | | | Pulse count | | | Bit 3 | | | Accumulated | | | -| Water meter | | | Cubic meters | | | Bit 0 | | | Accumulated | | | -| | | | Cubic feet | | | Bit 1 | | | Accumulated | | | -| | | | US gallons | | | Bit 2 | | | Accumulated | | | -| | | | Pulse count | | | Bit 3 | | | Accumulated | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.47.3 Meter Reset Command - -The Meter Reset Command is used to reset ALL accumulated values stored in the meter device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER RESET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.47.4 Meter Get Command - -The Meter Get Command is used to request a device supported measurement in physical units from a metering device. - -The Meter Report Command MUST be returned in response to this command if the requested scale is supported. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Scale | | | | | | Reserved | | | | | | | | | - -Scale (2 bits) - -See description of Meter Report Command. - -If the Scale is not present (v1) or set to 0x00, a receiving node MUST return a Report using its default scale. A Meter Get Command containing a non-supported Scale MUST be ignored by a receiving device. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -### 4.47.4.1 Backwards compatibility - -When devices supporting Meter Command Class (Version 1) receives a Meter Get Command of Version 2 it MUST report its implemented scale. - -The manufacturer MUST define which scale is the default scale and it MUST be described in the product manual. - -## 4.47.5 Meter Report Command - -The Meter Report Command is used to advertise a meter reading. - -The Meter Report Command MUST NOT be transmitted using broadcast. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reser- ved | | | Rate Type | | | | | | Meter Type | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Type (2 bits) - -Rate Type specifies if it is import or export values to be read. Setting the Rate Type to Import on the Meter Report Command is an indication that the Meter Value is a consumed measurement. In contrary when the Rate Type is set to Export the indication of the Meter Value is a produced measurement. - -[This field MUST be encoded according to Table 58.](04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Table 58, Meter Report::Rate Type encoding - -| | Value | | | Rate Type | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved | | | -| 0x01 | | | Import (consumed) | | | -| 0x02 | | | Export (produced) | | | -| 0x03 | | | Reserved | | | - -Meter Type (5 bits) - -Meter Type specifies what type of metering device this command originates from. This field MUST be [encoded according to Table 56.](04.46-meter-command-class-version-1.md#4463-meter-report-command) Precision (3 bits) - -The Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 1 MUST be interpreted as 102.5 and if precision is 3 the interpreted value is 1.025. - -Scale (2 bits) - -The Scale field field MUST advertise the unit used for this report. This field MUST be encoded according [to Table 65.](04.50-meter-command-class-version-5.md#4503-meter-report-command) - -Size (3 bits) - -The Size field MUST advertise the number of bytes that is used for the Meter Value. The value of the Size field MUST be in the range (1,2,4). All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Meter Value (N bytes) - -The Meter Value field is a signed field. The Meter Value field MUST have the size advertised by the Size field. The first byte is the most significant byte. - -[The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -Delta Time (16 bits) - -The Delta Time field MUST advertise the elapsed time in seconds between the ‘Meter Value’ and the ‘Previous Meter Value’ measurements. Values MUST be in the range 0 to 65536 seconds. - -Table 59, Meter Report v2::Delta Time encoding - -| | Delta Time | | | Value | | -| --- | --- | --- | --- | --- | --- | -| No Previous Meter Value field included in the Meter Report | | | 0x0000 | | | -| 1 sec. between Meter Value and Previous Meter Value measurements | | | 0x0001 | | | -| … | | | … | | | -| 65534 sec. between Meter Value and Previous Meter Value measurements | | | 0xFFFE | | | -| Unknown time between Meter Value and Previous Meter Value measurements | | | 0xFFFF | | | - -If the Delta Time is 0, the Previous Meter Value field MUST be omitted. - -Previous Meter Value (N bytes) - -The Previous Meter Value MUST be omitted if the Delta Time field is set to the value 0. The Previous Meter Value MUST be included if the Delta Time field is set to a non-zero value. - -The Previous Meter Value field MUST have the same size and format as the Meter Value field. Refer to the description of the Meter Value field. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -### 4.47.5.1 Examples - -To retrieve accumulated power consumption from a device supporting Meter Command Class (Version 2), the Meter Get Command has to indicate what scale is requested. - -| | 7 | 6 | | | 5 | 4 | | | 3 | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | -| 0x01 (METER GET) _ | | | | | | | | | | | | | | | | | | | -| 0 | | | | | | 0 (kWh) | | | | | 0 | | | | | | | | - -As a response to the above Meter Get Command an example of accumulated power consumption can be reported with the below Meter Report indicating a current measurement of 12065.298 kWh and 10 minutes ago the previous measurement was 12060.678 kWh. - -| | 7 | 6 | | | 5 | 4 | | | 3 | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | -| 0x02 (METER REPORT) _ | | | | | | | | | | | | | | | | | | | -| 0 | | 2 (export) | | | | 0 (Electric meter) | | | | | | | | | | | | | -| 3 (3 decimals) | | | | | | 0 (kWh) | | | | 4 (4 bytes) | | | | | | | | | -| 0x00 (Meter Value 1) | | | | | | | | | | | | | | | | | | | -| 0xB8 (Meter Value 2) | | | | | | | | | | | | | | | | | | | -| 0x1A (Meter Value 3) | | | | | | | | | | | | | | | | | | | -| 0x12 (Meter Value 4) | | | | | | | | | | | | | | | | | | | -| 0x02 (Delta Time 1) | | | | | | | | | | | | | | | | | | | -| 0x58 (Delta Time 2) | | | | | | | | | | | | | | | | | | | -| 0x00 (Previous Meter Value 1) | | | | | | | | | | | | | | | | | | | -| 0xB8 (Previous Meter Value 2) | | | | | | | | | | | | | | | | | | | -| 0x08 (Previous Meter Value 3) | | | | | | | | | | | | | | | | | | | -| 0x06 (Previous Meter Value 4) | | | | | | | | | | | | | | | | | | | - -To retrieve instant power consumption from a device supporting Meter Command Class (Version 2), the Meter Get Command MUST indicate what scale is requested. - -| | 7 | 6 | | | 5 | 4 | | | 3 | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | -| 0x01 (METER GET) _ | | | | | | | | | | | | | | | | | | | -| 0 | | | | | | 2 (W) | | | | | 0 | | | | | | | | - -An example of instant power consumption can be reported with the below Meter Report indicating a current measurement of 39.99 W. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | | | | | -| 0x02 (METER REPORT) _ | | | | | | | | | | | | | | | | | | | | | | | -| 0 | | | 2 (export) | | | | | | 0 (Electric meter) | | | | | | | | | | | | | | -| 2 (2 decimals) | | | | | | | | | 2 (W) | | | | | | 2 (2 bytes) | | | | | | | | -| 0x0F (Meter Value 1) | | | | | | | | | | | | | | | | | | | | | | | -| 0x9F (Meter Value 2) | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Delta Time 1) | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Delta Time 2) | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.48-meter-command-class-version-3.md b/docs/specs/command-class-specification/04-command-class-definitions/04.48-meter-command-class-version-3.md deleted file mode 100644 index d258268..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.48-meter-command-class-version-3.md +++ /dev/null @@ -1,186 +0,0 @@ - -# 4.48 Meter Command Class, version 3 - -The Meter Command Class is intended for Z-Wave enabled devices capable of reporting energy measurements in addition to any main functionality or features e.g. an appliance module reporting the current consumption of the connected load. This command class is not intended for residential utility sub- metering such as a water meter counting total consumption. - -Meter Command Class (Version 3) is improved with the following functionalities: - - ‘Scale’ entry has been enlarged to support 8 scales - -The commands not mentioned are the same as specified for Meter Command Class (Version 2). - -## 4.48.1 Meter Supported Report Command - -This command is used to advertise supported scales in a sub meter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Reset | | | Reserved | | | | | | Meter Type | | | | | | | | | | | | | | | -| Scale Supported | | | | | | | | | | | | | | | | | | | | | | | | - -Meter Reset (1 bit) - -The Meter Reset field set to “1” indicates support for the Meter Reset Command. - -Meter Type (5 bits) - -See Meter Type defined in Meter Report Command. Scale Supported (8 bits) - -This field is used to advertise the supported scales by the sending node. - -[The field MUST be treated as a bitmask and MUST be encoded according to Table 63.](04.50-meter-command-class-version-5.md#4502-meter-supported-report-command) - -The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. - -The Scale Supported bitmask MUST be interpreted in combination with the Meter Type. - -## 4.48.2 Meter Get Command - -This command is used to request a device supported measurement in physical units from a metering device. - -The Meter Report Command MUST be returned in response to this command if the requested scale is supported. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | Scale | | | | | | | | | Reserved | | | | | | | | | - -Scale (3 bits) - -See description of Meter Report Command. - -If the Scale is not present (v1) or set to 0x00, a receiving node MUST return a Report using its default scale. - -A Meter Get Command containing a non-supported Scale MUST be ignored by a receiving device. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -### 4.48.2.1 Backwards compatibility - -The manufacturer MUST define which scale is the default scale and it MUST be described in the product manual. The default scale MUST be in the range 0..3 as Version 1 and 2 devices will not be able to interpret Scale values in the range 4..7. - -## 4.48.3 Meter Report Command - -This command is used to advertise a meter reading. - -The Meter Report Command MUST NOT be transmitted using broadcast. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scale (2) | | | Rate Type | | | | | | Meter Type | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale (1:0) | | | | | | Size | | | | | | | | | -| Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Type (2 bits) - -Rate Type specifies if it is import or export values to be read. Setting the Rate Type to Import on the Meter Report Command is an indication that the Meter Value is a consumed measurement. In contrary when the Rate Type is set to Export the indication of the Meter Value is a produced measurement. - -[This field MUST be encoded according to Table 58.](04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Meter Type (5 bits) - -Meter Type specifies what type of metering device this command originates from. This field MUST be [encoded according to Table 56.](04.46-meter-command-class-version-1.md#4463-meter-report-command) - -Precision (3 bits) - -The Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 1 MUST be interpreted as 102.5 and if precision is 3 the interpreted value is 1.025. - -The value of the precision field MUST be in the range 0..7. Scale (3 bits) - -The Scale field field MUST advertise the unit used for this report. The Scale field is composed of two sub-fields Scale (2) and Scale (1:0) which MUST be composed and interpreted as one unit. - -[This field MUST be encoded according to Table 65.](04.50-meter-command-class-version-5.md#4503-meter-report-command) - -Size (3 bits) - -The Size field MUST advertise the number of bytes that is used for the Meter Value. The value of the Size field MUST be in the range (1,2,4). All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Meter Value (N bytes) - -The Meter Value field is a signed field. The Meter Value field MUST have the size advertised by the Size field. The first byte MUST be the most significant byte. - -[The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -Delta Time (16 bits) - -The Delta Time field MUST advertise the elapsed time in seconds between the ‘Meter Value’ and the ‘Previous Meter Value’ measurements. - -[This field MUST comply with Table 59.](04.47-meter-command-class-version-2.md#4475-meter-report-command) - -If the Delta Time is 0, the Previous Meter Value field MUST be omitted. - -Previous Meter Value (N bytes) - -The Previous Meter Value MUST be omitted if the Delta Time field is set to the value 0. The Previous Meter Value MUST be included if the Delta Time field is set to a non-zero value. - -The Previous Meter Value field MUST have the same size and format as the Meter Value field. Refer to the description of the Meter Value field. - -### 4.48.3.1 Examples of Meter Report Commands - -To retrieve Instant Voltage from a device supporting Meter Command Class (Version 3), the Meter Get Command has to indicate what scale is requested. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0x01 (METER GET) _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0 | | | | | | 4 (V) | | | | | | | | | 0 | | | | | | | | | - -As a response to the above Meter Get Command an example of instant Voltage can be reported with the below Meter Report indicating a current measurement of 108.5 V and 10 minutes ago the previous measurement was 109.1V. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0x02 (METER REPORT) _ | | | | | | | | | | | | | | | | | | | | | | | | -| 1 (V) | | | 2 (export) | | | | | | 0 (Electric meter) | | | | | | | | | | | | | | | -| 1 (1 decimals) | | | | | | | | | 0 (V) | | | | | | 4 (4 bytes) | | | | | | | | | -| 0x00 (Meter Value 1) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Meter Value 2) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x04 (Meter Value 3) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x3D (Meter Value 4) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x02 (Delta Time 1) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x58 (Delta Time 2) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Previous Meter Value 1) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Previous Meter Value 2) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x04 (Previous Meter Value 3) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x43 (Previous Meter Value 4) | | | | | | | | | | | | | | | | | | | | | | | | - -To retrieve instant power consumption from a device supporting Meter Command Class (Version 2), the Meter Get Command has to indicate what scale is requested. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0x01 (METER GET) _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0 | | | | | | | | | 2 (W) | | | | | | 0 | | | | | | | | | - -An example of instant power consumption can be reported with the below Meter Report indicating a current measurement of 39.99 W. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x32 (COMMAND CLASS METER) _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0x02 (METER REPORT) _ | | | | | | | | | | | | | | | | | | | | | | | | -| 0 | | | 2 (export) | | | | | | 0 (Electric meter) | | | | | | | | | | | | | | | -| 2 (2 decimals) | | | | | | | | | 2 (W) | | | | | | 2 (2 bytes) | | | | | | | | | -| 0x0F (Meter Value 1) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x9F (Meter Value 2) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Delta Time 1) | | | | | | | | | | | | | | | | | | | | | | | | -| 0x00 (Delta Time 2) | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.49-meter-command-class-version-4.md b/docs/specs/command-class-specification/04-command-class-definitions/04.49-meter-command-class-version-4.md deleted file mode 100644 index 444e05a..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.49-meter-command-class-version-4.md +++ /dev/null @@ -1,216 +0,0 @@ - -# 4.49 Meter Command Class, version 4 - -The Meter Command Class is intended for Z-Wave enabled devices capable of reporting energy measurements in addition to any main functionality or features e.g. an appliance module reporting the current consumption of the connected load. This command class is not intended for residential utility metering such as a water meter counting total consumption. - -Meter Command Class, Version 4 is improved with the following functionalities: - - The Rate Type is included in the Meter Supported Report and the Meter Get Command  Added support for Meter Scale Types kVar and kVarh - -The commands not mentioned are the same as specified for Meter Command Class, Version 3. - -## 4.49.1 Meter Supported Report Command - -This command is used to advertise supported capabilities of a sub meter. - -| | 7 | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Meter Reset | | | Rate Type | | | | | Meter Type | | | | | | | | | | | | | | | -| M.S.T | | | Scale Supported “Byte 1” | | | | | | | | | | | | | | | | | | | | -| Number of Scale Supported Bytes to Follow (Version 4 Extension) | | | | | | | | | | | | | | | | | | | | | | | -| Scale Supported 1 “Byte 2” | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | -| Scale Supported N “Byte N+1” | | | | | | | | | | | | | | | | | | | | | | | - -Meter Reset (1 bit) - -The Meter Reset field set to “1” indicates support for the Meter Reset Command. Rate Type (2 bits) - -Rate Type specifies if import and export consumption is supported. Import is an indication that the Meter Value is a consumed measurement and Export is an indication that the Meter Value is a produced measurement. - -[This field MUST be encoded according to Table 60.](04.49-meter-command-class-version-4.md#4491-meter-supported-report-command) - -Table 60, Meter Supported Report::Rate Type encoding - -| | Value | | | Rate Type | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved | | | 1 | | | -| 0x01 | | | Import only (consumed) | | | 1 | | | -| 0x02 | | | Export only (produced) | | | 1 | | | -| 0x03 | | | Both Import and Export | | | 4 | | | - -Meter Type (5 bits) - -See Meter Type defined in Meter Report Command. - -Scale Supported (7 bits) - -This field is used to advertise the supported scales by the sending node. - -[The field MUST be treated as a bitmask and MUST be encoded according to Table 63.](04.50-meter-command-class-version-5.md#4502-meter-supported-report-command) - -The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. - -The Scale Supported bitmask MUST be interpreted in combination with the Meter Type. - -M.S.T. (More Scale Types) (1 bit) - -This bit MUST be set to ‘1’ when more than one Scale Supported byte is carried in the Meter Supported Report. In this case the Number of Scale Supported Bytes to Follow field MUST advertise the total number of Scale Supported Bytes. The bitmask of the following Scale Supported Bytes is described in the table of Scale Supported. - -The M.S.T bit MUST be set to ‘0’ if the Meter Supported Report only carries the Scale Supported “Byte 1” field. In this case the report MUST NOT include the “Number of Scale Supported Bytes to Follow” field or any “Scale Supported Bytes 1 – N” fields. - -Number of Scale Supported to Follow (8 bits) - -The number of Scale Supported Bytes to follow. Scale Supported (bytes 2..N+1) (N bytes) - -These fields MUST advertise the supported scales of the device not covered by byte 1. The fields MUST be formatted and interpreted as bitmasks. The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. - -[The Scale Supported bitmask MUST be interpreted in combination with the Meter Type. Refer to to Table 63.](04.50-meter-command-class-version-5.md#4502-meter-supported-report-command) - -## 4.49.2 Meter Get Command - -This command is used to request a device supported measurement in physical units from a metering device. - -The Meter Report Command MUST be returned in response to this command if the requested scale and rate type are supported. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Type | | | | | | Scale | | | | | | | | | Reserved | | | | | | | | | -| Scale 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Type (2 bits) - -Rate Type specifies if it is import or export values to be requested. Import is an indication that the Meter Value is a consumed measurement and Export is an indication that the Meter Value is a produced measurement. If both Import and Export is needed, two Meter Get Commands must be send. - -Table 61, Meter Get v4::Rate Type encoding - -| | Value | | | Rate Type | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved | | | -| 0x01 | | | Import (consumed) | | | -| 0x02 | | | Export (produced) | | | -| 0x03 | | | Not to be used | | | - -Reserved values MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -If the Rate Type is not present (v1-v3) or set to 0x00, a receiving node MUST return a Report using its default Rate Type. - -Scale (3 bits) - -See description of Meter Report Command. This field MUST specify the scale of the requested meter report. The Scale Value 7 MUST be used to indicate that the scale of the requested meter reading is advertised by the Scale 2 field. - -For valid Scale values, refer to the Meter Report Command V4. - -If the Scale is not present (v1) or set to 0x00, a receiving node MUST return a Report using its default scale. - -A Meter Get Command containing a non-supported Scale MUST be ignored by a receiving device. - -Scale 2 (8 bits) - -The Scale 2 field MUST be appended to the Meter Get Command if the Scale field is set to 7 (M.S.T). The Scale 2 field MUST NOT be appended to the Meter Get Command if the Scale field carries any other value than 7. - -For valid Scale 2 values, refer to the Meter Report Command V4. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -### 4.49.2.1 Backwards compatibility - -The manufacturer MUST define which scale and rate type are the default and it MUST be described in the product manual. The default scale MUST be in the range 0..3 as Version 1 and 2 devices will not be able to interpret Scale values in the range 4..7. - -## 4.49.3 Meter Report Command - -The Meter Report Command is used to advertise a meter reading. - -The Meter Report Command MUST NOT be transmitted using broadcast. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scale (2) | | | Rate Type | | | | | | Meter Type | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale (1:0) | | | | | | Size | | | | | | | | | -| Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Scale 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Type (2 bits) - -Rate Type specifies if it is import or export values to be read. Setting the Rate Type to Import on the Meter Report Command is an indication that the Meter Value is a consumed measurement. In contrary when the Rate Type is set to Export the indication of the Meter Value is a produced measurement. - -[This field MUST be encoded according to Table 58.](04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Meter Type (5 bits) - -Meter Type specifies what type of metering device this command originates from. This field MUST be [encoded according to Table 56.](04.46-meter-command-class-version-1.md#4463-meter-report-command) - -Precision (3 bits) - -The Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 1 must be interpreted as 102.5 and if precision is 3 the interpreted value is 1.025. - -The value of the precision field MUST be in the range 0..7. Scale (3 bits) - -The Scale field MUST advertise the unit used for this report. The Scale field is composed of two sub- fields Scale (2) and Scale (1:0) which MUST be composed and interpreted as one unit. - -[This field MUST be encoded according to Table 65.](04.50-meter-command-class-version-5.md#4503-meter-report-command) - -The Scale Value 7 MUST be used to indicate that the scale of the advertised meter reading is advertised through the Scale 2 field. - -Size (3 bits) - -The Size field MUST advertise the number of bytes that is used for the Meter Value. The value of the Size field MUST be in the range (1,2,4). All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Meter Value (N bytes) - -The Meter Value field is a signed field. The Meter Value field MUST have the size advertised by the Size field. The first byte is the most significant byte. - -[The field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -Delta Time (16 bits) - -The Delta Time field MUST advertise the elapsed time in seconds between the ‘Meter Value’ and the ‘Previous Meter Value’ measurements. - -[This field MUST comply with Table 59](04.47-meter-command-class-version-2.md#4475-meter-report-command) - -If the Delta Time is 0, the Previous Meter Value field MUST be omitted. - -Previous Meter Value (N bytes) - -The Previous Meter Value MUST be omitted if the Delta Time field is set to the value 0. The Previous Meter Value MUST be included if the Delta Time field is set to a non-zero value. - -The Previous Meter Value field MUST have the same size and format as the Meter Value field. Refer to the description of the Meter Value field. Scale 2 (8 bits) - -The Scale 2 field MUST be appended to the Meter Report Command if the Scale field is set to 7 (M.S.T). The Scale 2 field MUST NOT be appended to the Meter Report Command if the Scale field carries any other value than 7. - -[Table 62 shows valid Scale 2 values.](04.49-meter-command-class-version-4.md#4493-meter-report-command) - -Table 62, Meter Report v4::Scale 2 encoding - -| | Meter Type | | | Scale | | | Value | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Electric meter | | | kVar | | | 0x00 | | | -| | | | kVarh | | | 0x01 | | | -| | | | Reserved | | | 0x02 – 0xFF | | | -| Gas meter | | | Reserved | | | 0x00 – 0xFF | | | -| Water meter | | | Reserved | | | 0x00 – 0xFF | | | - -Reserved values MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.50-meter-command-class-version-5.md b/docs/specs/command-class-specification/04-command-class-definitions/04.50-meter-command-class-version-5.md deleted file mode 100644 index 2fa2a12..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.50-meter-command-class-version-5.md +++ /dev/null @@ -1,146 +0,0 @@ - -# 4.50 Meter Command Class, version 5 - -The Meter Command Class is intended for Z-Wave enabled devices capable of reporting cumulated energy measurements e.g. an appliance module reporting the current consumption of the connected load. - -This command class is not intended for residential utility metering such as a water meter counting total consumption. - -## 4.50.1 Compatibility considerations - -Meter Command Class, version 5 adds support for Heating and Cooling Meter types. - -The Meter Command Class, version 5 is backwards compatible with version 4. A node supporting the Meter Command Class, version 5 MUST also support Meter Command Class, version 4. - -Commands and fields not described in this version MUST remain unchanged from version 4. - -## 4.50.2 Meter Supported Report Command - -This command is used to advertise supported capabilities of a sub meter. - -| | 7 | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Meter Reset | | | Rate Type | | | | | Meter Type | | | | | | | | | | | | | | | -| M.S.T | | | Scale Supported “Byte 1” | | | | | | | | | | | | | | | | | | | | -| Number of Scale Supported Bytes to Follow (Version 4 Extension) | | | | | | | | | | | | | | | | | | | | | | | -| Scale Supported 1 “Byte 2” | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | -| Scale Supported N “Byte N+1” | | | | | | | | | | | | | | | | | | | | | | | - -All fields not described below remain unchanged from version 4. Scale Supported (7 bits) - -This field is used to advertise the supported scales by the sending node. - -[The field MUST be treated as a bitmask and MUST be encoded according to Table 63.](04.50-meter-command-class-version-5.md#4502-meter-supported-report-command) - -The bit value ‘1’ MUST indicate support for the actual scale. The bit value ‘0’ MUST indicate that there is no support for the actual scale. - -The Scale Supported bitmask MUST be interpreted in combination with the Meter Type. - -Table 63, Meter Supported Report::Scale Supported Bitmask encoding - -| | Meter | | Scale | | Scale Supported | | | Scale Supported | | | Measurement | | Version | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | Type | | | | Byte number | | | Bit position | | | mode | | | -| Electric meter | | | kWh | Byte 1 | | | Bit 0 | | | Accumulated | | | 1 | -| | | | kVAh | Byte 1 | | | Bit 1 | | | Accumulated | | | 2 | -| | | | W | Byte 1 | | | Bit 2 | | | Instant | | | 2 | -| | | | Pulse count | Byte 1 | | | Bit 3 | | | Accumulated | | | 2 | -| | | | V | Byte 1 | | | Bit 4 | | | Instant | | | 3 | -| | | | A | Byte 1 | | | Bit 5 | | | Instant | | | 3 | -| | | | Power factor | Byte 1 | | | Bit 6 | | | Instant | | | 3 | -| | | | kVar | Byte 2 | | | Bit 0 | | | Instant | | | 4 | -| | | | kVarh | Byte 2 | | | Bit 1 | | | Accumulated | | | 4 | -| | | | Reserved | Byte 2 | | | Bit 2-7 | | | Reserved | | | - | -| Gas meter | | | Cubic meters | Byte 1 | | | Bit 0 | | | Accumulated | | | 1 | -| | | | Cubic feet | Byte 1 | | | Bit 1 | | | Accumulated | | | 2 | -| | | | Reserved | Byte 1 | | | Bit 2 | | | n/a | | | - | -| | | | Pulse count | Byte 1 | | | Bit 3 | | | Accumulated | | | 2 | -| | | | Reserved | Byte 1 | | | Bit 4-6 | | | Reserved | | | - | -| | | | Reserved | Byte 2 | | | Bit 0-7 | | | Reserved | | | - | -| Water meter | | | Cubic meters | Byte 1 | | | Bit 0 | | | Accumulated | | | 1 | -| | | | Cubic feet | Byte 1 | | | Bit 1 | | | Accumulated | | | 1 | -| | | | US gallons | Byte 1 | | | Bit 2 | | | Accumulated | | | 1 | -| | | | Pulse count | Byte 1 | | | Bit 3 | | | Accumulated | | | 2 | -| | | | Reserved | Byte 1 | | | Bit 4-6 | | | Reserved | | | - | -| | | | Reserved | Byte 2 | | | Bit 0-7 | | | Reserved | | | - | -| Heating meter | | | kWh | Byte 1 | | | Bit 0 | | | Accumlated | | | 5 | -| Cooling meter | | | kWh | Byte 1 | | | Bit 0 | | | Accumlated | | | 5 | - -## 4.50.3 Meter Report Command - -The Meter Report Command is used to advertise a meter reading. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scale (2) | | | Rate Type | | | | | | Meter Type | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale (1:0) | | | | | | Size | | | | | | | | | -| Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Delta Time 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Previous Meter Value N | | | | | | | | | | | | | | | | | | | | | | | | -| Scale 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 4. - -Meter Type (8 bits) - -Meter Type specifies what type of metering device this Command originates from. This field MUST be [encoded according to Table 64.](04.50-meter-command-class-version-5.md#4503-meter-report-command) - -Table 64, Meter Report v5::Meter Type encoding - -| | Value | | | Meter Type | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x01 | | | Electric meter | | | 1 | | | -| 0x02 | | | Gas meter | | | 1 | | | -| 0x03 | | | Water meter | | | 1 | | | -| 0x04 | | | Heating meter | | | 5 | | | -| 0x05 | | | Cooling meter | | | 5 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Scale (3 bits) - -The Scale field MUST advertise the unit used for this report. The Scale field is composed of two sub- fields Scale (2) and Scale (1:0) which MUST be composed and interpreted as one unit. - -[This field MUST be encoded according to Table 65.](04.50-meter-command-class-version-5.md#4503-meter-report-command) - -The Scale value 0x07 MUST be used to indicate that the scale of the advertised meter reading is advertised through the Scale 2 field. - -Table 65, Meter Report v5::Scale encoding - -| | Meter Type | | | Scale | | | Value | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Electric meter | | | kWh | | | 0x00 | | | 1 | | | -| | | | kVAh | | | 0x01 | | | 2 | | | -| | | | W | | | 0x02 | | | 2 | | | -| | | | Pulse count | | | 0x03 | | | 2 | | | -| | | | V | | | 0x04 | | | 3 | | | -| | | | A | | | 0x05 | | | 3 | | | -| | | | Power Factor | | | 0x06 | | | 3 | | | -| | | | M.S.T | | | 0x07 | | | 4 | | | -| Gas meter | | | Cubic meters | | | 0x00 | | | 1 | | | -| | | | Cubic feet | | | 0x01 | | | 2 | | | -| | | | Reserved | | | 0x02 | | | - | | | -| | | | Pulse count | | | 0x03 | | | 2 | | | -| | | | Reserved | | | 0x04- 0x06 | | | - | | | -| | | | M.S.T | | | 0x07 | | | 4 | | | -| Water meter | | | Cubic meters | | | 0x00 | | | 1 | | | -| | | | Cubic feet | | | 0x01 | | | 1 | | | -| | | | US gallons | | | 0x02 | | | 1 | | | -| | | | Pulse count | | | 0x03 | | | 2 | | | -| | | | Reserved | | | 0x04-0x06 | | | - | | | -| | | | M.S.T | | | 0x07 | | | 4 | | | -| Heating meter | | | kWh | | | 0x00 | | | 5 | | | -| Cooling meter | | | kWh | | | 0x00 | | | 5 | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.51-meter-table-configuration-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.51-meter-table-configuration-command-class-version-1.md deleted file mode 100644 index d642622..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.51-meter-table-configuration-command-class-version-1.md +++ /dev/null @@ -1,37 +0,0 @@ - -# 4.51 Meter Table Configuration Command Class, version 1 - -The Meter Table Configuration Command Class defines the Commands necessary to configure the fundamental properties of the meter. - -The Meter Table configuration commands are separated from the Meter Table monitoring commands in the Meter Table Monitor Command Class, allowing the classes to be optionally supported at different Z- Wave security levels. (E.g. Meter table monitoring commands could be supported in any device, while enabling a strict and certificate based security solution for the Meter Table Configuration Command [class). Refer to [14] for more details about Z-Wave security.](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -## 4.51.1 Meter Table Point Adm Number Set Command - -This command is used to set the Meter Point Administration Number in the metering device. The Meter Point Administration Number is used to identify the customer. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL CONFIG _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE POINT ADM NO SET _ _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Meter Point Adm Number Characters | | | | | | | | | | | | | | | -| Meter Point Adm Number Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Point Adm Number Character N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Number of Meter Point Adm Number Characters (5 bits) - -Number of characters in the meter point administration number(1…32). - -Meter Point Adm Number Character (N bytes) - -The Meter Point Adm Number character fields hold the string identifying the customer. The character presentation uses standard ASCII codes (values 128-255 are ignored). diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.01-meter-table-point-adm-number-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.01-meter-table-point-adm-number-get-command.md deleted file mode 100644 index fef5d16..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.01-meter-table-point-adm-number-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.52.1 Meter Table Point Adm. Number Get Command - -This command is used to request the Meter Point Administration Number to identify customer. - -The Meter Table Adm. Number Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE POINT ADM NO GET _ _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.02-meter-table-point-adm-number-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.02-meter-table-point-adm-number-report-command.md deleted file mode 100644 index b5f43b1..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.02-meter-table-point-adm-number-report-command.md +++ /dev/null @@ -1,21 +0,0 @@ - -# 4.52.2 Meter Table Point Adm. Number Report Command - -This command reports parameters used for identification of customer and metering device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE POINT ADM NO REPORT _ _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Meter Point Adm. Number Characters | | | | | | | | | | | | | | | -| Meter Point Adm. Number Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Point Adm. Number Character N | | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to description of fields under the Meter Table Point Adm. Number Set Command (section 4.51.1).](../04.51-meter-table-configuration-command-class-version-1.md#4511-meter-table-point-adm-number-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.03-meter-table-id-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.03-meter-table-id-get-command.md deleted file mode 100644 index 675ec7c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.03-meter-table-id-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.52.3 Meter Table ID Get Command - -This command is used to request the parameters used for identification of customer and metering device. - -The Meter Table ID Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE ID GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.04-meter-table-id-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.04-meter-table-id-report-command.md deleted file mode 100644 index dbaf199..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.04-meter-table-id-report-command.md +++ /dev/null @@ -1,31 +0,0 @@ - -# 4.52.4 Meter Table ID Report Command - -This command reports parameters used for identification of customer and metering device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE ID REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Meter ID Characters | | | | | | | | | | | | | | | -| Meter ID Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter ID Character N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Number of Meter ID Characters (5 bits) - -Number of characters defining the meter ID (1..32). - -Meter ID Character (N bytes) - -The Meter ID character fields hold the string identifying the individual metering device. The character presentation uses standard ASCII codes (values 128-255 are ignored). In addition one can use the Manufacturer Specific Command Class in conjunction as product identification. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.05-meter-table-capability-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.05-meter-table-capability-get-command.md deleted file mode 100644 index ed85ce9..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.05-meter-table-capability-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.52.5 Meter Table Capability Get Command - -This command is used to request the capabilities of a metering device. - -The Meter Table Capability Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE CAPABILITY GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md deleted file mode 100644 index 804b953..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md +++ /dev/null @@ -1,145 +0,0 @@ - -# 4.52.6 Meter Table Capability Report Command - -This command is used to advertise meter table capabilities. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Type | | | | | | Meter Type | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Pay Meter | | | | | | | | | | | | -| Dataset Supported 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Supported 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Supported 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset History Supported 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset History Supported 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset History Supported 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Data History Supported 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Data History Supported 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Data History Supported 3 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](../04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Meter Type (6 bits) - -Meter Type specifies the type of metering device the command originates. This field MUST be encoded [according to Table 66.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Table 66: Meter Table capability Report::Meter Types encoding - -| | Value | | | Meter Type | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved | | | -| 0x01 | | | Single-E electric meter | | | -| 0x02 | | | Gas meter | | | -| 0x03 | | | Water meter | | | -| 0x04 | | | Twin-E electric meter | | | -| 0x05 | | | 3P Single Direct electric meter | | | -| 0x06 | | | 3P Single ECT electric meter | | | -| 0x07 | | | 1 Phase Direct Electricity Meter | | | -| 0x08 | | | Heating meter | | | -| 0x09 | | | Cooling meter | | | -| 0x0A | | | Combined Heating and Cooling Meter | | | -| 0x0B | | | Electric Sub-Meter | | | -| 0x0C-0x3F | | | Reserved | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Pay Meter (4 bits) - -Pay Meter specifies the way settling of account is done. Refer to the table below with respect to defined payment meters. - -Table 67, Meter Table Capability Report::Pay Meter encoding - -| Value | | | Pay Meter | | -| --- | --- | --- | --- | --- | -| 0x00 | | Reserved | | | -| 0x01 | | Creditmeter | | | -| 0x02 | | Prepayment meter | | | -| 0x03 | | Prepayment meter with debt recovery | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Dataset Supported / Dataset History Supported (24 bits / 24 bits) - -Dataset Supported specifies which parameters, are available to be requested from the metering device. [Dataset Supported MUST be encoded according to Table 68.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Dataset History Supported specifies the type of data/values, which may be requested through the Meter [Table Historical data Get command (see 4.52.14) from the metering device. Dataset History Supported](04.52.14-meter-table-historical-data-get-command.md#45214-meter-table-historical-data-get-command) [MUST be encoded according to Table 68.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Table 68, Meter Table Capability Report::Meter Dataset encoding - -| Meter Type | Byte # | Bit # | Description | -| --- | --- | --- | --- | -| Single-E electric meter Twin-E electric meter 3P Single Direct electric meter 3P Single ECT electric meter 1 Phase Direct Electricity Meter | Byte 1 | Bit 0 | Total Primary Active Energy (kWh) Energy delivered to the unit before transformation. | -| | Byte 1 | Bit 1 | Total Primary Reactive Energy (kvarh) Energy delivered to the unit before transformation. | -| | Byte 1 | Bit 2 | Total Secondary Active Energy (kWh) Consumed energy after transformation. | -| | Byte 1 | Bit 3 | Total Secondary Reactive Energy (kvarh) Consumed energy after transformation. | -| | Byte 1 | Bit 4 | Instantaneous Primary Active Power (kW) Current power consumption. | -| | Byte 1 | Bit 5 | Instantaneous Primary Reactive Power (kvar) Current power consumption. | -| | Byte 1 | Bit 6 | Primary Active Maximum Demand (kW) All time maximum active power demand. | -| | Byte 1 | Bit 7 | Primary Reactive Maximum Demand (kvar) All time maximum reactive power demand. | - -| Meter Type | Byte # | Bit # | Description | -| --- | --- | --- | --- | -| | Byte 2 | Bit 0 | Cumulative Primary Active Maximum Demand (kW) Accumulated power over period. | -| | Byte 2 | Bit 1 | Cumulative Primary Reactive Maximum Demand (kvar) Accumulated power over period. | -| | Byte 2 | Bit 2 | Voltage Phase 1 (V) Voltage measured on phase 1. | -| | Byte 2 | Bit 3 | Voltage Phase 2 (V) Voltage measured on phase 2. | -| | Byte 2 | Bit 4 | Voltage Phase 3 (V) Voltage measured on phase 3. | -| | Byte 2 | Bit 5 | Ampere Phase 1 (A) Amperes measured on phase 1. | -| | Byte 2 | Bit 6 | Ampere Phase 2 (A) Amperes measured on phase 2. | -| | Byte 2 | Bit 7 | Ampere Phase 3 (A) Amperes measured on phase 3. | -| | Byte 3 | Bit 0 | Pulse Input (Pulse Count) Pulse count on pulse input port of meter. | -| | Byte 3 | Bit 1 | Current Transformation Ratio (ratio) Transformation ratio between primary and secondary energy. | -| | Byte 3 | Bit 2 | Power Factor (%) Power factor contains the ratio of real power to total power, and is expressed as a percentage (%). | -| | Byte 3 | Bit 3-7 | Reserved Value reserved for future expansion. | -| Gas meter Water meter | Byte 1 | Bit 0 | Accumulated Volume (m3) Total accumulated volume. | -| | Byte 1 | Bit 1 | Current Flow (l/h, m3/h) Current flow value. | -| | Byte 1 | Bit 2 | Current Pressure (kPa) Current pressure value. | -| | Byte 1 | Bit 3 | Peak Flow (l/h, m3/h) Peak flow demand recorded. | -| | Byte 1 | Bit 4 | Hour Counter (Hours) Hours in operation. | -| | Byte 1 | Bit 5 | Input A (m3/h, kW, m3, kWh, MWh, Pulse Count) Value of input port A on the meter. | - -| Meter Type | Byte # | Bit # | Description | -| --- | --- | --- | --- | -| | Byte 1 | Bit 6 | Input B (m3/h, kW, m3, kWh, MWh, Pulse Count) Value of input port B on the meter. | -| | Byte 1 Byte 2 Byte 3 | Bit 7 Bit 0-7 Bit 0-7 | Reserved Value reserved for future expansion. | -| Heating meter Cooling meter | Byte 1 | Bit 0 | Heat Energy (kWh, MWh, GJ, GCal) Total accumulated energy used for heating. | -| | Byte 1 | Bit 1 | Cooling Energy (kWh, MWh, GJ, GCal) Total accumulated energy used for cooling. | -| | Byte 1 | Bit 2 | Volume 1 (m3, ton) Volume counter 1 – forward flow. | -| | Byte 1 | Bit 3 | Volume2 (m3, ton) Volume counter 2 – return flow. | -| | Byte 1 | Bit 4 | Temperature 1 (Forward) (Co, oF) Forward temperature. | -| | Byte 1 | Bit 5 | Temperature 2 (Return) (Co, oF) Return temperature. | -| | Byte 1 | Bit 6 | Temperature 3 (Co, oF) Temperature sensor 3. | -| | Byte 1 | Bit 7 | Actual Flow (Volume 1) (l/h, m3/h) Current flow on volume 1. | -| | Byte 2 | Bit 0 | Actual Flow (Volume 2) (l/h, m3/h) Current flow on volume 2. | -| | Byte 2 | Bit 1 | Actual Power (kW, MW) Current power. | -| | Byte 2 | Bit 2 | Peak Flow (l/h, m3/h) Peak flow recorded. | -| | Byte 2 | Bit 3 | Peak Power (kW, MW) Peak power recorded. | -| | Byte 2 | Bit 4 | Input A (m3/h, kW, m3, kWh, MWh, Pulse Count) Value of input port A on the meter. | -| | Byte 2 | Bit 5 | Input B (m3/h, kW, m3, kWh, MWh, Pulse Count) Value of input port B on the meter. | -| | Byte 2 | Bit 6 | Hour Counter (Hours) Hours in operation. | -| | Byte 2 Byte 3 | Bit 7 Bit 0-7 | Reserved Value reserved for future expansion. | -| Electric Sub-Meter | Byte 1 | Bit 0 | Accumulated (kWh) | - -| Meter Type | Byte # | Bit # | Description | -| --- | --- | --- | --- | -| | Byte 1 | Bit 1 | Accumulated (kVAh) | -| | Byte 1 | Bit 2 | Instant (W) | -| | Byte 1 | Bit 3 | Accumulated (Pulse Count) | -| | Byte 1 | Bit 4 | Instant (V) | -| | Byte 1 | Bit 5 | Instant (A) | -| | Byte 1 | Bit 6 | Power Factor (%) | -| | Byte 1 Byte 2 Byte 3 | Bit 7 Bit 0-7 Bit 0-7 | Reserved | - -Data History Supported (24 bits) - -Data History Supported specifies number of possible entries in the buffer holding the historical values. Historical data cannot be retrieved when Data History Supported is equal to 0. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.07-meter-table-status-supported-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.07-meter-table-status-supported-get-command.md deleted file mode 100644 index 8e5092c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.07-meter-table-status-supported-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.52.7 Meter Table Status Supported Get Command - -This command is used to request the supported operating status event parameters and logging depth of the metering device. - -The Meter Table Status Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.08-meter-table-status-supported-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.08-meter-table-status-supported-report-command.md deleted file mode 100644 index 5c5f50a..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.08-meter-table-status-supported-report-command.md +++ /dev/null @@ -1,59 +0,0 @@ - -# 4.52.8 Meter Table Status Supported Report Command - -This command is used to report the supported operation status and logging depth of these in the meter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Operating Status 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Operating Status 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Operating Status 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Status Event Log Depth | | | | | | | | | | | | | | | | | | | | | | | | - -Supported Operating Status (24 bits) - -This command parameter is defined in a bitmap format and holds values and combinations of the meters operating status. If no “Operating Status Event” is supported by the application all fields of this parameter MUST be set to ‘0’ as an indication of the meter is at “Normal/Idle” operating status. Supported Operating Status supports the following combinations of operating status: - -Table 69, Meter Table Status Supported Report::Supported Operating Status encoding - -| Operating Status | Bit Map | | Operating | | Description | -| --- | --- | --- | --- | --- | --- | -| | | | Status Event | | | -| | | | Identifier | | | -| 1 | Bit 0 | 0x00 | | | Disconnected The meter has been disconnected. | -| 1 | Bit 1 | 0x01 | | | Leak detection A leak has been detected. | -| 1 | Bit 2 | 0x02 | | | Power failure All phases / meter without power. | -| 1 | Bit 3 | 0x03 | | | Power failure – Phase 1 Power failure on phase 1 detected. | -| 1 | Bit 4 | 0x04 | | | Power failure – Phase 2 Power failure on phase 2 detected. | -| 1 | Bit 5 | 0x05 | | | Power failure – Phase 3 Power failure on phase 3 detected. | -| 1 | Bit 6 | 0x06 | | | Voltage Quality Voltage quality not within limits. | -| 1 | Bit 7 | 0x07 | | | Tamper detection Tamper switch has been activated. | -| 2 | Bit 0 | 0x08 | | | Magnetic tampering Magnetic tempering detected. | -| 2 | Bit 1 | 0x09 | | | Meter Clock Set The clock has been set in the meter. | -| 2 | Bit 2 | 0x0A | | | Meter Clock Adjusted The clock has been adjusted in the meter. | - -| Operating Status | Bit Map | | Operating | | Description | -| --- | --- | --- | --- | --- | --- | -| | | | Status Event | | | -| | | | Identifier | | | -| 2 | Bit 3 | 0x0B | | | Out of Credit The meter is out of credit. | -| 2 | Bit 4 | 0x0C | | | Emergency credit The meter is running on emergency credit. | -| 2 | Bit 5 | 0x0D | | | Transformer Ratio Changed “Current transformation ratio” in meter changed. | -| 2 | Bit 6 | 0x0E | | | Temperature Sensor 1 – Out of range Temperature Sensor 1 outside specifications. | -| 2 | Bit 7 | 0x0F | | | Temperature Sensor 2 – Out of range Temperature Sensor 2 outside specifications. | -| 3 | Bit 0 | 0x10 | | | Temperature Sensor 3 – Out of range Temperature Sensor 3 outside specifications. | -| 3 | Bit 1 | 0x11 | | | Burst Detection Heat Burst detected in the heating network causing potential flooding. | -| 3 | Bit 2 | 0x12 | | | Error – Check Meter Any other error condition not mentioned above. | -| 3 | Bit 4 – 7 | 0x13 – 0x1F | | | Reserved Values reserved for future expansion. | - -Status Event Log Depth (8 bits) - -The status event log depth indicates the supported depth of the event log. If the meter only supports reporting the current status the status event log depth MUST be set to 0. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.09-meter-table-status-depth-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.09-meter-table-status-depth-get-command.md deleted file mode 100644 index 5a7f856..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.09-meter-table-status-depth-get-command.md +++ /dev/null @@ -1,24 +0,0 @@ - -# 4.52.9 Meter Table Status Depth Get Command - -This command is used to request the current operating status of the metering device or to request a number of the latest status event from the logs. - -The Meter Table Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS DEPTH GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Status Event Log Depth | | | | | | | | | | | | | | | | | | | | | | | | - -Status Event Log Depth (8 bits) - -The status event log depth indicates the number of latest recorded events that should be returned in the corresponding report. If the log depth is set to 0 the meter will only return the current status; if the log depth is set to 0xFF the meter SHOULD return the entire status log. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.10-meter-table-status-date-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.10-meter-table-status-date-get-command.md deleted file mode 100644 index 83b2a07..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.10-meter-table-status-date-get-command.md +++ /dev/null @@ -1,62 +0,0 @@ - -# 4.52.10 Meter Table Status Date Get Command - -This command is used to request a number of status events recorded in a certain time interval. - -The Meter Table Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -If the meter does not support a status event log history it MUST return the current state of the meter (see [Meter Table Status Report Command).](04.52.11-meter-table-status-report-command.md#45211-meter-table-status-report-command) - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS DATE GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Reports | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Maximum Reports (8 bits) - -The maximum reports parameter is used to indicate the maximum number of reports to return based on the get. Reports are always returned with the most recently recorded log entry first. If set to 0x00 the meter will return all reports based on the request. Start/Stop - Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Start/Stop - Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Start/Stop - Day (8 bits) - -Specify the day of the month between 01 and 31. - -Start/Stop - Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Start/Stop - Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Start/Stop - Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.11-meter-table-status-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.11-meter-table-status-report-command.md deleted file mode 100644 index adfc0d4..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.11-meter-table-status-report-command.md +++ /dev/null @@ -1,74 +0,0 @@ - -# 4.52.11 Meter Table Status Report Command - -This command is used to advertise the current status of the meter. - -| | 7 | | | 6 | | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to follow | | | | | | | | | | | | | | | | | | | | | | | | | -| Current Operating Status 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Current Operating Status 2 | | | | | | | | | | | | | | | | | | | | | | | | | -| Current Operating Status 3 | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Type | | | | | Reserved | | | | | Event 1 - Operating Status Event ID | | | | | | | | | | | | | | | -| Event 1 - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Month | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Day | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Event 1 - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N -Type | | | | | Reserved | | | | | Event N - Operating Status Event ID | | | | | | | | | | | | | | | -| Event N - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N - Month | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N - Day | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Event N - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | | - -Reports to follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. Current Operating Status (24 bits) - -This command parameter is defined in a bitmap format and holds values and combinations of the meters operating status. If no “Operating Status Event” has been registered for the period requested by the Meter Table Status Date Get Command, all fields of this parameter MUST be set to ‘0’ AND no “Event” parameters are to be included in the Meter Table Status Report Command i.e. the command parameters [ends after “Current Operating Status” . Refer to “Supported Operating Status” in section 4.52.8 for](04.52.08-meter-table-status-supported-report-command.md#4528-meter-table-status-supported-report-command) details. - -Event – Type (1 bit) - -The parameter reports type of event number n in the event log. The event type MAY be 0 (the meter entered the state described by the operating event status ID at the time reported), or 1 (the meter left the state described by the operating event status ID). - -Event – Operating Status Event ID (5 bits) - -The operating status event identifier of event number n in the event log. The identifiers available are [given in the table in section 4.52.8.](04.52.08-meter-table-status-supported-report-command.md#4528-meter-table-status-supported-report-command) - -Event - Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Event - Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Event - Day (8 bits) - -Specify the day of the month between 01 and 31. - -Event - Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Event - Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Event - Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.12-meter-table-current-data-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.12-meter-table-current-data-get-command.md deleted file mode 100644 index 1b13316..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.12-meter-table-current-data-get-command.md +++ /dev/null @@ -1,26 +0,0 @@ - -# 4.52.12 Meter Table Current Data Get Command - -This command is used to request a number of time stamped values (current) in physical units according to the dataset mask. - -The Meter Table Current Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL CURRENT DATA GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 3 | | | | | | | | | | | | | | | | | | | | | | | | - -Dataset Requested (24 bits) - -The Dataset Requested is used to indicate which parameters are requested from the meter. This field [MUST be encoded according to Table 68.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md deleted file mode 100644 index 2614446..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md +++ /dev/null @@ -1,135 +0,0 @@ - -# 4.52.13 Meter Table Current Data Report Command - -This command is is used to report a number of time stamped values. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL CURRENT DATA REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Rate Type | | | | | | -| Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | -| Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Current Meter Precision 1 | | | | | | | | | Current Meter Scale 1 | | | | | | | | | | | | | | -| | Current Value 1,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value 1,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value 1,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value 1,4 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Current Meter Precision N | | | | | | | | | Current Meter Scale N | | | | | | | | | | | | | | -| | Current Value N,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value N,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value N,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value N,4 | | | | | | | | | | | | | | | | | | | | | | | - -Reports to follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](../04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Dataset (24 bits) - -The dataset parameter indicates which data is included in the report. This field MUST be encoded [according to Table 68.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. A year equal to 0x0000 indicates that an accumulated value is not determined yet. - -Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Day (8 bits) - -Specify the day of the month between 01 and 31. - -Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Meter Precision (3 bits) - -The Meter Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. Meter Scale (5 bits) - -The Meter Scale used to indicate the scale (unit) of the reported parameter. - -Table 70, Meter Table Current Data Report::Meter Scale encoding - -| | Meter Type | | | Meter Scale | | | Value | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Electric meter | | | kWh | | | 0x00 | | | -| | | | kVARh | | | 0x01 | | | -| | | | % | | | 0x02 | | | -| | | | Pulse count | | | 0x03 | | | -| | | | kVAR | | | 0x04 | | | -| | | | Voltage (V) | | | 0x05 | | | -| | | | Amperes (A) | | | 0x06 | | | -| | | | kW | | | 0x07 | | | -| | | | Ratio | | | 0x08 | | | -| | | | Reserved | | | 0x09- 0x1F | | | -| Gas and water meter | | | Cubic meter | | | 0x00 | | | -| | | | Cubic feet | | | 0x01 | | | -| | | | US gallon | | | 0x02 | | | -| | | | Pulse count | | | 0x03 | | | -| | | | IMP gallon | | | 0x04 | | | -| | | | Liter | | | 0x05 | | | -| | | | kPa | | | 0x06 | | | -| | | | Centum cubic feet | | | 0x07 | | | -| | | | Cubic meter per hour | | | 0x08 | | | -| | | | Liter per hour | | | 0x09 | | | -| | | | kWh | | | 0x0A | | | -| | | | MWh | | | 0x0B | | | -| | | | KW | | | 0x0C | | | -| | | | Hours | | | 0x0D | | | -| | | | Reserved | | | 0x0E-0x1F | | | -| Heating and Cooling Meter | | | Cubic meter (m3) | | | 0x00 | | | -| | | | Metric Ton (tonne) (t) | | | 0x01 | | | -| | | | Cubic meter per hour (m3/h) | | | 0x02 | | | -| | | | Liter per hour (l/h) | | | 0x03 | | | -| | | | kW | | | 0x04 | | | -| | | | MW | | | 0x05 | | | - -| | Meter Type | | | Meter Scale | | | Value | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | | | kWh | | | 0x06 | | | -| | | | MWh | | | 0x07 | | | -| | | | Giga Joule (GJ) | | | 0x08 | | | -| | | | Giga Calorie (Gcal) | | | 0x09 | | | -| | | | Celsius (Co) | | | 0x0A | | | -| | | | Fahrenheit (oF) | | | 0x0B | | | -| | | | Hours | | | 0x0C | | | -| | | | Reserved | | | 0x0D-0x1F | | | - -Current Value (32 bits) - -The Current Value is a 32 bit signed field defined by dataset requested field. The first byte (Value 1) is [the most significant byte. Table 10 shows signed decimal values together with their hexadecimal](../../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) equivalents. - -NOTICE: The device receiving the Meter Table Current Data Report MUST show the value even though the scale is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.14-meter-table-historical-data-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.14-meter-table-historical-data-get-command.md deleted file mode 100644 index a409418..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.14-meter-table-historical-data-get-command.md +++ /dev/null @@ -1,69 +0,0 @@ - -# 4.52.14 Meter Table Historical Data Get Command - -This command is used to request a number of time stamped values (historical) in physical units according to rate type, dataset mask and time interval. - -The Meter Table Historical Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL HISTORICAL DATA GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Reports | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Dataset Requested 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Dataset Requested 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Dataset Requested 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Maximum Reports (8 bits) - -The maximum reports parameter is used to indicate the maximum number of reports to return based on the get. Reports are always returned with the most recently recorded value first. If set to 0x00 the meter will return all reports based on the request. - -Dataset History (24 bits) - -The Historical Dataset Requested parameter is use to indicate which parameters are requested from the [meter. This field MUST be encoded according to Table 68.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Start/Stop Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Start/Stop Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Start/Stop Day (8 bits) - -Specify the day of the month between 01 and 31. - -Start/Stop Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Start/Stop Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Start/Stop Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.15-meter-table-historical-data-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.15-meter-table-historical-data-report-command.md deleted file mode 100644 index 04d3b40..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/04.52.15-meter-table-historical-data-report-command.md +++ /dev/null @@ -1,88 +0,0 @@ - -# 4.52.15 Meter Table Historical Data Report Command - -This command is used to report a number of time stamped values. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL HISTORICAL DATA REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Rate Type | | | | | | -| Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Month | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Day | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Precision 1 | | | | | | | | | Historical Scale 1 | | | | | | | | | | | | | | -| | Historical Value 1,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,4 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Precision N | | | | | | | | | Historical Scale N | | | | | | | | | | | | | | -| | Historical Value N,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,4 | | | | | | | | | | | | | | | | | | | | | | | - -Reports to Follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](../04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Dataset (24 bits) - -This command parameter is defined in a bitmap format and holds values and combinations of the meters dataset. If no historical data has been registered for the period requested by the Meter Table Historical Data Get Command, all fields of this parameter MUST be set to ‘0’ AND no “Historical” parameters are to be included in the Meter Table Historical Data Report Command i.e. the command parameters ends after [“Dataset”. This field MUST be encoded according to Table 68.](04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Historical Year (16 bits) - -Specify for the dataset the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Historical Month (8 bits) - -Specify for the dataset the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that an accumulated value is not determined yet. - -Historical Day (8 bits) - -Specify for the dataset the day of the month between 01 and 31. - -Historical Hour Local Time (8 bits) - -Specify for the dataset the number of complete hours that have passed since midnight (00-23) in local time. - -Historical Minute Local Time (8 bits) - -Specify for the dataset the number of complete minutes that have passed since the start of the hour (00- 59) in local time. - -Historical Second Local Time (8 bits) - -Specify for the dataset the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Historical Precision (3 bits) - -The Historical Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Historical Scale (5 bits) - -The Historical Scale used to indicate the scale (unit) of the reported parameter. The Historical Scale parameter is of the variable type Meter Scale [; refer to Section 4.52.13 for a definition of the variable.](04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) Historical Value - -The Historical Value is a 32 bit signed field defined by dataset requested field. The first byte (Value 1) is [the most significant byte. Table 10 shows signed decimal values together with their hexadecimal](../../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) equivalents. - -NOTICE: The device receiving the Meter Table Historical Data Report MUST always show the value even though the Scale is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/index.md b/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/index.md deleted file mode 100644 index 5e8704d..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.52-meter-table-monitor-command-class-version-1/index.md +++ /dev/null @@ -1,28 +0,0 @@ - -# 4.52 Meter Table Monitor Command Class, version 1 - -The Meter Table Monitor Command Class defines the Commands necessary to read historical and accumulated values in physical units from a water meter or other metering device (gas, electric etc.) and thereby enabling automatic meter reading capabilities - -## Contents - -- [4.52.1 Meter Table Point Adm. Number Get Command](04.52.01-meter-table-point-adm-number-get-command.md) -- [4.52.2 Meter Table Point Adm. Number Report Command](04.52.02-meter-table-point-adm-number-report-command.md) -- [4.52.3 Meter Table ID Get Command](04.52.03-meter-table-id-get-command.md) -- [4.52.4 Meter Table ID Report Command](04.52.04-meter-table-id-report-command.md) -- [4.52.5 Meter Table Capability Get Command](04.52.05-meter-table-capability-get-command.md) -- [4.52.6 Meter Table Capability Report Command](04.52.06-meter-table-capability-report-command.md) -- [4.52.7 Meter Table Status Supported Get Command](04.52.07-meter-table-status-supported-get-command.md) -- [4.52.8 Meter Table Status Supported Report Command](04.52.08-meter-table-status-supported-report-command.md) -- [4.52.9 Meter Table Status Depth Get Command](04.52.09-meter-table-status-depth-get-command.md) -- [4.52.10 Meter Table Status Date Get Command](04.52.10-meter-table-status-date-get-command.md) -- [4.52.11 Meter Table Status Report Command](04.52.11-meter-table-status-report-command.md) -- [4.52.12 Meter Table Current Data Get Command](04.52.12-meter-table-current-data-get-command.md) -- [4.52.13 Meter Table Current Data Report Command](04.52.13-meter-table-current-data-report-command.md) -- [4.52.14 Meter Table Historical Data Get Command](04.52.14-meter-table-historical-data-get-command.md) -- [4.52.15 Meter Table Historical Data Report Command](04.52.15-meter-table-historical-data-report-command.md) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.01-meter-table-point-adm-number-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.01-meter-table-point-adm-number-get-command.md deleted file mode 100644 index edaf954..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.01-meter-table-point-adm-number-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.53.1 Meter Table Point Adm. Number Get Command - -This command is used to request the Meter Point Administration Number to identify customer. - -The Meter Table Point Adm. Number Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE POINT ADM NO GET _ _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.02-meter-table-point-adm-number-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.02-meter-table-point-adm-number-report-command.md deleted file mode 100644 index 0f16d5f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.02-meter-table-point-adm-number-report-command.md +++ /dev/null @@ -1,23 +0,0 @@ - -# 4.53.2 Meter Table Point Adm. Number Report Command - -This command reports parameters used for identification of customer and metering device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE POINT ADM NO REPORT _ _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Meter Point Adm. Number Characters | | | | | | | | | | | | | | | -| Meter Point Adm. Number Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter Point Adm. Number Character N | | | | | | | | | | | | | | | | | | | | | | | | - -Refer to description of fields under the Meter Table Point Adm. Number Set Command in Meter Table Configuration Command Class, version 1. - -If Meter Table Point Adm, Number is not Set using the Meter Table Point Adm, Number Set Command in Meter Table Configuration Command Class, version 1 the Reported Number of Meter Point Adm, Number must be 0x00 and no Meter Table Point Adm, Numbers must be reported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.03-meter-table-id-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.03-meter-table-id-get-command.md deleted file mode 100644 index 6843290..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.03-meter-table-id-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.53.3 Meter Table ID Get Command - -This command is used to request the parameters used for identification of customer and metering device. - -The Meter Table ID Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE ID GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.04-meter-table-id-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.04-meter-table-id-report-command.md deleted file mode 100644 index d4bb7d4..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.04-meter-table-id-report-command.md +++ /dev/null @@ -1,33 +0,0 @@ - -# 4.53.4 Meter Table ID Report Command - -This command reports parameters used for identification of customer and metering device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE ID REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Meter ID Characters | | | | | | | | | | | | | | | -| Meter ID Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Meter ID Character N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Number of Meter ID Characters (5 bits) - -Number of characters defining the meter ID (1..32). - -Meter ID Character (N bytes) - -The Meter ID character fields hold the string identifying the individual metering device. The character presentation uses standard ASCII codes (values 128-255 are ignored). In addition one can use the Manufacturer Specific Command Class in conjunction as product identification. - -Note: If the Meter Table ID is not used Number of Meter ID Characters must be reported as 0x00 and no Meter ID Characters must be reported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.05-meter-table-capability-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.05-meter-table-capability-get-command.md deleted file mode 100644 index 358b1b3..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.05-meter-table-capability-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.53.5 Meter Table Capability Get Command - -This command is used to request the capabilities of a metering device. - -The Meter Table Capability Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL TABLE CAPABILITY GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.06-meter-table-capability-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.06-meter-table-capability-report-command.md deleted file mode 100644 index e889791..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.06-meter-table-capability-report-command.md +++ /dev/null @@ -1,60 +0,0 @@ - -# 4.53.6 Meter Table Capability Report Command - -This command is used to advertise meter table capabilities. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Type | | | | | | Meter Type | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Pay Meter | | | | | | | | | | | | -| Dataset Supported 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Supported 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Supported 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset History Supported 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset History Supported 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset History Supported 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Data History Supported 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Data History Supported 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Data History Supported 3 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](../04.47-meter-command-class-version-2.md#4475-meter-report-command) - -If the Meter Type is Submeter the Rate Type must be Import to indicate consumption. Meter Type (6 bits) - -Meter Type specifies the type of metering device the command originates. This field MUST be encoded [according to Table 66.](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Pay Meter (4 bits) - -Pay Meter specifies the way settling of account is done. - -| | Value | | | Pay Meter | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Reserved | | | -| 0x01 | | | Creditmeter | | | -| 0x02 | | | Prepayment meter | | | -| 0x03 | | | Prepayment meter with debt recovery | | | -| 0x04-0x07 | | | Reserved | | | - -Dataset Supported / Dataset History Supported (24 bits / 24 bits) - -Dataset Supported specifies which parameters, are available to be requested from the metering device. [Dataset Supported MUST be encoded according to Table 68..](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Dataset History Supported specifies the type of data/values, which may be requested through the Meter [Table Historical data Get command (see 4.53.14) from the metering device. Dataset History Supported](04.53.14-meter-table-historical-data-get-command.md#45314-meter-table-historical-data-get-command) [MUST be encoded according to Table 68.](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Data History Supported (24 bits) - -Data History Supported specifies number of possible entries in the buffer holding the historical values. Historical data cannot be retrieved when Data History Supported is equal to 0. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.07-meter-table-status-supported-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.07-meter-table-status-supported-get-command.md deleted file mode 100644 index cac7b0f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.07-meter-table-status-supported-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.53.7 Meter Table Status Supported Get Command - -This command is used to request the supported operating status event parameters and logging depth of the metering device. - -The Meter Table Status Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.08-meter-table-status-supported-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.08-meter-table-status-supported-report-command.md deleted file mode 100644 index 4922612..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.08-meter-table-status-supported-report-command.md +++ /dev/null @@ -1,27 +0,0 @@ - -# 4.53.8 Meter Table Status Supported Report Command - -This command is used to report the supported operation status’ and logging depth of these in the meter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Operating Status 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Operating Status 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Operating Status 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Status Event Log Depth | | | | | | | | | | | | | | | | | | | | | | | | - -Supported Operating Status (1–4 Bytes) - -This command parameter is defined in a bitmap format and holds values and combinations of the meters operating status. If no “Operating Status Event” is supported by the application all fields of this parameter must be set to ‘0’ as an indication of the meter is at “Normal/Idle” operating status. Supported Operating Status supports the following combinations of operating status: - -Status Event Log Depth (8 bits) - -The status event log depth indicates the supported depth of the event log. If the meter only supports reporting the current status the status event log depth must be set to 0. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.09-meter-table-status-depth-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.09-meter-table-status-depth-get-command.md deleted file mode 100644 index 1512bf8..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.09-meter-table-status-depth-get-command.md +++ /dev/null @@ -1,24 +0,0 @@ - -# 4.53.9 Meter Table Status Depth Get Command - -This command is used to request the current operating status of the metering device or to request a number of the latest status event from the logs. - -The Meter Table Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS DEPTH GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Status Event Log Depth | | | | | | | | | | | | | | | | | | | | | | | | - -Status Event Log Depth (8 bits) - -The status event log depth indicates the number of latest recorded events that should be returned in the corresponding report. If the log depth is set to 0 the meter will only return the current status; if the log depth is set to 0xFF the meter should return the entire status log. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.10-meter-table-status-date-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.10-meter-table-status-date-get-command.md deleted file mode 100644 index 95b8e96..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.10-meter-table-status-date-get-command.md +++ /dev/null @@ -1,62 +0,0 @@ - -# 4.53.10 Meter Table Status Date Get Command - -This command is used to request a number of status events recorded in a certain time interval. - -The Meter Table Status Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -If the meter does not support a status event log history it must return the current state of the meter (see [section 4.53.11)](04.53.11-meter-table-status-report-command.md#45311-meter-table-status-report-command) - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS DATE GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Reports | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Maximum Reports (8 bits) - -The maximum reports parameter is used to indicate the maximum number of reports to return based on the get. Reports are always returned with the most recently recorded log entry first. If set to 0x00 the meter will return all reports based on the request. - -Start / Stop - Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. Start / Stop - Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Start / Stop - Day (8 bits) - -Specify the day of the month between 01 and 31. - -Start / Stop - Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Start / Stop - Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Start / Stop - Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.11-meter-table-status-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.11-meter-table-status-report-command.md deleted file mode 100644 index fe218fa..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.11-meter-table-status-report-command.md +++ /dev/null @@ -1,78 +0,0 @@ - -# 4.53.11 Meter Table Status Report Command - -This command is used to advertise the current status of the meter. - -| | 7 | | | 6 | | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL STATUS REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to follow | | | | | | | | | | | | | | | | | | | | | | | | | -| Current Operating Status 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Current Operating Status 2 | | | | | | | | | | | | | | | | | | | | | | | | | -| Current Operating Status 3 | | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 | | | | Reserved | | | | | Event 1 - Operating Status Event ID | | | | | | | | | | | | | | | -| | - Type | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Month | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Day | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Event 1 - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n | | | | Reserved | | | | | Event n - Operating Status Event ID | | | | | | | | | | | | | | | -| | -Type | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n - Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n - Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n - Month | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n - Day | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n - Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n -Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Event n - Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Reports to follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. - -Current Operating Status (24 bits) - -This command parameter is defined in a bitmap format and holds values and combinations of the meters operating status. If no “Operating Status Event” has been registered for the period requested by the Meter Table Status Date Get Command, all fields of this parameter must be set to ‘0’ AND no “Event” parameters are to be included in the Meter Table Status Report Command i.e. the command parameters [ends after “Current Operating Status” . Refer to “Supported Operating Status” in section 4.52.8 for](../04.52-meter-table-monitor-command-class-version-1/04.52.08-meter-table-status-supported-report-command.md#4528-meter-table-status-supported-report-command) details. - -Event n – Type (1 bit) - -The parameter reports type of event number n in the event log. The event type MAY be 0 (the meter entered the state described by the operating event status ID at the time reported), or 1 (the meter left the state described by the operating event status ID). - -Event – Operating Status Event ID - -The operating status event identifier of event number n in the event log. The identifiers available are [given in the table in section 4.52.8.](../04.52-meter-table-monitor-command-class-version-1/04.52.08-meter-table-status-supported-report-command.md#4528-meter-table-status-supported-report-command) - -Event - Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Event - Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Event - Day (8 bits) - -Specify the day of the month between 01 and 31. - -Event - Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Event - Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Event - Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.12-meter-table-current-data-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.12-meter-table-current-data-get-command.md deleted file mode 100644 index 7faa2ce..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.12-meter-table-current-data-get-command.md +++ /dev/null @@ -1,26 +0,0 @@ - -# 4.53.12 Meter Table Current Data Get Command - -This command is used to request a number of time stamped values (current) in physical units according to the dataset mask. - -The Meter Table Current Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL CURRENT DATA GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 3 | | | | | | | | | | | | | | | | | | | | | | | | - -Dataset Requested (24 bits) - -The Dataset Requested is used to indicate which parameters are requested from the meter. This field [MUST be encoded according to Table 68.](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.13-meter-table-current-data-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.13-meter-table-current-data-report-command.md deleted file mode 100644 index acdce99..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.13-meter-table-current-data-report-command.md +++ /dev/null @@ -1,96 +0,0 @@ - -# 4.53.13 Meter Table Current Data Report Command - -This command is used to report a number of time stamped values. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL CURRENT DATA REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Operating Status Indication | | | | Reserved | | | | | | | | | | | | | | Rate Type | | | | | | -| Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | -| Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Current Meter Precision 1 | | | | | | | | | Current Meter Scale 1 | | | | | | | | | | | | | | -| | Current Value 1,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value 1,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value 1,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value 1,4 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Current Meter Precision N | | | | | | | | | Current Meter Scale N | | | | | | | | | | | | | | -| | Current Value N,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value N,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value N,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Current Value N,4 | | | | | | | | | | | | | | | | | | | | | | | - -Reports to follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. Operating Status Indication (1 bit) - -The Operating Status Indication bit is used to indicate that the reported meter data is measured while the meter is in a operating status different from Normal e.g. accuracy warning or clock not accurate. - -Setting the bit to 1 means that the meter is operating in a status different from Normal. Setting the bit to 0 means that the meter is operating in Normal mode. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](../04.47-meter-command-class-version-2.md#4475-meter-report-command) - -If the Meter Type is Submeter, the Rate Type MUST be set to Import to indicate consumption. - -Dataset (24 bits) - -The dataset parameter indicates which data is included in the report. This field MUST be encoded [according to Table 68.](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. A year equal to 0x0000 indicates that an accumulated value is not determined yet. - -Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Day (8 bits) - -Specify the day of the month between 01 and 31. - -Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Meter Precision (3 bits) - -The Meter Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. Meter Scale (5 bits) - -The Meter Scale used to indicate the scale (unit) of the reported parameter. Meter Scale variables; refer [to section 4.52.13 for a definition of the variable.](../04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) - -Current Value (32 bits) - -The Current Value is a 32 bit signed field defined by dataset requested field. The first byte (Value 1) is [the most significant byte. Table 10 shows signed decimal values together with their hexadecimal](../../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) equivalents. - -NOTICE: The device receiving the Meter Table Current Data Report must always show the value even though the scale is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.14-meter-table-historical-data-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.14-meter-table-historical-data-get-command.md deleted file mode 100644 index f97d6df..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.14-meter-table-historical-data-get-command.md +++ /dev/null @@ -1,69 +0,0 @@ - -# 4.53.14 Meter Table Historical Data Get Command - -This command is used to request a number of time stamped values (historical) in physical units according to rate type, dataset mask and time interval. - -The Meter Table Historical Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL HISTORICAL DATA GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Reports | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Dataset Requested 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Dataset Requested 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Dataset Requested 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Maximum Reports (8 bits) - -The maximum reports parameter is used to indicate the maximum number of reports to return based on the get. Reports are always returned with the most recently recorded value first. If set to 0x00 the meter will return all reports based on the request. - -Dataset History (24 bits) - -The Historical Dataset Requested parameter is use to indicate which parameters are requested from the [meter. This field MUST be encoded according to Table 68.](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Start/Stop Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Start/Stop Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Start/Stop Day (8 bits) - -Specify the day of the month between 01 and 31. - -Start/Stop Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Start/Stop Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Start/Stop Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.15-meter-table-historical-data-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.15-meter-table-historical-data-report-command.md deleted file mode 100644 index fdfab76..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/04.53.15-meter-table-historical-data-report-command.md +++ /dev/null @@ -1,96 +0,0 @@ - -# 4.53.15 Meter Table Historical Data Report Command - -This command is used to report a number of time stamped values. - -| | 7 | | | 6 | | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL HISTORICAL DATA REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | | -| Operating Status Indication | | | | | Reserved | | | | | | | | | | | | | | Rate Type | | | | | | -| Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Year 1 | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Year 2 | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Month | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Day | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| Historical Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Precision 1 | | | | | | | | | | Historical Scale 1 | | | | | | | | | | | | | | -| | Historical Value 1,1 | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,2 | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,3 | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,4 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Precision N | | | | | | | | | | Historical Scale N | | | | | | | | | | | | | | -| | Historical Value N,1 | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,2 | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,3 | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,4 | | | | | | | | | | | | | | | | | | | | | | | | - -Reports to Follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. Operating Status Indication (1 bit) - -The Operating Status Indication bit is used to indicate that the reported meter data is measured while the meter is in a operating status different from Normal e.g. accuracy warning or clock not accurate. - -Setting the bit to 1 means that the meter is operating in a status different from Normal. Setting the bit to 0 means that the meter is operating in Normal mode. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](../04.47-meter-command-class-version-2.md#4475-meter-report-command) - -If the Meter Type is Submeter, the Rate Type MUST be set to Import to indicate consumption. - -Dataset (24 bits) - -This command parameter is defined in a bitmap format and holds values and combinations of the meters dataset. If no historical data has been registered for the period requested by the Meter Table Historical Data Get Command, all fields of this parameter must be set to ‘0’ AND no “Historical” parameters are to be included in the Meter Table Historical Data Report Command i.e. the command parameters ends after [“Dataset”. Refer to Table 68.](../04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Historical Year (16 bits) - -Specify for the dataset the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Historical Month (8 bits) - -Specify for the dataset the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that an accumulated value is not determined yet. - -Historical Day (8 bits) - -Specify for the dataset the day of the month between 01 and 31. - -Historical Hour Local Time (8 bits) - -Specify for the dataset the number of complete hours that have passed since midnight (00-23) in local time. - -Historical Minute Local Time (8 bits) - -Specify for the dataset the number of complete minutes that have passed since the start of the hour (00- 59) in local time. - -Historical Second Local Time (8 bits) - -Specify for the dataset the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. Historical Precision (3 bits) - -The Historical Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Historical Scale (5 bits) - -The Historical Scale used to indicate the scale (unit) of the reported parameter. The Historical Scale parameter is of the variable type Meter Scale [; refer to Section 4.52.13 for a definition of the variable.](../04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) - -Historical Value - -The Historical Value is a 32 bit signed field defined by dataset requested field. The first byte (Value 1) is [the most significant byte. Table 10 shows signed decimal values together with their hexadecimal](../../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) equivalents. - -NOTICE: The device receiving the Meter Table Historical Data Report must always show the value even though the Scale is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/index.md b/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/index.md deleted file mode 100644 index c3433b5..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.53-meter-table-monitor-command-class-version-2/index.md +++ /dev/null @@ -1,28 +0,0 @@ - -# 4.53 Meter Table Monitor Command Class, version 2 - -The Meter Table Monitor Command Class defines the Commands necessary to read historical and accumulated values in physical units from a water meter or other metering device (gas, electric etc.) or electric sub-metering device and thereby enabling automatic meter reading capabilities - -## Contents - -- [4.53.1 Meter Table Point Adm. Number Get Command](04.53.01-meter-table-point-adm-number-get-command.md) -- [4.53.2 Meter Table Point Adm. Number Report Command](04.53.02-meter-table-point-adm-number-report-command.md) -- [4.53.3 Meter Table ID Get Command](04.53.03-meter-table-id-get-command.md) -- [4.53.4 Meter Table ID Report Command](04.53.04-meter-table-id-report-command.md) -- [4.53.5 Meter Table Capability Get Command](04.53.05-meter-table-capability-get-command.md) -- [4.53.6 Meter Table Capability Report Command](04.53.06-meter-table-capability-report-command.md) -- [4.53.7 Meter Table Status Supported Get Command](04.53.07-meter-table-status-supported-get-command.md) -- [4.53.8 Meter Table Status Supported Report Command](04.53.08-meter-table-status-supported-report-command.md) -- [4.53.9 Meter Table Status Depth Get Command](04.53.09-meter-table-status-depth-get-command.md) -- [4.53.10 Meter Table Status Date Get Command](04.53.10-meter-table-status-date-get-command.md) -- [4.53.11 Meter Table Status Report Command](04.53.11-meter-table-status-report-command.md) -- [4.53.12 Meter Table Current Data Get Command](04.53.12-meter-table-current-data-get-command.md) -- [4.53.13 Meter Table Current Data Report Command](04.53.13-meter-table-current-data-report-command.md) -- [4.53.14 Meter Table Historical Data Get Command](04.53.14-meter-table-historical-data-get-command.md) -- [4.53.15 Meter Table Historical Data Report Command](04.53.15-meter-table-historical-data-report-command.md) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.54-meter-table-push-configuration-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.54-meter-table-push-configuration-command-class-version-1.md deleted file mode 100644 index d608c26..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.54-meter-table-push-configuration-command-class-version-1.md +++ /dev/null @@ -1,104 +0,0 @@ - -# 4.54 Meter Table Push Configuration Command Class version 1 - -The Meter Table Push Configuration Command Class is used to configure the meter to send a Current Data Report at a given interval. The meter may be configured to return different data sets at different intervals using both the primary and secondary push commands. - -## 4.54.1 Meter Table Push Configuration Set Command - -This command is used to request the meter to send a Current Data Report at a given interval. The meter may be configured to return different data sets at different intervals using both the primary and secondary push commands. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL PUSH _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL PUSH CONFIGURATION SET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | P/S | | | Operating Status Push Mode | | | | | | | | | | | | -| Push Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Push Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Push Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Months | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Days | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Hours | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| Push Node ID | | | | | | | | | | | | | | | | | | | | | | | | - -Operating Status Push Mode (4 bits) - -[This field is used to configure if the Meter Table Status Report Command (refer to 4.52.11) participates in](04.52-meter-table-monitor-command-class-version-1/04.52.11-meter-table-status-report-command.md#45211-meter-table-status-report-command) the Push Functionality - -| | Operating Status Push Mode Identifier | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Operating Status push disabled | | | -| 0x01 | | | Operating Status push based on Interval | | | -| 0x02 | | | Operating Status push based on Status Change | | | -| 0x03 | | | Operating Status push Based on Interval AND status change | | | -| 0x04-0x0F | | | Reserved | | | - -P/S (1 bit) - -| | P/S | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Primary push configuration | | | -| 0x01 | | | Secondary push configuration | | | - -Push Dataset (24 bits) - -The Push Dataset parameter is use to indicate which parameters are requested to be pushed from the [meter. This field MUST be encoded according to Table 68.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Interval Months (8 bits) - -Specify the number of months between pushing the push dataset. - -Interval Day (8 bits) - -Specify the number of days between pushing the push dataset. - -Interval Hours (8 bits) - -Specify the number of hours between pushing the push dataset. - -Interval Minute (8 bits) - -Specify the number of minutes between pushing the push dataset. - -Push Node ID (8 bits) - -Specify the node ID of the node to receive push dataset in the given interval. - -## 4.54.2 Meter Table Push Configuration Get Command - -This command is used to request the meters push configuration - -The Meter Table Push Configuration Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL PUSH _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL PUSH CONFIGURATION GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.54.3 Meter Table Push Configuration Report Command - -This command is used report the current Push Configuration - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER TBL PUSH _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER TBL PUSH CONFIGURATION REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | P/S | | | Operating Status Push Mode | | | | | | | | | | | | -| Push Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Push Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Push Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Months | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Days | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Hours | | | | | | | | | | | | | | | | | | | | | | | | -| Interval Minutes | | | | | | | | | | | | | | | | | | | | | | | | -| Push Node ID | | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to Meter Table Push Configuration Set Command (section 4.54.1) for detailed description of the](04.54-meter-table-push-configuration-command-class-version-1.md#4541-meter-table-push-configuration-set-command) fields. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md b/docs/specs/command-class-specification/04-command-class-definitions/04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md deleted file mode 100644 index b036f1d..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md +++ /dev/null @@ -1,74 +0,0 @@ - -# 4.55 Move To Position Window Covering Command Class, version 1 [OBSOLETED] - -THIS COMMAND CLASS HAS BEEN OBSOLETED - -New implementations MUST NOT support this command class. - -Window covering device implementations SHOULD support the Window Covering Command Class. - -The Move To Position Window Covering Command Class is used to control the position of a window covering device. - -The Move To Position Window Covering Command Class is an actuator control command class. [Refer to 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -## 4.55.1 Move To Position Set Command - -This command is used to instruct a window covering to move to a new position. - -| | 7 | | | 6 | | | 5 | | | 4 | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS MTP WINDOW COVERING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = MOVE TO POSITION SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -[The encoding of the Value field MUST be according to Table 71.](04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md#4551-move-to-position-set-command) - -Table 71, Move To Position Set :: Value - -| | Value | Level | | | State | | -| --- | --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | 0% | | Closed | | | -| 1..99 (0x01..0x63) | | Almost closed .. 100% Open | | Open | | | -| … | | reserved | | reserved | | | -| 255 (0xFF) | | 100% Open | | Open | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -## 4.55.2 Move To Position Get Command - -This command is used to request the status of a window covering device. - -The Move To Position Report command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS MTP WINDOW COVERING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = MOVE TO POSITION GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.55.3 Move To Position Report Command - -This command is used to advertise the status of a window covering device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS MTP WINDOW COVERING _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = MOVE TO POSITION REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Value | | | | | | | | | | | | | | | | | | | | | | | | - -Value (8 bits) - -[The encoding of the Value field MUST be according to Table 71.](04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md#4551-move-to-position-set-command) - -The Value field SHOULD advertise the current value of the device hardware; also while in transition to a new target value. - -A controlling device MUST NOT assume that the Value is identical to a value previously issued with a Set command when a transition has ended. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.56-multilevel-sensor-command-class-version-1-4.md b/docs/specs/command-class-specification/04-command-class-definitions/04.56-multilevel-sensor-command-class-version-1-4.md deleted file mode 100644 index 015937d..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.56-multilevel-sensor-command-class-version-1-4.md +++ /dev/null @@ -1,69 +0,0 @@ - -# 4.56 Multilevel Sensor Command Class, version 1-4 - -The Multilevel Sensor Command Class is used to advertise numerical sensor readings.. - -## 4.56.1 Multilevel Sensor Get Command - -This command is used to request the current reading from a multilevel sensor. - -The Multilevel Sensor Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.56.2 Multilevel Sensor Report Command - -This command is used by a supporting node to advertise its current sensor reading for its supported sensor type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Sensor Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Sensor Type (8 bits) - -This field is used to specify the sensor type of the actual sensor reading. - -[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) be used. - -A node MUST support as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type is specified [in [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) Precision (3 bits) - -This field is used to indicate how many decimal places are included the Sensor Value field. For example, the Sensor Value 1025 with precision 2 MUST be interpreted as equal to 10.25. - -Scale (2 bits) - -This field is used to indicate what scale is used for the actual sensor reading. - -[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) be used. - -A node MUST implement as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type [is specified in [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -Size (3 bits) - -This field is used to indicate the length in bytes of the Sensor Value field. This field MUST be set to 1, 2 or 4. - -Sensor Value (N bytes) - -This field is used to advertise the value of the actual sensor reading. - -The length of this field in bytes MUST be according to the Size field value. The first byte MUST be the most significant byte. [This field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -A controlling node receiving this command MUST always show the sensor value as is even though the Sensor Type and/or Scale are unknown. - -A controlling node SHOULD implement the capability to update its list of Sensor Type and Scales, so [that new Sensor Types and Scales added in [17] are not presented as unknown. If a controlling node](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) receives an unknown Sensor Type or Scale, it SHOULD allow the user to assign a free-text description to the sensor reading. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.57-multilevel-sensor-command-class-version-5-11.md b/docs/specs/command-class-specification/04-command-class-definitions/04.57-multilevel-sensor-command-class-version-5-11.md deleted file mode 100644 index 1aa711f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.57-multilevel-sensor-command-class-version-5-11.md +++ /dev/null @@ -1,312 +0,0 @@ - -# 4.57 Multilevel Sensor Command Class, Version 5-11 - -The Multilevel Sensor Command Class is used to advertise numerical sensor readings . - -## 4.57.1 Compatibility considerations - -A node supporting version 5 or newer may support several sensor types and advertise the readings for each of them. - -Version 5 of this command class is extended with the following functionality: - - A “get-supported” mechanism for the controlling device to interview the multilevel sensor for its supported sensor types and/or scales  Additional sensor type and scale fields to the Multilevel Sensor Get command to request for a specific sensor report  Additional sensor types and/or scales to the list of multilevel sensors - -Version 6 of this command class is extended with the following functionality: - - Additional sensor types - -Version 7 of this command class is extended with the following functionality: - - Additional sensor types - -Version 8 of this command class is extended with the following functionality: - - New Sensor Types and Scale Values for rotation and linear movement.  New Sensor Types and Scale Values for Smoke Density - -Multilevel Sensor Command Class, version 8 deprecates the Sensor Type “Angle Position”. - -Version 9 of this command class is extended with the following functionality: - - New Sensor Types and Scale Values for Water Flow and Water Pressure  New Sensor Types and Scale Values for RF Signal Strength - -Version 10 of this command class is extended with the following functionality: - - New Sensor Types and Scale Values for Particulate Matter 10 and Respiratory rate  New Scale Values for CO and VOC Sensors Types - -Version 11 of this command class is extended with the following functionality: - - New Sensor Types and Scale Values.  [Moved the list of assigned Sensor Types and Scale Values to an external registry [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command)  Deprecated the “General Purpose” Sensor Type - -### 4.57.1.1 Unknown Multilevel Sensor Types and Scales - -A controlling node SHOULD implement the capability to update its Multilevel sensor types and scales list, [so that new Types and Scales added in [17] are not presented as unknown. If a controlling node receives](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) an unknown Type or Scale, it SHOULD allow the user to assign a free-text description to that Type or Scale. - -## 4.57.2 Multilevel Sensor Get Supported Sensor Command - -This command is used to request the supported Sensor Types from a supporting node. - -The Multilevel Sensor Supported Sensor Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | 6 | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL SUPPORTED GET SENSOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | - -## 4.57.3 Multilevel Sensor Supported Sensor Report Command - -This command is used to advertise the supported Sensor Types by a supporting node. - -| | 7 | 6 | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL SUPPORTED SENSOR REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -This field is used to advertise the supported sensor types by sending node. - -This field MUST be treated as a bit mask and interpreted as follows: - - Bit 0 in Bit Mask 1 indicates if Sensor Type = Air Temperature (0x01) is supported  Bit 1 in Bit Mask 1 indicates if Sensor Type = General Purpose (0x02) is supported  Bit 2 in Bit Mask 1 indicates if Sensor Type = luminance (0x03) is supported  … - -[The list of Sensor Types is defined in [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -The value 1 MUST indicate that the corresponding Sensor Type is supported. The value 0 MUST indicate that the corresponding Sensor Type is not supported. - -It is only necessary to send the Bit Mask fields from 1 and up to the Bit Mask N indicating the last supported Sensor Type. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. - -Note that the mapping of bit 0 to Sensor Type = 1 differs from the support mapping used by the Notification Command Class. The Notification Command Class maps bit 1 to Notification Type =1. - -## 4.57.4 Multilevel Sensor Get Supported Scale Command - -This command is used to retrieve the supported scales of the specific sensor type from the Multilevel Sensor device. - -The Multilevel Sensor Supported Scale Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL SUPPORTED GET SCALE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | - -Sensor Type (8 bits) - -This field is used to request a given sensor type. - -If the specified sensor type is not supported, a receiving node SHOULD return a response with the Scale Bit Mask set to 0. - -## 4.57.5 Multilevel Sensor Supported Scale Report Command - -This command is used to advertise the supported scales of a specified multilevel sensor type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL SUPPORTED SCALE REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Scale Bit Mask | | | | | | | | | | | | - -Sensor Type (8 bits) - -This field is used to indicate the actual Sensor Type for which the supported scales are being advertised. - -Scale Bit Mask (4 bits) - -This field is used to advertise the supported scales for the actual sensor type. - -This field MUST be treated as a bit mask and interpreted as follow: - - Bit 0 indicates support for the first scale of the actual Sensor Type  Bit 1 indicates support for the second scale of the actual Sensor Type  … - -[The list of scales for a given sensor type is defined in [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -The value 1 MUST indicate that the corresponding scale is supported for the sensor type. The value 0 MUST indicate that the corresponding scale is not supported for the sensor type. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.57.6 Multilevel Sensor Get Command - -This command is used to request the current reading from a multilevel sensor. - -The Multilevel Sensor Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Scale | | | | | | Reserved | | | | | | | | | - -Sensor Type (8 bits) - -This field is used to request a node to report a reading for the specified sensor type. - -If this field is unspecified or a receiving node does not support the specified Sensor Type, it MUST reply with a pre-defined default Sensor Type and Scale. - -Scale (2 bits) - -This field is used to request a node to report a reading with a particular scale for the actual Sensor Type. - -A node receiving a non-supported scale for the actual Sensor Type MUST reply with a supported scale within the Sensor type. - -A sending node MUST ensure that the receiver supports the requested Sensor Types and/or Scales using the Multilevel Sensor Get Supported Sensor/Scale commands. - -Reserved - -These fields MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.57.7 Multilevel Sensor Report Command - -This command is used to advertise a multilevel sensor reading. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SENSOR MULTILEVEL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SENSOR MULTILEVEL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Type | | | | | | | | | | | | | | | | | | | | | | | | -| Precision | | | | | | | | | Scale | | | | | | Size | | | | | | | | | -| Sensor Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Sensor Value N | | | | | | | | | | | | | | | | | | | | | | | | - -Sensor Type (8 bits) - -This field is used to specify the sensor type of the actual sensor reading. - -[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) be used. - -A node MUST support as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type is specified [in [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -Precision (3 bits) - -This field is used to indicate how many decimal places are included the Sensor Value field. For example, the Sensor Value 1025 with precision 2 MUST be interpreted as equal to 10.25. - -Scale (2 bits) - -This field is used to indicate what scale is used for the actual sensor reading. - -[This field MUST be set to a value defined in [17]. Values not defined in [17] are reserved and MUST NOT](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) be used. - -A node MUST implement as a minimum the highest Multilevel Sensor Command Class version associated with the Scale and Type it supports. The minimum required version for each Scale and Type [is specified in [17].](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -Size (3 bits) - -This field is used to indicate the length in bytes of the Sensor Value field. This field MUST be set to 1, 2 or 4. Sensor Value (N bytes) - -This field is used to advertise the value of the actual sensor reading. - -The length of this field MUST be according to the Size field value. The first byte MUST be the most significant byte. [This field MUST be encoded using signed representation and comply with Table 10.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -A controlling node receiving this command MUST always show the sensor value as is even though the Sensor Type and/or Scale are unknown. - -A controlling node SHOULD implement the capability to update its list of Sensor Type and Scales, so [that new Sensor Types and Scales added in [17] are not presented as unknown. If a controlling node](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) receives an unknown Sensor Type or Scale, it SHOULD allow the user to assign a free-text description to the sensor reading. - -### 4.57.7.1 Detailed description: Sensor Types for Movement and Rotation - -A device may report position, velocity (position change over time) or acceleration (velocity change over time). Position, velocity and acceleration may all refer to a linear scale following an axis or a polar scale circling an axis. Position may be reported in an absolute or relative fashion. - -[The 3D reference coordinate system outlined in Figure 9 MUST be used for reporting changes in the](04.57-multilevel-sensor-command-class-version-5-11.md#45771-detailed-description-sensor-types-for-movement-and-rotation) physical orientation. - -![Figure 9, 3D reference coordinate system](assets/img-7e17d638c6.png) - -Information relating to linear position, velocity and acceleration MUST refer to the zero position on a given axis. Thus a position change or a velocity MUST be positive if moving towards a larger position, measured from the zero position. - -Information relating to an angle or change in angle MUST use the right-hand rule. This means that if one (virtually) grabs around an axis with the right hand, with the thumb in the direction of the axis, the angle increases in the direction of the index finger. Table 72, Definition of position, velocity or acceleration - -| | Application | | Definition | | -| --- | --- | --- | --- | --- | -| Linear position, absolute | | | Position with reference to 0 (e.g. 1 meter) | | -| Linear position, relative | | | Position with reference to previous position (e.g. 1 meter) | | -| Linear velocity | | | Position change per time unit (e.g. 1 meter/second) | | -| Linear acceleration | | | Velocity change per time unit (e.g. 1 meter/second2) | | -| Polar position, absolute | | | Angle with reference to 0 (e.g. 45 degrees) | | -| Polar position, relative | | | Angle with reference to previous angle (e.g. 45 degrees) | | -| Polar velocity (rotation) | | | Angle change per time unit (e.g. 1 degree/second) | | -| Polar acceleration | | | Velocity change per time unit (e.g. 1 degree/second2) | | - -Depending on the number of axes supported by a given device, changes in the physical orientation are [mapped to one, two or three axes as outlined in Table 73.](04.57-multilevel-sensor-command-class-version-5-11.md#45771-detailed-description-sensor-types-for-movement-and-rotation) - -Table 73, Mapping of 1D, 2D and 3D movement and rotation - -| | Dimensions | | | Movement | | | Rotation | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | | | Along X axis | | | Around X axis | | | -| 2 | | | Along X and Y axes | | | Around X and Y axes | | | -| 3 | | | Along X, Y and Z axes | | | Around X, Y and Z axes | | | - -A number of Sensor Types allow a device to report changes in the physical orientation. - -Table 74, Recommended Sensor Types for reporting movement and rotation - -| | Application | | Sensor Type | | | Intended usage | | -| --- | --- | --- | --- | --- | --- | --- | --- | -| 1D Linear position, absolute | | Distance (v3) | | | Single axis measurement of position (m) | | | -| 1D Linear position, relative | | (no support) | | | Single axis measurement of position change (m) | | | -| 1D Linear velocity | | Velocity (v2) | | | Single axis measurement of velocity (m/s) | | | -| 1D Linear accelleration | | Acceleration, X (v8) | | | Single axis measurement of acceleration (m/s2) | | | -| 1D Polar position, absolute | | Direction (v2) | | | Single axis measurement of angle (degrees) | | | -| 1D Polar position, relative | | (no support) | | | Single axis measurement of angle change | | | -| 1D Polar velocity | | Rotation (v5) | | | Single axis measurement of velocity (RPM) | | | -| 1D Polar accelleration | | (no support) | | | Single axis measurement of acceleration (degree/s2) | | | - -| | Application | | | Sensor Type | | | Intended usage | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 2D Linear position, absolute | | | (no support) | | | Two axis measurement of position (m) | | | -| 2D Linear position, relative | | | (no support) | | | Two axis measurement of position change (m) | | | -| 2D Linear velocity | | | (no support) | | | Two axis measurement of velocity (m/s) | | | -| 2D Linear accelleration | | | Acceleration, X (v8), Acceleration, Y (v8) | | | Two axis measurement of acceleration (m/s2) | | | -| 2D Polar position, absolute | | | (no support) | | | Two axis measurement of angle (degrees from North) | | | -| 2D Polar position, relative | | | (no support) | | | Two axis measurement of angle change | | | -| 2D Polar velocity | | | (no support) | | | Two axis measurement of velocity (RPM) | | | -| 2D Polar accelleration | | | (no support) | | | Two axis measurement of acceleration (degree/s2) | | | -| 3D Linear position, absolute | | | (no support) | | | Three axis measurement of position (m) | | | -| 3D Linear position, relative | | | (no support) | | | Three axis measurement of position change (m) | | | -| 3D Linear velocity | | | (no support) | | | Three axis measurement of velocity (m/s) | | | -| 3D Linear accelleration | | | Acceleration, X (v8), Acceleration, Y (v8), Acceleration, Z (v8) | | | Three axis measurement of acceleration (m/s2) | | | -| 3D Polar position, absolute | | | (no support) | | | Three axis measurement of angle (degrees from North) | | | -| 3D Polar position, relative | | | (no support) | | | Three axis measurement of angle change | | | -| 3D Polar velocity | | | (no support) | | | Three axis measurement of velocity (RPM) | | | -| 3D Polar accelleration | | | (no support) | | | Three axis measurement of acceleration (degree/s2) | | | - -4.57.7.1.1 Sensor Type = Acceleration The sensor types “Acceleration, X”, “Acceleration, Y” and “Acceleration, Z” are used to advertise the acceleration of a device along the X, Y and Z axes, respectively. - -A one-dimensional device MUST report acceleration using the “Acceleration, X” type. - -A two-dimensional device MUST report acceleration using the “Acceleration, X” and “Acceleration, Y” types. - -2 2 The Scale used MUST be m/s. An Acceleration value reported with the Scale m/s may be converted by [a receiving node to a “g-force” level by using the formula outlined in Figure 10.](04.57-multilevel-sensor-command-class-version-5-11.md#45771-detailed-description-sensor-types-for-movement-and-rotation) - -2 1g = 9.81m/s - -(g represents the unit of Earth Gravity; NOT the weight unit “gram”) - -2 Figure 10, Converting from m/s to g-force - -### 4.57.7.2 Detailed description: Smoke Density - -[Figure 11 shows the principle of how a photoelectric smoke detector works. As shown the smoke sensor](04.57-multilevel-sensor-command-class-version-5-11.md#45772-detailed-description-smoke-density) uses the smoke to reflect the light onto a photo cell. So when no smoke is present, the light will not be reflected onto the photo cell. When smoke is present, the light will be reflected onto the photo cell. Dependent on the smoke density, more light will be reflected onto the photo cell. So by measuring the received light strength on the photo cell, it is possible to estimate the smoke density. - -It is not possible to determine an accurate unit for this, as it is estimated from the light strength on the photo cell. So the exact particle density of the smoke is not known. Also the light strength interval measured on the photo cell, may vary between sensors. So it is decided to report the smoke density in percent, where 0% is no smoke and 100% is the maximum received light strength on the photo cell. - -![Figure 11, Photoelectric smoke detector](assets/img-8ec64d3ea0.jpeg) - -### 4.57.7.3 Detailed description: RF Signal Strength - -The RF Signal Strength sensor type may report values using two different scales. While the dBm is a well-defined unit, the RSSI value represents a relative measurement where the internal sampling circuits and the actual sampling method is product specific. The RSSI value MUST be reported in the range 0..100, where the value 100 represents the highest power level that can be measured. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.04-notification-set-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.04-notification-set-command.md deleted file mode 100644 index 32ffb03..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.04-notification-set-command.md +++ /dev/null @@ -1,54 +0,0 @@ - -# 4.63.4 Notification Set Command - -Push nodes: - -This command is used to enable or disable the unsolicited transmission of a specific Notification Type. - -Pull nodes: - -This command is used to clear a persistent Notification in the notification queue. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = NOTIFICATION SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Notification Type | | | | | | | | | | | | | | | | | | | | | | | | -| Notification Status | | | | | | | | | | | | | | | | | | | | | | | | - -Notification Type (8 bits) - -[This field is used to specify a Notification Type. Assigned values are defined in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -A sending node MUST specify a Notification Type that is supported by a receiving node. - -A receiving node MUST ignore the command if this field is set to a non-supported Notification Type or if this field set to 0xFF. - -Notification Status (8 bits) - -Push nodes: - -This field is used to set the Status of a Notification Type. [This field MUST comply with Table 86.](04.63.04-notification-set-command.md#4634-notification-set-command) - -Table 86, Notification Set::Notification Status (push mode) - -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Unsolicited messages MUST be disabled for the specified Notification Type | | | 2 | | | -| 0xFF | | | Unsolicited messages MUST be enabled for the specified Notification Type | | | 2 | | | - -0x00 Unsolicited messages MUST be disabled for the specified Notification Type 2 CC:0071.03.06.11.004 - -CC:0071.03.06.11.005 0xFF Unsolicited messages MUST be enabled for the specified Notification Type 2 All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -A receiving node MAY deny the deactivation of a specific Notification Type. In that case, the receiving node MUST respond to this command with an Application Rejected Request Command. Thus, if a node can deny the deactivation of a Notification Type, the node MUST implement the Application Status CC. A sending node should be aware that a receiving node may return a response to the Set Command and thus SHOULD apply a back-off timer before sending a subsequent command. Pull nodes: - -A sending node MUST set this field to 0x00 to indicate that a persistent Notification for the specified Notification Type MUST be cleared in the receiving node’s queue. - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.06-notification-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.06-notification-report-command.md deleted file mode 100644 index 939f423..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.06-notification-report-command.md +++ /dev/null @@ -1,157 +0,0 @@ - -# 4.63.6 Notification Report Command - -Push nodes: - -This command is used for two purposes:  If this command is returned in response to a Notification Get Command, this command advertises if the unsolicited transmission of the advertised Notification Type is enabled and optionally advertises a currently active state.  If this command is sent unsolicited, it advertises an event or state Notification. - -The use of the command’s fields is the same in both cases. - -Pull nodes: - -This command is used by a sending node to return a Notification from its queue or indicate that its queue is empty. - -| | 7 | | | 6 | | | 5 | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = NOTIFICATION REPORT _ | | | | | | | | | | | | | | | | | | | | | | -| V1 Alarm Type | | | | | | | | | | | | | | | | | | | | | | -| V1 Alarm Level | | | | | | | | | | | | | | | | | | | | | | -| | Reserved | | | | | | | | | | | | | | | | | | | | | -| | Notification Status | | | | | | | | | | | | | | | | | | | | | -| | Notification Type | | | | | | | | | | | | | | | | | | | | | -| | Notification Event / State | | | | | | | | | | | | | | | | | | | | | -| | Sequence | | | Reserved | | | | Event / State Parameters Length | | | | | | | | | | | | | | -| Event /State Parameter 1 (optional) | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | -| Event / State Parameter N (optional) | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number (optional) | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -V1 Alarm Type (8 bits) & V1 Alarm Level (8 bits) - -These fields carry the proprietary Alarm Type and Alarm Level fields originally introduced with Alarm Command Class, Version 1. V1 Alarm Type and V1 Alarm Level fields MUST be specified in the product manual. - -If the V1 Alarm Type is not supported, these fields MUST be set to 0x00. Notification Status (8 bits) - -Push nodes: - -This field is used to advertise the status of the Notification Type indicated in this command. [This field MUST comply with Table 87.](04.63.06-notification-report-command.md#4636-notification-report-command) - -[Table 87, Notification Report::Notification Status (push nodes)](04.63.06-notification-report-command.md#4636-notification-report-command) - -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Unsolicited transmissions are disabled for the specified Notification Type | | | 2 | | | -| 0xFF | | | Unsolicited transmissions are enabled for the specified Notification Type | | | 2 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Pull nodes: - -This field is used to advertise the status of the sending node’s Notification queue. [This field MUST comply with Table 88](04.63.06-notification-report-command.md#4636-notification-report-command) - -Table 88, Notification Report::Notification Status (pull nodes) - -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | This command carries a valid Notification returned from the queue. There may be more Notifications queued up. This Notification MAY be persistent. | | | 2 | | | -| 0xFE | | | This command does not carry any valid Notification and the event queue is empty | | | 3 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Notification Type (8 bits) - -[This field is used to advertise the Notification Type. Assigned values are defined in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -A sending node MUST set this field to the Notification Type of the actual Notification. - -Notification Event / State (8 bits) - -This field is used to specify a Notification Event/State for the advertised Notification Type. Assigned [values are defined in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -A node advertising a Notification MUST set this field to the actual Notification event/state. - -Sequence (1 bit) - -This field is used to advertise the presence of the “Sequence Number” field. - -The value 0 MUST indicate that no “Sequence Number” field is appended after the “Event / State Parameter” field. The value 1 MUST indicate that a “Sequence Number” field is appended after the “Event / State Parameter” field. Event / State Parameters Length (5 bits) - -This field is used to advertise the length in bytes of the Event / State Parameters field. - -The value 0 MUST indicate that no Event / State Parameter field is appended after the Event Parameters Length field. Values in the range 1..31 MUST indicate the length of the Event / State Parameter field appended after the Event / State Parameters Length field. - -Event / State Parameter (N bytes) - -The Event / State Parameter field is used to specify associated parameters to a Notification. - -[Parameters for each Event/State Notification are defined in [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -This field MAY carry an encapsulated command. In this case, the field MUST include the complete command structure, i.e. Command Class, Command and all mandatory command fields. - -If a node encapsulates a command in this field, the corresponding Command Class MUST be supported by the node and advertised in the Node Information Frame (NIF) or S0/S2 Supported Command Report. - -This field MUST be omitted if the “Event Parameter Length” field is set to 0. - -[4.63.6.1 provides an example of Event Parameter encapsulation.](04.63.06-notification-report-command.md#46361-event-state-parameter-encapsulation) - -Sequence Number (8 bits) - -This field is used to advertise a sequence number for the actual Notification. This command MAY carry a Sequence Number field. - -This field MUST be omitted if the Sequence flag is set to 0. - -The first sequence number for each distinct Notification MUST be 1. A sending node MUST increment the sequence number for a Notification each time it issues a Notification Report for that given Notification. - -The Sequence Number range MUST be in the range 0..255. The value after 255 MUST be 0. - -Example: - -1. Notification {Smoke Alarm::Smoke Detected}, …, Seq. Number = 254 2. Notification {Smoke Alarm::Smoke Detected}, …, Seq. Number = 255 3. Notification {Heat Alarm::Overheat Detected}, …, Seq. Number = 6 4. Notification {Smoke Alarm::Smoke Detected}, …, Seq. Number = 0 5. Etc. - -## 4.63.6.1 Event / State parameter encapsulation - -Event / State parameter encapsulation of commands MUST comprise the entire command, starting from the Command Class identifier. - -For example, a “User Code Report” is used as Event / State Parameter in a “Keypad Lock/Unlock Operation”. The “User Code Report” has the following format: - - Command Class = = 0x63 COMMAND_CLASS_USER_CODE  Command = = 0x03 USER_CODE_REPORT  User Identifier = 0x01  User ID Status = 0x01  User Code = 0x30, 0x30, 0x30, 0x30 - -The complete User Code Report therefore comprises the following Bytes: [0x63, 0x03, 0x01, 0x01, 0x30, 0x30, 0x30, 0x30]. - -[Another example with the Node naming and location Command class is given in Table 89.](04.63.06-notification-report-command.md#46361-event-state-parameter-encapsulation) - -Table 89, Notification Report::Event / State parameter encapsulation (example) - -| | Notification Report Command fields | | | | Value | | | Explanation | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 1 | | COMMAND CLASS NOTIFICATION _ _ | | 0x71 | | | Notification CC id | | | -| 2 | | NOTIFICATION REPORT _ | | 0x05 | | | Notification Report command id | | | -| 3 | | V1 Alarm Type | | 0x00 | | | Not implemented | | | -| 4 | | V1 Alarm Level | | 0x00 | | | Not implemented | | | -| 5 | | Reserved | | 0x00 | | | Reserved field | | | -| 6 | | Notification Status | | 0xFF | | | Unsolicited report is activated | | | -| 7 | | Notification Type | | 0x01 | | | Smoke Alarm | | | -| 8 | | Notification Event | | 0x01 | | | Smoke Detected | | | -| 9 | | Sequence Number / Event Parameters Length | | 0x1A | | | Sequence Number is appended / Event Parm Length = 10 | | | -| 10 | | Event Parm 1 | | 0x77 | | | Node Naming & Location CC id | | | -| 11 | | Event Parm 2 | | 0x06 | | | Node Location Report command id | | | -| 12 | | Event Parm 3 | | 0x00 | | | Cmd Parm: Char = ASCII | | | -| 13 | | Event Parm 4 | | 0x4B | | | Cmd Parm: Node Location Char 1 = K | | | -| 14 | | Event Parm 5 | | 0x49 | | | Cmd Parm: Node Location Char 2 = I | | | -| 15 | | Event Parm 6 | | 0x54 | | | Cmd Parm: Node Location Char 3 = T | | | -| 16 | | Event Parm 7 | | 0x43 | | | Cmd Parm: Node Location Char 4 = C | | | -| 17 | | Event Parm 8 | | 0x48 | | | Cmd Parm: Node Location Char 5 = H | | | -| 18 | | Event Parm 9 | | 0x45 | | | Cmd Parm: Node Location Char 6 = E | | | -| 19 | | Event Parm 10 | | 0x4E | | | Cmd Parm: Node Location Char 7 = N | | | -| 20 | | Sequence Number | | 0x0F | | | Sequence Number = 15 | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.08-notification-supported-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.08-notification-supported-report-command.md deleted file mode 100644 index 696ff5d..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.08-notification-supported-report-command.md +++ /dev/null @@ -1,39 +0,0 @@ - -# 4.63.8 Notification Supported Report Command - -This command is used to advertise supported Notification Types. - -| | 7 | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = NOTIFICATION SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | -| | V1 Alarm | Reserved | | | | | Number of Bit Masks | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | - -V1 Alarm (1 bit) - -This field is used to indicate if the node implements proprietary Alarms from version 1. - -The value 0 MUST indicate that the device implements only Notification CC V2 or newer Notification Types. The value 1 MUST indicate that the device implements Notification CC V2 Notification Types as well as proprietary Alarm CC V1 Alarm Types and Alarm Levels. - -Number of Bit Masks (5 bits) - -This field MUST advertise the length in bytes of the Bit Mask field. The value MUST be in the range 1..31. Bit Mask (N bytes) - -The Bit Mask field describes the supported Notification Types by the node. The length of this field in bytes MUST match the value advertised in the Number of Bit Masks field. - - Bit 0 in Bit Mask 1 is not allocated to any Notification Type and MUST be set to zero.  Bit 1 in Bit Mask 1 indicates if Notification Type = Smoke Alarm (0x01) is supported.  Bit 2 in Bit Mask 1 indicates if Notification Type = CO Alarm (0x02) is supported.  Bit 3 in Bit Mask 1 indicates if Notification Type = CO Alarm (0x03) is supported 2  … - -[For Notification Types, refer to [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -If the Notification Type is supported, the corresponding bit MUST be set to 1. If the Notification Type is not supported, the corresponding bit MUST be set to 0. - -The Notification Type values 0x00 and 0xFF are special-purpose values. Reserved values and special- purpose values MUST NOT be advertised in the Bit Mask field by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.09-event-supported-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.09-event-supported-get-command.md deleted file mode 100644 index bfe811d..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.09-event-supported-get-command.md +++ /dev/null @@ -1,26 +0,0 @@ - -# 4.63.9 Event Supported Get Command - -This command is used to request the supported Notifications for a specified Notification Type. - -The Event Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = EVENT SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Notification Type | | | | | | | | | | | | | | | | | | | | | | | | - -Notification Type (8 bits) - -[For Notifications Types, refer to [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -If a node receives an unsupported Notification Type or a special-purpose value, the receiving node [MUST respond with Event Supported Report Command with the Notification Type specified in the this](04.63.10-event-supported-report-command.md#46310-event-supported-report-command) command and the Number of Bit Masks field set to 0. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.10-event-supported-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.10-event-supported-report-command.md deleted file mode 100644 index d03f285..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.10-event-supported-report-command.md +++ /dev/null @@ -1,44 +0,0 @@ - -# 4.63.10 Event Supported Report Command - -This command is used to advertise supported events/states for a specified Notification Type. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS NOTIFICATION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = EVENT SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Notification Type | | | | | | | | | | | | | | | | | | | | | | | | -| | Reserved | | | | | | | | | Number of Bit Masks | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Notification Type (8 bits) - -[For Notifications Types, refer to [18].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -Number of Bit Masks (5 bits) - -This field is used to advertise the length (in bytes) of the Bit Mask field. - -The value MUST be in the range 0..31. The value 0 MUST indicate that the Notification Type is not supported. - -Bit Mask (N bytes) - -This field is used to advertise the supported Events/States for the actual advertised Notification Type. The length of this field (in bytes) MUST match the value advertised in the Number of Bit Masks field. This field MUST be omitted if the “Number of Bit Masks” field is set to 0. - -The bit value ‘1’ MUST indicate that the actual Event/State is supported. The bit value ‘0’ MUST indicate that the actual Event/State is not supported. - -Example: Notification Type = Heat Alarm (0x04): - - Bit 0 in Bit Mask 1 field is not allocated to any event and must therefore be set to zero.  Bit 1 in Bit Mask 1 field indicates support for Overheat detected (0x01).  Bit 2 in Bit Mask 1 field indicates support for Overheat, unknown loc. (0x02).  Bit 3 in Bit Mask 1 field indicates support for Rapid temp rise (0x03).  … - -[For Notification Types and their Events/States, refer to [18][17].](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -The Event/State values 0x00 and 0xFE are special-purpose values. Reserved values and special- purpose values MUST NOT be advertised in the Bit Mask field by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.11-controller-guidelines.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.11-controller-guidelines.md deleted file mode 100644 index 484f52c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/04.63.11-controller-guidelines.md +++ /dev/null @@ -1,114 +0,0 @@ - -# 4.63.11 Controller guidelines - -This section presents guidelines for controlling legacy sensors nodes supporting the Notification Command Class, version 3-8. - -Alarm Command Class version 2 supporting nodes operate in Push mode only. The guidelines [presented in 4.63.11.6 Controlling Push Mode Sensors can also be used for controlling Alarm CC](04.63.11-controller-guidelines.md#463116-controlling-push-mode-sensors) version 2 supporting nodes. - -## 4.63.11.1 Sensor database - -The following sections present discovery methods for sensor properties, such as Push/Pull mode or the use of state idle notifications. Some sensor properties (e.g. configuration parameters, Association group properties, state variables dependencies) cannot always be discovered. - -A public database of known certified Notification sensors is available and can be consulted first before attempting to probe a supporting node. If the supporting node is present in the database, a controlling node SHOULD read the sensor properties from the database and skip any discovery. - -## 4.63.11.2 Push/Pull mode discovery - -A supporting node does not advertise whether it operates in Push or Pull mode. Therefore a controlling node SHOULD probe a supporting node in order to discover which mode it implements. The RECOMMENDED discovery steps for a controlling node are the following: - -If the supporting node does not support the Association Command Class, it may be concluded that the supporting node implements Pull Mode and discovery may be aborted. - -If the supporting node supports the AGI Command Class, probe the AGI table in the following way: - -1. Discover how many Association groups the supporting node (and its eventual End Points) implements by issuing an Association Supported Groupings Get Command. 2. For each association group, issue an Association Group Command List Get for the grouping identifier. Inspect the returned Association Group Command List Report and look for the following pair: {Command Class x = Command x =. COMMAND_CLASS_NOTIFICATION, NOTIFICATION_REPORT} If a match is found, conclude that the supporting node implements Push Mode and stop the discovery process. - -If no match is found at the end of the AGI test, conclude that the supporting node implements Pull Mode. [The AGI test is illustrated in Figure 22.](04.63.11-controller-guidelines.md#463112-pushpull-mode-discovery) - -![Figure 22, Push/Pull node discovery, AGI table probing](assets/img-0f5e748af7.png) - -If the supporting node does not support the AGI Command Class, proceed with the following Notification Command Class test: - -1. Discover the list of supported Notification Types by issuing a Notification Supported Get Command. 2. For each supported Notification Type, query the supported Events/States via the Event Supported Get Command. 3. Set the status of one of the Supported Notification Types at the target node using a Notification Set Command with the following values: a. Notification Type = (a supported type discovered in step 1) b. Notification Status = 0xFF 4. Issue a Notification Get Command with the following values: a. Notification Type = (Same as step 3.a). b. Notification Event = (a supported Event/State discovered in step 2). 5. The supporting node returns a Notification Report Command. a. If the Notification Status is 0xFF, the target node implements Push Mode b. If the Notification Status is 0xFE or 0x00, the target node implements Pull Mode c. If the target node did not return a report within 10 seconds, it implements Pull Mode - -[The Notification Command Class test is illustrated in Figure 23.](04.63.11-controller-guidelines.md#463112-pushpull-mode-discovery) - -![Figure 23, Push/Pull node discovery, Notification Command Class test](assets/img-5e2a35351b.png) - -## 4.63.11.3 Unknown Notifications - -A controlling node SHOULD implement the capability to update its Notifications list, so that new [Notifications added in [18] are not presented as unknown. If a controlling node receives an unknown](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) Notification, it SHOULD allow the user to assign a free-text description to that Notification. - -It is RECOMMENDED to treat an unknown Notification as its own state variable. - -## 4.63.11.4 State idle - -A controlling node receiving a “State idle” Notification for an event or state of which the “State idle” [Notification does not apply (e.g. the “heartbeat” event) SHOULD ignore the Notification. Refer to [18] for](../04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) state variables to which the “State idle” notification applies. - -It is not mandatory for nodes supporting Notification Command Class, version 7 or older to send a “State idle” Notification for returning a state variable to idle. Thus, there is a risk that a “State idle” is never sent. A controlling node SHOULD NOT use timeouts to consider a state variable to be idle for example 5 minutes after the last received Notification. It MAY allow the user to mark states variables as idle. - -## 4.63.11.5 Parameter encapsulation - -A node implementing version 5 or older MAY use the following parameter encapsulation format: (User ID, User Code Report Command) instead of (User Code Report Command). - -A controlling node SHOULD accept the User Code Report Event Parameter with a User ID byte prefixed at the beginning of the Notification Event Parameter for backwards compatibility. A controlling node can detect the beginning of the User Code Report by finding the following consecutive bytes: {byte x=, byte x+1 = }. COMMAND_CLASS_USER_CODE USER_CODE_REPORT - -## 4.63.11.6 Controlling Push Mode Sensors - -The following sections present guidelines for controlling Push sensors nodes. - -4.63.11.6.1 Notification Get Command This command MAY be used at the initial node interview or for checking if unsolicited transmissions are enabled for a specified Notification Type. This command cannot be used to query what state is currently active at the receiving node. - -Below are recommendations for what values controlling nodes should set in the fields of this command. - -Notification Type (8 bits) - -A controlling node SHOULD set this field to a Notification Type supported by the receiving node A controlling node SHOULD NOT set the Notification Type field to 0xFF. - -Earlier specification text mandated that Push nodes return an answer to Notification Get (Type=0xFF, Event/State=0x00), i.e. not specifying an actual event type, without clearly describing what the required response is. - -Notification Event / State (8 bits) - -A controlling node SHOULD set this field to 0x00. - -4.63.11.6.2 Enabling/disabling Notification Types [Push node notifications via the Association Groups can be enabled or disabled. Figure 24 shows an](04.63.11-controller-guidelines.md#463116-controlling-push-mode-sensors) example for enabling/disabling unsolicited messages for a Notification Type. - -[Figure 24 assumes that the controlling node is the Lifeline Association Group (or other Association](04.63.11-controller-guidelines.md#463116-controlling-push-mode-sensors) Group sending Notification Report) destination. - -![Figure 24, Enabling/Disabling events from a push node](assets/img-ac16ca2e4f.png) - -## 4.63.11.7 Controlling Pull Mode Sensors - -The following sections present guidelines for controlling Pull sensors nodes. - -4.63.11.7.1 Notification Get Command This command is used to retrieve the next Notification from the receiving node’s queue. Below are recommendations for what values controlling nodes should set in the fields of this command. - -Notification Type (8 bits) - -A sending node SHOULD set the Notification Type field to 0xFF. - -Earlier specification text suggested that Pull nodes must not ignore this command if the Notification Type is set to a supported type; rather than 0xFF. Therefore, Pull sensors MAY respond to a Notification Get for a supported Notification type by retrieving the next notification in the queue matching the specified Notification Type. - -Notification Event /State (8 bits) - -This field SHOULD be set to 0x00. A receiving node will have an unpredictable behavior if this field is set to a supported Event. - -4.63.11.7.2 Detecting and clearing persistent notifications. It is OPTIONAL for Pull nodes to specify a sequence number in notifications. - -A controlling node receiving twice the same Notification with identical sequence number SHOULD [consider the Notification as persistent. An example is given in Figure 25.](04.63.11-controller-guidelines.md#463117-controlling-pull-mode-sensors) - -![Figure 25, detecting and clearing persistent notifications, identical sequence numbers](assets/img-68e758a97d.png) - -Due to unclear specification text, sensors may issue persistent Notifications without a sequence number field or with a new sequence number every time. Therefore, a controlling node SHOULD consider an notification to be persistent if it receives the same Notification 5 times or more. An example is given in [Figure 26.](04.63.11-controller-guidelines.md#463117-controlling-pull-mode-sensors) - -![Figure 26, detecting and clearing persistent notifications with incremental sequence numbers](assets/img-0546536017.png) - -4.63.11.7.3 Status and queue empty A controlling node can stop issuing Notification Get Commands when receiving a Queue empty [notification (0xFE). Illustration is given in Figure 27.](04.63.11-controller-guidelines.md#463117-controlling-pull-mode-sensors) - -All fields following the Status field MAY be omitted in the Notification Report if it advertises a Status of 0xFE (queue empty). - -![Figure 27, Pull node event retrieval until receiving queue empty](assets/img-ec0eea3305.png) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/index.md b/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/index.md deleted file mode 100644 index dbaf7a9..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.63-notification-command-class-version-3-8/index.md +++ /dev/null @@ -1,30 +0,0 @@ - -# 4.63 Notification Command Class, version 3-8 - -THIS COMMAND CLASS VERSIONS 3-7 HAVE BEEN DEPRECATED - -A device MAY implement version 3 to 7, but it is RECOMMENDED that new implementations comply with Notification Command Class, version 8 - -The Notification Command Class is used to advertise events or states, such as movement detection, door open/close or system failure. The Notification Command Class supersedes the Alarm Command Class. - -[Controller designers should pay particular attention to sections 4.63.1 Terminology and](04.63.01-terminology.md#4631-terminology) [4.63.11 Controller guidelines.](04.63.11-controller-guidelines.md#46311-controller-guidelines) - -## Contents - -- [4.63.1 Terminology](04.63.01-terminology.md) -- [4.63.2 Compatibility considerations](04.63.02-compatibility-considerations.md) -- [4.63.3 Interoperability considerations](04.63.03-interoperability-considerations.md) -- [4.63.4 Notification Set Command](04.63.04-notification-set-command.md) -- [4.63.5 Notification Get Command](04.63.05-notification-get-command.md) -- [4.63.6 Notification Report Command](04.63.06-notification-report-command.md) -- [4.63.7 Notification Supported Get Command](04.63.07-notification-supported-get-command.md) -- [4.63.8 Notification Supported Report Command](04.63.08-notification-supported-report-command.md) -- [4.63.9 Event Supported Get Command](04.63.09-event-supported-get-command.md) -- [4.63.10 Event Supported Report Command](04.63.10-event-supported-report-command.md) -- [4.63.11 Controller guidelines](04.63.11-controller-guidelines.md) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.64-prepayment-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.64-prepayment-command-class-version-1.md deleted file mode 100644 index 5858210..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.64-prepayment-command-class-version-1.md +++ /dev/null @@ -1,141 +0,0 @@ - -# 4.64 Prepayment Command Class, version 1 - -The Prepayment Command Class defines the Commands necessary to implement a Z-Wave encapsulation of Prepayment data and to distribute prepayment information between devices - -## 4.64.1 Prepayment Balance Get Command - -This command is used to request the balance of the Prepayment. - -The Prepayment Balance Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PREPAYMENT BALANCE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Balance Type | | | | | | | Reserved | | | | | | | | | | | | | | | | | - -Balance Type (2 bits) - -The field specifies which balance type is requested in the response report. The available balance types [may be requested using the Prepayment Supported Get Command.](04.64-prepayment-command-class-version-1.md#4643-prepayment-supported-get-command) - -Table 90, Prepayment Balance Get::Balance Type encoding - -| | Value | | | Balance Type | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Utility Balance | | | -| 0x01 | | | Monetary Balance | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -## 4.64.2 Prepayment Balance Report Command - -This command is used to report the current balances. - -The report includes the following main elements: - - Balance  Debt  Emergency Credit - -The elements MAY be given in monetary values or in utility units depending on the Balance Type field. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PREPAYMENT BALANCE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Balance Type | | | | | | Meter type | | | | | | | | | | | | | | | | | | -| Balance Precision | | | | | | | | | Scale | | | | | | | | | | | | | | | -| Balance Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Balance Value 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Balance Value 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Balance Value 4 | | | | | | | | | | | | | | | | | | | | | | | | -| Debt Precision | | | | | | | | | Reserved | | | | | | | | | | | | | | | -| Debt 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Debt 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Debt 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Debt 4 | | | | | | | | | | | | | | | | | | | | | | | | -| Emer. Credit Precision | | | | | | | | | Reserved | | | | | | | | | | | | | | | -| Emer. Credit 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Emer. Credit 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Emer. Credit 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Emer. Credit 4 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Debt Recovery Percentage | | | | | | | | | | | | | | | | | | | | | | | | - -Balance Type (2 bits) - -The field specifies which type of balance is given in the report. - -[All available Balance Types may be found in the section 4.64.1 Prepayment Balance Get Command.](04.64-prepayment-command-class-version-1.md#4641-prepayment-balance-get-command) - -Meter Type (6 bits) - -Meter Type specifies the type of metering device the command originates. This field MUST be encoded [according to Table 66.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Scale (5 bits) - -The Scale used to indicate the scale (unit) of the balance, debt and emergency credit value in the report. Scale field only used for a report of type “Utility Balance”, for other reports set the scale to 0x1F. The Scale parameter is of the variable type Meter Scale [; refer to 4.52.13 Meter Table Current Data Report](04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) Command. Currency (3 bytes) - -This field advertises the currency code. Reports of the type “Monetary Balance” MUST advertise currency codes complying with ISO 4217. Other report types MUST advertise a currency code of “XXX”. - -Table 91, Prepayment Balance Report::Currency examples - -| | Currency Code | | | Currency 1 | | | Currency 2 | | | Currency 3 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Pound sterling (ISO 4217) | | | G | | | B | | | P | | | -| US Dollar (ISO 4217) | | | U | | | S | | | D | | | -| No Currency | | | X | | | X | | | X | | | - -Balance, Debt and Emergency Credit Precision (3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Balance, Debt and Emergency Credit (32 bits) - -The Balance, Debt and Emergency Credit fields MUST be encoded as 32-bit signed integers. The first [byte MUST carry most significant byte. Table 10 shows signed decimal values together with their](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) hexadecimal equivalents. - -Debt Recovery Percentage (8 bits) - -The Debt Recovery Percentage indicates the percentage of the payment that is for debt recovery. This can take the value from 0 – 50%, the value is always given with a precision of 0 decimal places. The value 0xFF indicates that this field is unspecified. - -This field is only used for only used for a report of type “Monetary Balance”. For other reports this field MUST be set to 0xFF (unspecified). - -## 4.64.3 Prepayment Supported Get Command - -The Prepayment Supported Get Command is used to request type of Balance Reports that are available in the device. - -The Prepayment Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PREPAYMENT SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.64.4 Prepayment Supported Report Command - -The Prepayment Supported Report Command reports the types of Balance Reports that are available in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PREPAYMENT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = Command = PREPAYMENT SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Bit Mask Balance Types Supported | | | | | | | | | | | | - -Bit Mask - Balance Types Supported (8 bits) - -The Bit Mask - Balance Types Supported byte describes the type of Balance Reports that are available in the device. - -Bit 0 in Bit Mask is used to indicate if the Balance Report Type “Utility Balance” is supported, 0 indicating not supported and 1 indicating supported. Bit 1 in the Bit Mask is used to indicate if the Balance Report Type “Monetary Balance” is available in the device, 0 indicating not supported and 1 indicating supported. - -[All available Balance Types may be found in the section 4.64.1 Prepayment Balance Get Command.](04.64-prepayment-command-class-version-1.md#4641-prepayment-balance-get-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.65-prepayment-encapsulation-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.65-prepayment-encapsulation-command-class-version-1.md deleted file mode 100644 index e11024a..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.65-prepayment-encapsulation-command-class-version-1.md +++ /dev/null @@ -1,26 +0,0 @@ - -# 4.65 Prepayment Encapsulation Command Class, version 1 - -The Prepayment Encapsulation Command Class is used to smartcard preinstalled security mechanisms. - -## 4.65.1 Prepayment Encapsulation Command - -This command is used to encapsulate Smart card related data communication (e.g. between a Card reader and Meter), allowing the smartcard preinstalled security mechanisms to be applied transparently to Z-Wave. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PREPAYMENT ENCAPSULATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = CMD ENCAPSULATION _ | | | | | | | | | | | | | | | | | | | | | | | | -| Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Data (N bytes) - -This field contains prepayment smart card data. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.66-proprietary-command-class-version-1-deprecated.md b/docs/specs/command-class-specification/04-command-class-definitions/04.66-proprietary-command-class-version-1-deprecated.md deleted file mode 100644 index bd9e025..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.66-proprietary-command-class-version-1-deprecated.md +++ /dev/null @@ -1,66 +0,0 @@ - -# 4.66 Proprietary Command Class, version 1 [DEPRECATED] - -THIS COMMAND CLASS HAS BEEN DEPRECATED - -A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Manufacturer Proprietary Command Class. If implementing this command class, it is RECOMMENDED that the Manufacturer Proprietary Command Class is also implemented. - -The Proprietary Command Class is used to transfer data between devices. The data content MUST be vendor specific and commands MUST NOT provide any value-add with respect to the Home Automation application in general. - -## 4.66.1 Proprietary Set Command - -This command is used to transfer data to a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROPRIETARY _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROPRIETARY SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Data (N bytes) - -The data fields may be used to set various data in the device. The number of data fields transmitted MUST be determined from the length field in the frame. - -## 4.66.2 Proprietary Get Command - -This command is used to request data from a device. - -The Proprietary Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROPRIETARY _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROPRIETARY GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Data (N bytes) - -Refer to explanation under the Proprietary Set Command. - -## 4.66.3 Proprietary Report Command - -This command is used to retrieve various data from a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROPRIETARY _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROPRIETARY REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Data (N bytes) - -Refer to explanation under the Proprietary Set Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.67-protection-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.67-protection-command-class-version-1.md deleted file mode 100644 index 761fd7e..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.67-protection-command-class-version-1.md +++ /dev/null @@ -1,63 +0,0 @@ - -# 4.67 Protection Command Class, version 1 - -The Protection Command Class version 1 used to protect a device against unintentional control by e.g. a child. - -## 4.67.1 Protection Set Command - -This command is used to set the protection state in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Protection State | | | | | | | | | | | | | | | | | | | | | | | | - -Protection State (8 bits) - -The Protection State field used to set the protection state of the device. - -Table 92, Protection Set::Protection State encoding - -| | Protection State | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Unprotected - The device is not protected, and may be operated normally via the user interface. | | | -| 0x01 | | | Protection by sequence - The device is protected by altering the way the device normally is operated into a more complicated sequence of actions, e.g. if a device normally is controlled by a single press of a button on the device it might be changed to require 3 rapid presses on a button to control it. | | | -| 0x02 | | | No operation possible - It is not possible at all to control a device directly via the user interface. | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Control via Z-Wave is always possible independently of the protection state. - -## 4.67.2 Protection Get Command - -This Command is used to request the protection state from a device. - -The Protection Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION GET _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.67.3 Protection Report Command - -This command is used to report the protection state of a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Protection State | | | | | | | | | | | | | | | | | | | | | | | | - -Protection State (8 bits) - -Refer to explanation under Protection Get Command. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.68-protection-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.68-protection-command-class-version-2.md deleted file mode 100644 index 61d751e..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.68-protection-command-class-version-2.md +++ /dev/null @@ -1,214 +0,0 @@ - -# 4.68 Protection Command Class, version 2 - -The Protection Command Class version 2 is extended to specify whether a device may be controlled via RF Commands or not. When a video recorder is powered by an outlet that can be controlled by RF the user would like to prevent the video recorder from being turned off when it is recording her/his favorite show. In this case the Protection Command Class version 2 may be used to protect the outlet from being turned off by setting the outlet in “No RF Control” state. - -The following Commands have been added or changed in version 2. The Commands not mentioned remain unchanged. - -This Command Class is intended for convenience applications. The Command Class SHOULD NOT be used for safety critical applications. - -## 4.68.1 Protection Set Command - -This command is used to set the protection state in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Local Protection State | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | RF Protection State | | | | | | | | | | | | - -Local Protection State (4 bits) - -The Local Protection State field used to set the protection state of the device. - -Table 93, Protection Set::Local Protection State encoding - -| | Local Protection | | Description | -| --- | --- | --- | --- | -| | State | | | -| 0 | | | Unprotected - The device is not protected, and may be operated normally via the user interface. | -| 1 | | | Protection by sequence - The device is protected by altering the way the device normally is operated into a more complicated sequence of actions, e.g. if a device normally is controlled by a single press of a button on the device it might be changed to require 3 rapid presses on a button to control it. | -| 2 | | | No operation possible - It is not possible at all to control a device directly via the user interface. | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Note: Local Protection can only protect a device from “normal operation”. This means only the operation that is intended by the application of the device. It is NOT allowed to protect the device from network functionalities. The device cannot be protected from being put into learn mode nor from sending out the NIF. - -RF Protection State (4 bits) The RF Protection State field used to set the RF protection state of the device. In the case where a device set into a RF Protection State which instructs the device not to answer to a “normal operation” Command, the device MUST return the Application Rejected Request Command (Status = 0) of the Application Status Command Class. Refer to the Application Status Command Class. - -Table 94, Protection Set::RF Protection State - -| | RF Protection | | Description | -| --- | --- | --- | --- | -| | State | | | -| 0 | | | Unprotected - The device MUST accept and respond to all RF Commands. | -| 1 | | | No RF control - all runtime Commands are ignored by the device. The device MUST still respond with status on requests. | -| 2 | | | No RF response at all. The device will not even reply to status requests. | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. Note: – It is only possible to un-protect the device with the Protection Set Command. It is not allowed ignore Protection Commands. If a device is excluded from the network, the protection states MUST be reset. - -## 4.68.2 Protection Report Command - -This command is used to report the protection state of a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Local Protection State | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | RF Protection State | | | | | | | | | | | | - -[For field description, refer to 4.68.1 Protection Set Command.](04.68-protection-command-class-version-2.md#4681-protection-set-command) - -## 4.68.3 Protection Supported Get Command - -This command is used to query supported protection capabilities. - -The Protection Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.68.4 Protection Supported Report Command - -This command is used to advertise supported protection capabilities. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | Exclusive Control | | | Timeout | | | -| Local Protection State Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Local Protection State Byte 2 | | | | | | | | | | | | | | | | | | | | | | | | -| RF Protection State Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| RF Protection State Byte 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Local Protection State Byte (2 bytes) - -[The list of all Local Protection States may be found in section 4.68.1. The two bytes MUST be interpreted](04.68-protection-command-class-version-2.md#4681-protection-set-command) as bit masks where byte 1 bit 0 represent Local Protection State 0, byte 1 bit 1 represent Protection State 1, byte 2 bit 0 represent Protection State 8 etc. - -RF Protection State Byte (2 bytes) - -[The list of all RF Protection States may be found in section 4.68.1. The two bytes MUST be interpreted](04.68-protection-command-class-version-2.md#4681-protection-set-command) as bit masks where byte 1 bit 0 represent RF Protection State 0, byte 1 bit 1 represent Protection State 1, byte 2 bit 0 represent Protection State 8 etc. - -Exclusive Control (1 bit) - -When this bit is set to 1 the device support Exclusive Control. When Exclusive Control is supported the device MUST support the Commands Protection Exclusive Control Set, Get and Report described below. - -Timeout (1 bit) - -When this bit is set to 1 the device supports a timeout for RF Protection State. When the timeout is supported the device MUST support the Commands Protection Timeout Set, Get and Report described below. - -## 4.68.5 Protection Exclusive Control - -The Protection Exclusive Control is an optional feature. The Commands in this chapter can only be implemented if the device supporting Protection Command Class version 2 announces support for Exclusive Control in the Protection Supported Report Command. - -### 4.68.5.1 Protection Exclusive Control Set Command - -This command is used to set the NodeID of a Z-Wave device that can override the protection state in a protected device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION EC SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| NodeID | | | | | | | | | | | | | | | | | | | | | | | | - -NodeID - -The NodeID that has exclusive control can override the RF protection state of the device and can control it regardless of the protection state. Commands from any other nodes in the network may be restricted by the RF protection state. In that case, the Application Rejected Request Command MUST be returned. - -All of the Protection Command Class commands will be accepted and processed regardless of whether or not a node has exclusive control. - -Factory default setting of the NodeID for exclusive control MUST be set to 0. To reset the exclusive control state in a device an Exclusive Control Set Command with NodeID 0 as parameter MUST be send to the device. - -### 4.68.5.2 Protection Exclusive Control Get Command - -This command is used to request a Protection Exclusive Control Report Command from the device. - -The Protection Exclusive Control Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION EC GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -### 4.68.5.3 Protection Exclusive Control Report Command - -This command is used to return the NodeID of a Z-Wave device that has exclusive control over this device in protection mode. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION EC REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| NodeID | | | | | | | | | | | | | | | | | | | | | | | | - -NodeID - -[See description under the Protection Exclusive Control Set Command section 4.68.5.1.](04.68-protection-command-class-version-2.md#46851-protection-exclusive-control-set-command) - -## 4.68.6 Protection Timeout - -The Protection Timeout is an optional feature. The Commands in this section MAY be implemented if the device supporting Protection Command Class version 2 announces support for Timeout in the Protection Supported Report Command. - -### 4.68.6.1 Protection Timeout Set Command - -This command is used to set the timeout for protection mode in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION TIMEOUT SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Timeout | | | | | | | | | | | | | | | | | | | | | | | | - -Timeout - -The timeout describes the time that a device MUST remain in RF Protection mode. Factory default setting for the Timeout parameter MUST be 0x00. This field MUST be encoded according [to Table 95.](04.68-protection-command-class-version-2.md#46861-protection-timeout-set-command) - -Table 95, Protection Timeout Set::Timeout encoding - -| | Timeout | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | No timer is set. All “normal operation” Commands MUST be accepted. | | | -| 0x01-0x3C | | | Timeout is set from 1 second (0x01) to 60 seconds (0x3C) in 1-second resolution. | | | -| 0x41-0xFE | | | Timeout is set from 2 minutes (0x41) to 191 minutes (0xFE) in 1-minute resolution. | | | -| 0xFF | | | No Timeout – The Device will remain in RF Protection mode infinitely. | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -### 4.68.6.2 Protection Timeout Get Command - -This command is used to request a Protection Timeout Report Command from the device. - -The Protection Timeout Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION TIMEOUT GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -### 4.68.6.3 Protection Timeout Report Command - -This command is used to return the remaining time that a device will remain in protection mode. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS PROTECTION _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = PROTECTION TIMEOUT REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Timeout | | | | | | | | | | | | | | | | | | | | | | | | - -Timeout - -[This field indicates the remaining timeout set in the Node. It MUST be encoded as described in Table 95](04.68-protection-command-class-version-2.md#46861-protection-timeout-set-command) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.69-pulse-meter-command-class-version-1-deprecated.md b/docs/specs/command-class-specification/04-command-class-definitions/04.69-pulse-meter-command-class-version-1-deprecated.md deleted file mode 100644 index 94cee35..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.69-pulse-meter-command-class-version-1-deprecated.md +++ /dev/null @@ -1,44 +0,0 @@ - -# 4.69 Pulse Meter Command Class, version 1 [DEPRECATED] - -THIS COMMAND CLASS HAS BEEN DEPRECATED - -A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Meter Command Class. If implementing this command class, it is RECOMMENDED that the Meter Command Class is also implemented. - -The Pulse Meter Command Class defines the Commands necessary to implement the pulse meter functionality. The Pulse Meter Command Class is intended for all kinds of meters that generate pulses, such as gas and water meters. - -## 4.69.1 Pulse Meter Get Command - -This command is used to request the number of pulses that has been counted. - -The Pulse Meter Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER PULSE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER PULSE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.69.2 Pulse Meter Report Command - -This command is used to report the number of pulses detected. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS METER PULSE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = METER PULSE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Pulse Count 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Pulse Count 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Pulse Count 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Pulse Count 4 | | | | | | | | | | | | | | | | | | | | | | | | - -Pulse Count (32 bits) - -The Pulse Count field contains the number of pulses generated by the meter. The first byte is the most significant byte. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.71-rate-table-monitor-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.71-rate-table-monitor-command-class-version-1.md deleted file mode 100644 index 0fffaab..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.71-rate-table-monitor-command-class-version-1.md +++ /dev/null @@ -1,396 +0,0 @@ - -# 4.71 Rate Table Monitor Command Class, version 1 - -The Rate Table Monitor Command Class defines the parameter sets for a range of rates. - -## 4.71.1 Rate Table Supported Get Command - -This command is used to request the number of rates and parameter sets supported by the Rate Table Command Class. - -The Rate Table Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.71.2 Rate Table Supported Report Command - -This command is used to advertise the number of rates and parameter sets supported. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = Command = RATE TBL SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rates Supported | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Set Supported Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Parameter Set Supported Bit Mask 2 | | | | | | | | | | | | | | | | | | | | | | | | - -Rates Supported (8 bits) - -Number of rates supported (1..255). - -Parameter Set Supported Bit Mask 1, 2 (16 bits) - -The Bit Mask field describes the supported parameter set in addition to the default-supported parameter set. The default parameter set comprises of Rate Parameter Set ID, Rate text, Start time and Duration. - -It is possible to extend the default parameter set as follows: - -Table 96, Rate Table Supported Report::Parameter Set Supported Bit Mask encoding - -| | Parameter | | Bit Map | Description | -| --- | --- | --- | --- | --- | -| | Set | | | | -| | Supported | | | | -| 1 | | | Bit 0 | Reserved | -| 1 | | | Bit 1 | Supports Block tariffs if the bit is 1 and the opposite if 0. Block tariffs assign blocks of energy at a set cost, for example in a two block tariff the first block say from 0 kWh to 200 kWh is charged at X currency per unit(kWh) all other units consumed over 200kWh will be charged at Y currency per unit for the billing period. | -| 1 | | | Bit 2 | Supports Maximum demand tariffs if the bit is 1 and the opposite if 0. Maximum demand tariffs are based on the maximum load that is measured for example 20kw over an averaging period. The charge is based on the max load; hence a 30kW maximum demand would be more costly than a 20kW maximum demand. | -| 1 | | | Bit 3 | Supports Subscribed demand tariffs if the bit is 1 and the opposite if 0. This type of tariff is used in France and Italy primarily; the standing charge is calculated from the maximum load, for example 10A = 10 currency/month, 20A = 20 currency / month. | -| 1 | | | Bit 4 | Supports Demand Control Plan mapping (DCP ID) if the bit is 1 and the opposite if 0. | - -All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -## 4.71.3 Rate Table Get Command - -This command is used to request the rate parameter set for a given rate parameter set identifier. - -The Rate Table Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. - -## 4.71.4 Rate Table Report Command - -This command reports rate parameter set for a given rate parameter set identifier. - -| | 7 | | | 6 | | | | 5 | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | Rate Type | | | | Number of Rate Char. | | | | | | | | | | | | | | -| Rate Character 1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | -| Rate Character N | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute 1 | | | | | | | | | | | | | | | | | | | | | | | -| Duration Minute 2 | | | | | | | | | | | | | | | | | | | | | | | - -The following part of the command is OPTIONAL depending on the parameters supported. Use the Rate Table Supported Get Command to obtain supported parameters beside the default above. A not supported parameter is removed from the command layout. - -| Consumption Precision 1 | Consumption Scale 1 | -| --- | --- | -| Min. Consumption Value 1 | | -| Min. Consumption Value 2 | | -| Min. Consumption Value 3 | | -| Min. Consumption Value 4 | | -| Max. Consumption Value 1 | | -| Max. Consumption Value 2 | | -| Max. Consumption Value 3 | | -| Max. Consumption Value 4 | | -| Max. Demand Precision 1 | Max. Demand Scale 1 | -| Max. Demand Value 1 | | -| Max. Demand Value 2 | | -| Max. Demand Value 3 | | -| Max. Demand Value 4 | | -| DCP Rate ID | | - -[Refer to description of fields under the Rate Table Set Command (section 4.70.1).](04.70-rate-table-configuration-command-class-version-1.md#4701-rate-table-set-command) - -## 4.71.5 Rate Table Active Rate Get Command - -This command is used to retrieve the rate currently active in the meter. - -The Rate Table Active Rate Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL ACTIVE RATE GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.71.6 Rate Table Active Rate Report Command - -This command is used to advertise the rate parameter set ID of the rate currently active in the meter. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL ACTIVE RATE REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID of the rate currently active in the meter. - -## 4.71.7 Rate Table Current Data Get Command - -This command is used to request a number of time stamped values (current) in physical units according to the dataset mask. - -The Rate Table Current Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL CURRENT DATA GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 3 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. - -Dataset Requested (24 bits) - -The dataset requested parameter indicates which data is requested by the command. This field MUST [be encoded according to Table 68.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -## 4.71.8 Rate Table Current Data Report Command - -This command is used to report a number of time stamped values (current) in physical units in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL CURRENT DATA REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | -| Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Current Precision 1 | | | | | | | | | Current Scale 1 | | | | | | | | | | | | | | | -| Current Value 1,1 | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value 1,2 | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value 1,3 | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value 1,4 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Current Precision N | | | | | | | | | Current Scale N | | | | | | | | | | | | | | | -| Current Value N,1 | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value N,2 | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value N,3 | | | | | | | | | | | | | | | | | | | | | | | | -| Current Value N,4 | | | | | | | | | | | | | | | | | | | | | | | | - -Reports to Follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. Dataset (24 bits) - -The dataset parameter indicates which data is included in the report. This field MUST be encoded [according to Table 68.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. - -Day (8 bits) - -Specify the day of the month between 01 and 31. - -Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00..23) in local time. - -Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. - -Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00..59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Precision (N * 3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Current Scale (N*5 bits) - -The Current Scale is used to indicate the scale (unit) of the following value. This field MUST be encoded [according to Table 68.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Current Value (N * 32 bits) - -The Current Value advertises a value corresponding to the Dataset Requested field of the Get Command. The field MUST be encoded as a 32-bit signed integer. The first byte (Value 1) MUST carry [most significant byte. Table 10 shows signed decimal values together with their hexadecimal equivalents.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -NOTICE: The device receiving the Rate Table Current Data Report MUST show the value even though the Scale is not supported. - -## 4.71.9 Rate Table Historical Data Get Command - -This command is used to request a number of time stamped values (historical) in physical units according to rate type, dataset mask and time interval. - -The Rate Table Historical Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL HISTORICAL DATA GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Maximum Reports | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset Requested 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Maximum Reports (8 bits) - -The maximum reports parameter is used to indicate the maximum number of reports to return based on the get. Reports are always returned with the most recently recorded value first. If set to 0x00 the meter will return all reports based on the request. - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. - -Dataset Requested (24 bits) - -The dataset requested parameters indicate data requested. This field MUST be encoded according to [Table 68.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Start/Stop Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Start/Stop Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that an accumulated value is not determined yet. - -Start/Stop Day (8 bits) - -Specify the day of the month between 01 and 31. - -Start/Stop Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00..23) in local time. - -Start/Stop Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. - -Start/Stop Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00..59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -## 4.71.10 Rate Table Historical Data Report Command - -This command is used to report a number of time stamped values (historical) in physical units in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS RATE TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = RATE TBL HISTORICAL DATA REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Dataset 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Month | | | | | | | | | | | | | | | | | | | | | | | | -| Day | | | | | | | | | | | | | | | | | | | | | | | | -| Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Precision 1 | | | | | | | | | Historical Scale 1 | | | | | | | | | | | | | | -| | Historical Value 1,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value 1,4 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Precision N | | | | | | | | | Historical Scale N | | | | | | | | | | | | | | -| | Historical Value N,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,2 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,3 | | | | | | | | | | | | | | | | | | | | | | | -| | Historical Value N,4 | | | | | | | | | | | | | | | | | | | | | | | - -Reports to follow (8 bits) - -This value indicates how many report frames there are left, the value 0xFF means that the number of reports have not been calculated yet or that there is more than 255 reports to follow. - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID addresses the wanted parameter set. The rate parameter set identifier MUST be a sequence starting from 1 to Rates Supported. Dataset (24 bits) - -The dataset parameter indicates which data is included in the report. This field MUST be encoded [according to Table 68.](04.52-meter-table-monitor-command-class-version-1/04.52.06-meter-table-capability-report-command.md#4526-meter-table-capability-report-command) - -Year 1, 2 (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. - -Day (8 bits) - -Specify the day of the month between 01 and 31. - -Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00..23) in local time. - -Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00..59) in local time. - -Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00..59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Historical Precision (N * 3 bits) - -The Historical Precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Historical Scale (N * 5 bits) - -The Historical Scale used to indicate the scale (unit) of the following value. The Historical Scale parameter is of the variable type Meter Scale [; refer to 4.52.13 Meter Table Current Data Report](04.52-meter-table-monitor-command-class-version-1/04.52.13-meter-table-current-data-report-command.md#45213-meter-table-current-data-report-command) Command. - -Historical Value (N * 32 bits) - -The Historical Value is a 32 bit signed field defined by dataset requested field. The first byte (Value 1) is the most significant byte. shows signed decimal values together with their hexadecimal equivalents. - -NOTICE: The device receiving the Rate Table Historical Data Report MUST show the value even though the Scale is not supported. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.72-scene-activation-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.72-scene-activation-command-class-version-1.md deleted file mode 100644 index 0b33365..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.72-scene-activation-command-class-version-1.md +++ /dev/null @@ -1,50 +0,0 @@ - -# 4.72 Scene Activation Command Class, version 1 - -The Scene Activation Command Class used for launching scenes in a number of actuator nodes e.g. another scene-controlling unit, a multilevel switch, a binary switch etc. - -## 4.72.1 Compatibility considerations - -A node supporting this Command Class MUST also support the Scene Actuator Configuration Command Class. - -This command class requires an initial configuration of the scenes to be launched by the Scene Actuator Configuration Set. - -Since a common identifier that is sent out, multicast addressing may be used. Multicast addressing may eliminate the potential popping effect which could be the result if individual Set Commands were send out to a large number of nodes distributed over a vast area. The multicast transmission MUST be followed by individual singlecast transmissions to ensure all the nodes have received the command. - -## 4.72.2 Scene Activation Set Command - -This command is used to activate the setting associated to the scene ID. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE ACTIVATION _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE ACTIVATION SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dimming Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Scene ID (8 bits) - -This field is used to specify the Scene ID that the receiving node MUST activate This field MUST be in the range 1..255. - -Dimming Duration (8 bits) - -This field MUST specify the time that the transition from the current level to the target level (indicated by the Scene ID) should take.. - -Supporting actuator nodes without duration capabilities MUST ignore this field. - -Supporting actuator nodes with a duration capabilities SHOULD respect the indicated dimming duration to reach the target level. - -[This field MUST be encoded according to Table 97.](04.72-scene-activation-command-class-version-1.md#4722-scene-activation-set-command) Table 97, Scene Activation Set:: Dimming Duration encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Instantly | | | -| 0x01..0x7F | | | Obtain dimming durations from 1 second (0x01) to 127 seconds (0x7F) in 1-second resolution | | | -| 0x80..0xFE | | | Specify dimming durations from 1 minute (0x80) to 127 minutes (0xFE) in 1-minute resolution. | | | -| 0xFF | | | Specify dimming duration configured by the Scene Actuator Configuration Set and Scene Controller Configuration Set Command depending on device used. | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.73-scene-actuator-configuration-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.73-scene-actuator-configuration-command-class-version-1.md deleted file mode 100644 index 4aec0c1..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.73-scene-actuator-configuration-command-class-version-1.md +++ /dev/null @@ -1,119 +0,0 @@ - -# 4.73 Scene Actuator Configuration Command Class, version 1 - -The Scene Actuator Configuration Command Class is used to configure scenes settings for a node supporting an actuator Command Class, e.g. a multilevel switch, binary switch etc. - -## 4.73.1 Compatibility considerations - -A node supporting this Command Class MUST support 255 Scene IDs. Implemented Scene IDs MUST be in a consecutive range starting from 1. - -## 4.73.2 Scene Actuator Configuration Set Command - -This command is used to associate the specified scene ID to the defined actuator settings. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE ACTUATOR CONF _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE ACTUATOR CONF SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Dimming Duration | | | | | | | | | | | | | | | | | | | | | | | | -| Over- ride | | | Reserved | | | | | | | | | | | | | | | | | | | | | -| Level | | | | | | | | | | | | | | | | | | | | | | | | - -Scene ID (8 bits) - -This field is used to specify the Scene ID to be associated with the current actuator settings. This field MUST be in the range 1..255. - -Dimming Duration (8 bits) - -This field MUST specify the time it MUST take to reach the target level associated to the actual Scene ID. - -A receiving node always starts from current level. The dimming duration MUST be the same independently of the number of levels to be changed. - -Supporting actuator nodes without duration capabilities MUST ignore this field. Supporting actuator nodes with duration capabilities SHOULD respect the indicated duration to reach the target level. - -[This field MUST be encoded according to Table 7.](../03-command-class-overview/03.07-common-fields-and-encoding.md#373-duration-encoding) - -Override (1 bit) - -This field is used to specify if the current actuator settings MUST be used as settings for the actual Scene ID. If this field is set to 0, the current actuator settings at the supporting nodeMUST be associated to the actual Scene ID. In this case, the Level field MUST be ignored. If this field is set to 1, the value indicated by the Level field MUST be associated to the actual Scene ID. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Level (8 bits) - -This field is used to specify the actuator setting that MUST be used as setting for the actual Scene ID. This field MUST correspond and be interpreted as the Value field of the Basic Set Command. i.e. the supporting node receiving a Scene Activation Set for the actual Scene ID specified in this command MUST react as if it had received a Basic Set Command with the Value field set to the value indicated by this field. - -## 4.73.3 Scene Actuator Configuration Get Command - -This command is used to request the settings for a given scene identifier or for the scene currently active. - -The Scene Actuator Configuration Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE ACTUATOR CONF _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE ACTUATOR CONF GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | - -Scene ID (8 bits) - -This field is used to specify the requested Scene ID settings. - -Values in the range 1..255 MUST indicate that the receiving node MUST return settings associated to the actual Scene ID.. - -The value 0 MUST indicate that the current active scene (if any). - -## 4.73.4 Scene Actuator Configuration Report Command - -This command is used to advertise the settings associated to a scene identifier. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCENE ACTUATOR CONF _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCENE ACTUATOR CONF REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Scene ID | | | | | | | | | | | | | | | | | | | | | | | | -| Level | | | | | | | | | | | | | | | | | | | | | | | | -| Dimming Duration | | | | | | | | | | | | | | | | | | | | | | | | - -Scene ID (8 bits) - -This field is used to specify the actual Scene ID for which the settings are being advertised. - -Values in the range 1..255 MUST indicate an actual Scene ID. - -The value 0 MUST indicate that no scene is currently active at the sending node and no scene setting is advertised in this command. In this case, the Level and Dimming Duration fields SHOULD be ignored. - -Level (8 bits) - -This field is used to advertise the actuator setting that MUST be used by the node when activating the actual Scene ID. - -The value advertised by the sending node MUST correspond to the format of the Value field when returning a Basic Report Command. - -Dimming Duration (8 bits) - -This field MUST specify the time it MUST take to reach the target level associated to the actual Scene ID.. - -Supporting actuator nodes without duration capabilities MUST ignore this field and SHOULD set it to 0x00. - -Supporting actuator nodes with duration capabilities SHOULD respect the indicated duration to reach the target level. - -[This field MUST be encoded according to Table 98.](04.73-scene-actuator-configuration-command-class-version-1.md#4734-scene-actuator-configuration-report-command) Table 98, Scene Actuator Configuration Report::Dimming Duration encoding - -| | Dimming Duration | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Instantly | | | -| 0x01..0x7F | | | Dimming durations from 1 second (0x01) to 127 seconds (0x7F) in 1-second resolution | | | -| 0x80..0xFE | | | Specify dimming durations from 1 minute (0x80) to 127 minutes (0xFE) in 1-minute resolution. | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.03-schedule-supported-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.03-schedule-supported-get-command.md deleted file mode 100644 index aec2c03..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.03-schedule-supported-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.75.3 Schedule Supported Get Command - -This command is used to query the schedule functionalities supported by a node. - -The Schedule Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.06-schedule-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.06-schedule-get-command.md deleted file mode 100644 index aeff96a..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.06-schedule-get-command.md +++ /dev/null @@ -1,24 +0,0 @@ - -# 4.75.6 Schedule Get Command - -This command is used to request the configuration for a specific schedule ID. - -The Schedule Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | - -Schedule ID (8 bits) - -This field MUST carry the requested Schedule ID. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.07-schedule-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.07-schedule-report-command.md deleted file mode 100644 index 9af0ee4..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.07-schedule-report-command.md +++ /dev/null @@ -1,60 +0,0 @@ - -# 4.75.7 Schedule Report Command - -This command is used to report the configuration for a specific schedule. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Active ID _ | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| Reserved | | | | | | | | | | Start Day of Month | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Reserved | | | | | | Start Minute | | | | | | | | | | | | | | | | | | -| Duration Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Report to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 – N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -[Fields not described below are described in the Schedule Set Command; refer to 4.75.5.](04.75.05-schedule-set-command.md#4755-schedule-set-command) - -Schedule ID (8 bits) - -This field is used to indicate the advertised Schedule ID. - -If this command is advertising an unused or unsupported Schedule ID, all parameters until Number of Cmd to Follow MUST be set to 0x00. The Cmd Length and Cmd Byte fields MUST be omitted. - -Active_ID (4 bits) - -This field is used to advertise the status for the requested Schedule ID. This field MUST be encoded [according to Table 107.](04.75.11-schedule-state-report-command.md#47511-schedule-state-report-command) Duration (16 bits) - -This field is used to advertise either the configured duration for a schedule or how much time is left before the schedule becomes inactive. - -The Duration Type, Start Time and Schedule ID fields MUST be inspected before interpreting this field. [This field MUST advertise a value according to Table 106.](04.75.07-schedule-report-command.md#4757-schedule-report-command) - -Table 106. Duration field usage - -| | Duration Type | | | Schedule ID | | | Start time | | | Advertised duration | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Time (0x00..0x02) | | | Regular | | | Specified start time | | | Configured duration | | | -| Time (0x00..0x02) | | | Regular or Override | | | Start now | | | Remaining time | | | -| Override (0x03) | | | Override (0xFF) | | | Start now | | | Configured override type (Table 105) | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.10-schedule-state-get-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.10-schedule-state-get-command.md deleted file mode 100644 index a2cf8f2..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.10-schedule-state-get-command.md +++ /dev/null @@ -1,19 +0,0 @@ - -# 4.75.10 Schedule State Get Command - -This command is used to request the status of all schedules supported by a node. - -The Schedule State Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | 3 | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE GET _ _ | | | | | | | | | | | | | | | | | | | | | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.11-schedule-state-report-command.md b/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.11-schedule-state-report-command.md deleted file mode 100644 index a3ff8fc..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/04.75.11-schedule-state-report-command.md +++ /dev/null @@ -1,65 +0,0 @@ - -# 4.75.11 Schedule State Report Command - -This command is used to advertise the status of all schedules supported by a device. - -| | 7 | | | 6 | | | 5 | | | 4 | 3 | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule ID | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | Override | | | -| Active ID 2 _ | | | | | | | | | | | Active ID 1 _ | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | -| Active ID N _ | | | | | | | | | | | Active ID N-1 _ | | | | | | | | | | - -. - -Number of Supported Schedule ID (8 bits) - -This field is used to advertise the number of supported regular schedule IDs. This field’s value MUST be the same as the value advertised in the Schedule Supported Report Command. - -Override (1 bit) - -This field MUST be used to advertise the status of the Override Schedule (ID = 0xFF). - -If the Override Schedule is active, this bit MUST be set to 1. If the Override Schedule is inactive, this bit MUST be set to 0. Reports to Follow (7 bits) - -The length of the Active_ID field may be larger than the maximum available Z-Wave MAC frame size. - -This field MUST be used to advertise the number of commands following this command in order to advertise the status of all Schedules IDs. - -A controlling node SHOULD use this value to detect missing reports. - -Active_ID (N * 4 bits) - -This field is used to advertise the status for each supported schedule ID. Four bits units are used for each Schedule ID to indicate the status. It means that: - - Bits 0 to 3 in Active_ID byte 1 represent Schedule ID = 1  Bits 4 to 7 in Active_ID byte 1 represent Schedule ID = 2  Bits 0 to 3 in Active_ID byte 2 represent Schedule ID = 3  … - -The size of this field MUST be the smallest number of bytes needed to advertise the number of supported Schedule IDs advertised in this command. - -If several Reports are returned (using the Reports to follow field), the first Report advertises Schedule ID 1 to Schedule ID N and the subsequent report MUST be interpreted as representing Schedule ID starting from N+1. - -[Each 4 bits unit MUST be encoded according to Table 107.](04.75.11-schedule-state-report-command.md#47511-schedule-state-report-command) Table 107. Active_ID encoding - -| | Hex | | | Description | | | Detailed description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Not used | | | The Schedule ID is not used. (not set/configured) or unsupported | | | 1 | | | -| 0x01 | | | [DEPRECATED] Override + Not used | | | [DEPRECATED] A sending node SHOULD NOT use this status. It is RECOMMENDED to use 0x00 instead. A receiving node MUST interpret this status as Active ID = 0x00 (and the override field set _ to 1 for the Schedule State Report Command). | | | 1 | | | -| 0x02 | | | Not Active | | | The Schedule ID is used, enabled and currently not active. | | | 1 | | | -| 0x03 | | | Active | | | The Schedule ID is used, enabled and currently active. | | | 1 | | | -| 0x04 | | | Disabled | | | The Schedule ID is used and disabled. | | | 1 | | | -| 0x05 | | | Override + Active | | | The Schedule ID is used, enabled and should currently be active but it is suspended by the Override Schedule The override field MUST be set to 1 when using this status in the Schedule State Report Command. | | | 1 | | | -| 0x06 | | | [DEPRECATED] Override + Not Active | | | [DEPRECATED] A sending node SHOULD NOT use this status. It is RECOMMENDED to use 0x02 instead. A receiving node MUST interpret this status as Active ID = 0x02 (and the override field set _ to 1 for the Schedule State Report Command) | | | 1 | | | -| 0x07 | | | [DEPRECATED] Override + Disabled | | | [DEPRECATED] A sending node SHOULD NOT use this status. It is RECOMMENDED to use 0x04 instead. A receiving node MUST interpret this status as Active ID = 0x04 (and the override field set _ to 1 for the Schedule State Report Command) | | | 1 | | | - -CC:0053.01.09.11.00B interpret this status as Active_ID = 0x02 (and the override field set - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/index.md b/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/index.md deleted file mode 100644 index 7fa5f34..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.75-schedule-command-class-version-1/index.md +++ /dev/null @@ -1,24 +0,0 @@ - -# 4.75 Schedule Command Class, version 1 - -The Schedule Command Class allows scheduling the execution of commands for a given duration in a supporting device. It is a generic Command Class that may be used to schedule commands of any other Command Class. - -## Contents - -- [4.75.1 Terminology](04.75.01-terminology.md) -- [4.75.2 Interoperability considerations](04.75.02-interoperability-considerations.md) -- [4.75.3 Schedule Supported Get Command](04.75.03-schedule-supported-get-command.md) -- [4.75.4 Schedule Supported Report Command](04.75.04-schedule-supported-report-command.md) -- [4.75.5 Schedule Set Command](04.75.05-schedule-set-command.md) -- [4.75.6 Schedule Get Command](04.75.06-schedule-get-command.md) -- [4.75.7 Schedule Report Command](04.75.07-schedule-report-command.md) -- [4.75.8 Schedule Remove Command](04.75.08-schedule-remove-command.md) -- [4.75.9 Schedule State Set Command](04.75.09-schedule-state-set-command.md) -- [4.75.10 Schedule State Get Command](04.75.10-schedule-state-get-command.md) -- [4.75.11 Schedule State Report Command](04.75.11-schedule-state-report-command.md) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.76-schedule-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.76-schedule-command-class-version-2.md deleted file mode 100644 index 699af86..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.76-schedule-command-class-version-2.md +++ /dev/null @@ -1,315 +0,0 @@ - -# 4.76 Schedule Command Class, version 2 - -The Schedule Command Class version 2 allows scheduling the execution of commands for a given duration in a supporting node. It is a generic command class that may be used to schedule commands from any other Command Class. - -## 4.76.1 Compatibility considerations - -The Schedule Command Class, version 2 is backwards compatible with version 1. A node supporting the Schedule Command Class, version 2 MUST also support version 1. - -Schedule Command Class, version 2 introduces the following: - - Schedule ID Blocks  Clarification on using Schedule Command Class with Security - -All commands or fields not described in this version remain unchanged from version 1. - -### 4.76.1.1 Schedule ID Blocks - -In Schedule Command Class version 1, all Schedule IDs have to support the same Start Time Options, Override Types and supported commands. - -The Schedule ID Blocks allows a node to implement several Schedule ID pools sharing the same scheduling functionalities. - -Each Schedule ID Block MUST have its own range of Schedule ID’s. The ID for each Block MUST be in the range 1..[Number of Supported Schedule IDs]. - -Schedule ID Block = 1 is the default Block. A version 1 node MUST be assumed to be using Schedule ID block 1. - -### 4.76.1.2 Schedule Command Class with Security - -The Schedule Command Class may be implemented by secure devices. Depending on the type of device, a given Command Class may be supported only via secure communication or via secure as well as unsecure communication. - -The following command class categories may be considered: - - Always unsecure Examples of command classes which are always supported via unsecure communication – as well as via secure communication if the device is securely included (e.g Z-Wave Plus Info Command Class). - - Migrate to secure Examples of command classes which are supported via unsecure communication if the device is not securely included – but only via secure communication if the device is securely included. (e.g. Multilevel Switch or Association Command Class) - - Secure only: Examples of command classes which are supported only via secure communication. (e.g. Door Lock Command Class) To reflect the above mentioned dynamic support scenarios, a device MUST advertise the supported Command Classes for scheduling in a way that matches the current secure/non-secure supported Command Class lists found in the NIF and S0/S2 Commands Supported Report Commands. - -Clarification is added to the Schedule Supported Report Command and Schedule Set Command for proper reporting and configuration of unsecure and secure command classes scheduling. - -It is RECOMMENDED to support the Schedule Command Class only at the highest security level in order to avoid dynamic listing. - -## 4.76.2 Schedule Supported Get Command - -This command is used to query the properties of a node. - -The Schedule Supported Report Command MUST be returned in response to this command. - -If the receiving node supports S0 or S2 Command Class and this command is issued via non-secure communication, the receiving node MUST advertise Command Classes that can be scheduled but also CC:0053.02.01.11.002 supported at the received security level. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Schedule ID Block (1 byte) - -This field is used to request a particular Schedule ID Block. - -If this field is set to 0x00, the receiving node MUST return the default Schedule ID Block (ID = 1). - -A node receiving a version 1 Schedule Supported Get Command (without the Schedule ID Block field) MUST return a response for the default Schedule ID Block (ID = 1). - -A node receiving a non-supported Schedule ID Block SHOULD return a report for the default Schedule ID Block. - -## 4.76.3 Schedule Supported Report Command - -This command is used to advertise the scheduling functionalities supported by a node for a given Schedule ID Block. - -| | 7 | | 6 | | | 5 | | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule IDs | | | | | | | | | | | | | | | | | | | | | | | | -| Support Enable/ Disable | | | Fall- back Support | | | | Start Time Support | | | | | | | | | | | | | | | | | -| Number of supported CC | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC 1 | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | | | Command 1 | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC N | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | | | Command N | | | | | -| Override Support | | | Supported Override Types | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule Blocks | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -All fields contained in this command advertise the scheduling supported functionalities for the actual Schedule ID Block. - -Schedule ID Block (8 bits) - -This field is used to indicate the actual Schedule ID Block for which the supported scheduling functionalities are advertised. - -The advertised supported functionalities SHOULD be different for every Schedule ID Block. - -Number of Schedule ID Blocks (8 bits) - -This field MUST advertise the total number of Schedule ID blocks supported by the node. - -This field MUST be in the range 1..255. - -The implemented Schedule ID Blocks MUST be in the range 1..[Number of Supported Schedule ID Blocks]. i.e. a node supporting 10 Schedules ID Blocks MUST accept Schedule ID Blocks values in the range 1..10. - -## 4.76.4 Schedule Set Command - -This command is used to create a new schedule or modify an existing schedule. This command MUST enable the schedule if a new schedule is created. This command MUST NOT change the enabled/disabled state of existing schedules - -If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| Reserved | | | | | | | | | | Start Day of Month | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Reserved | | | | | | Start Minute | | | | | | | | | | | | | | | | | | -| Duration Byte 1 MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 LSB | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd 1 Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd 1 Byte 1 - N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Schedule ID Block (8 bits) - -This field is used to specify the Schedule ID Block in which the specified Schedule ID is being set. - -A node receiving a version 1 Schedule Set Command (with the Schedule ID Block field set to 0x00) MUST assume the default Schedule ID Block (ID = 0x01). - -## 4.76.5 Schedule Get Command - -This command is used to request the configuration for a specific schedule ID. - -The Schedule Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Schedule ID Block (8 bits) - -This field is used to specify the requested Schedule ID Block. - -A node receiving a version 1 Schedule Get Command (without the Schedule ID Block field) MUST return a response for the default Schedule ID Block (ID = 1). - -## 4.76.6 Schedule Report Command - -This command is used to advertise the configuration for a specific schedule. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Active ID _ | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| Reserved | | | | | | | | | | Start Day of Month | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Reserved | | | | | | Start Minute | | | | | | | | | | | | | | | | | | -| Duration Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Report to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 – N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Schedule ID Block (8 bits) - -This field is used to specify the advertised Schedule ID Block. - -## 4.76.7 Schedule Remove Command - -This command is used to request the removal of one or all Schedules in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REMOVE _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Schedule ID (8 bits) - -This field is used to indicate the schedule that is to be removed. - -If this field is set to 0x00, all schedules within the Schedule ID Block MUST be removed. If this field is set to 0xFE, the Fall Back Schedule MUST be removed (if defined for the Schedule ID Block). If this field is set to 0xFF, the Override Schedule MUST be removed (if defined for the Schedule ID Block). If this field is in the range 0x01..[Number of supported Schedules], the receiving node MUST remove the corresponding schedule in the Schedule ID Block. - -Schedule ID Block (8 bits) - -This field is used to indicate the Schedule ID Block in which a schedule is being removed. - -A node receiving a version 1 Schedule Set Command (without the Schedule ID Block field) MUST assume the default Schedule ID Block (ID = 0x01). - -A node receiving this command with Schedule ID = 0x00 and Schedule ID Block = 0x00 MUST remove all Schedule IDs in all Schedule ID Blocks - -A node receiving this command with Schedule ID = 0x00 and Schedule ID Block ≠ 0x00 MUST remove all Schedule IDs from the specified Schedule ID Block. - -A node receiving this command with Schedule ID ≠ 0x00 and Schedule ID Block = 0x00 MUST ignore the command - -## 4.76.8 Schedule State Set Command - -This command is used to enable or disable one or more schedules. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule State | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Schedule ID Block (8 bits) - -This field is used to specify the Schedule ID Block in which one or more schedule are being enabled or disabled. - -This command MUST be ignored by a node advertising no support for Enabling/Disabling schedules in the Schedule Supported Report Command for the given Schedule ID Block. - -A node receiving a version 1 Schedule Set Command (without the Schedule ID Block field) MUST assume the default Schedule ID Block (ID = 0x01). - -A node receiving this command with Schedule ID = 0x00 and Schedule ID Block = 0x00 MUST enable/disable all Schedule IDs from all Schedule ID Blocks. - -A node receiving this command with Schedule ID = 0x00 and Schedule ID Block ≠ 0x00 MUST enable/disable all Schedule IDs from the specified Schedule ID Block. - -A node receiving this command with Schedule ID ≠ 0x00 and Schedule ID Block = 0x00 MUST ignore the command. - -## 4.76.9 Schedule State Get Command - -This command is used to request the status of all schedules within a Schedule ID Block supported by a node. - -The Schedule State Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Schedule ID Block (8 bits) - -This field is used to request a particular Schedule ID Block. - -A node receiving a version 1 Schedule Supported Get Command (without the Schedule ID Block field) MUST return a response for the default Schedule ID Block (ID = 1). - -## 4.76.10 Schedule State Report Command - -This command is used to advertise the status of all schedules supported by a device in a given Schedule ID block. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | Override | | | -| Active ID 2 _ | | | | | | | | | | | | Active ID 1 _ | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Active ID N _ | | | | | | | | | | | | Active ID N-1 _ | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 1. - -Number of Supported Schedule ID (8 bits) - -This field is used to advertise the number of supported regular schedule IDs for the actual Schedule ID Block. This field’s value MUST be the same as the value advertised in the Schedule Supported Report Command. - -Schedule ID Block (8 bits) - -This field is used to specify the Schedule ID Block in which all schedule states are advertised. - -If several Reports are returned (using the Reports to Follow field), this field MUST be present in every Report. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.77-schedule-command-class-version-3.md b/docs/specs/command-class-specification/04-command-class-definitions/04.77-schedule-command-class-version-3.md deleted file mode 100644 index bd32b60..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.77-schedule-command-class-version-3.md +++ /dev/null @@ -1,274 +0,0 @@ - -# 4.77 Schedule Command Class, version 3 - -The Schedule Command Class, version 3 allows scheduling the execution of commands for a given duration in a supporting node. It is a generic command class that may be used to schedule commands of any other Command Class. - -## 4.77.1 Terminology - -The Schedule Command Class version 3 introduces new terminology, complementing the terminology introduced in The Schedule Command Class version 1: - -Regular schedules may be triggered repeatedly by two mechanisms. From version 1, a Repeating Schedule can be created by setting parts of the start time to unspecified values, e.g. if month is unspecified, the schedule can start the first day of each month. From version 3, Recurrence settings may specify additional periodical triggers, e.g. every second day measured from the most recent trigger of the regular schedule. - -## 4.77.2 Compatibility considerations - -The Schedule Command Class, version 3 is backwards compatible with version 2. A node supporting the Schedule Command Class, version 3 MUST also support version 2. - -The Schedule Command Class version 3 introduces the “Recurring Mode” start mode and “Time from now” start time option. - -The “Time from now” start time option allows to set a schedule to start a after a given time from the reception of the command. - -The “Recurring Mode” start mode allows to set a schedule to restart repeatedly at fixed intervals since the last activation, e.g. every second day or every 6 months since the last activation. - -The Active_ID advertised in the Schedule Report Command of versions 1 and 2 is now overloaded with the Recurrence Offset field. A new AID_RO_CTL flag in the Schedule Get Command controls which value is actually returned. - -All commands or fields not described in this version remain unchanged from version 2. - -## 4.77.3 Schedule Supported Report Command - -This command is used to advertise the scheduling functionalities supported by a node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule IDs | | | | | | | | | | | | | | | | | | | | | | | | -| Support Enable/ Disable | | | Fall- back Support | | | Start Time Support | | | | | | | | | | | | | | | | | | -| Number of supported CC | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC 1 | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | | | Command 1 | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC N | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | | | Command N | | | | | -| Override Support | | | Supported Override Types | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule Blocks | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 2. - -Start Time Support (6 bits) - -This field is used to advertise the start time options supported by the sending node. - -Regular schedules MUST support the advertised start time options. The Override Schedule SHOULD support the advertised start time options. - -The Override Schedule MUST NOT support the Recurring Mode. - -[This field MUST be treated as a bitmask and MUST be encoded according to Table 108](04.77-schedule-command-class-version-3.md#4773-schedule-supported-report-command) Table 108. Start Time Support encoding - -| | Category | | | Bit | | | Indicates support for | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Start Time option | | | 0 | | | Start now. Refer to 4.75.4.1 | | | 1 | | | -| | | | 1 | | | Start Hour and Minute. Refer to 4.75.4.2 | | | 1 | | | -| | | | 2 | | | Calendar time. Refer to 4.75.4.3 | | | 1 | | | -| | | | 3 | | | Weekdays. Refer to 4.75.4.4 | | | 1 | | | -| | | | 4 | | | Time from now. Refer to 4.77.3.1 | | | 3 | | | -| Start Time mode | | | 5 | | | Recurring Mode. Refer to 4.77.3.2 | | | 3 | | | - -Each bit indicates the support for a given Start Time option or mode. - -The value 1 MUST indicate that the node supports the corresponding start time option/mode. The value 0 MUST indicate that the node does not support the corresponding start time option/mode. - -While support is advertised as a bitmap, the actual functionality is triggered by different combinations of Schedule Set start time fields. The following subsections outline the mandatory supported combinations when advertising support for the corresponding option. - -### 4.77.3.1 Start Time option: Start from now - -The start now option is used to make a configured schedule start after the indicated time has elapsed from the reception of the Schedule Set Command. - -The Start from now option MUST cause a schedule to be activated at the specified relative time measured from the reception of the Schedule Set Command and run for the specified duration. - -A node supporting the Time from now option MUST support the creation of a schedule with the following start time fields’ combination: Relative = ‘1’ and YYMMDD = 0xFF, 0x00, Days, Weekdays = 0x00, HH:MM = Hours:Minutes - -A receiving node MUST ignore all combinations which do not comply with the one above if the Relative flag is set. - -A node supporting this option is NOT REQUIRED to support the Start hour and Minute option or Calendar time option even though it MUST be able to read the start day, start hour and start minutes fields when using this option. - -### 4.77.3.2 Start Time mode: Recurring Mode - -This mode is used to trigger a schedule repeatedly at fixed intervals. When using this mode, a schedule will start at the specified start time and will restart after a given time has elapsed since the last activation. - -The recurring mode is configured with the Recurrence Offset and Recurrence Mode fields of the Schedule Set Command. - -A node supporting the Recurring Mode MUST support at least one start time option. - -## 4.77.4 Schedule Set Command - -This command is used to create a new schedule or modify an existing schedule This command MUST enable the schedule if a new schedule is created. This command MUST NOT change the enabled/disabled state of existing schedules. - -If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Recurrence Offset | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| Res. | | | Recurrence Mode | | | | | | Start Day of Month | | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Res. | | | Relative | | | Start Minute | | | | | | | | | | | | | | | | | | -| Duration Byte 1 MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 LSB | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 2. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -### 4.77.4.1 Recurrence fields - -The recurrence settings of a schedule are set by the following fields: - - Recurrence Mode  Recurrence Offset - -These fields MUST be ignored by a node advertising no support for the Recurring Mode start time mode in the Schedule Supported Report Command. - -Recurrence mode (2 bits) - -This field is used to specify the unit of the Recurrence Offset field. [This field MUST comply with Table 109.](04.77-schedule-command-class-version-3.md#47741-recurrence-fields) - -Table 109. Recurrence Mode encoding - -| | Value | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | The recurrence Offset is expressed in Hours | | | 3 | | | -| 0x01 | | | The recurrence Offset is expressed in Days | | | 3 | | | -| 0x02 | | | The recurrence Offset is expressed in Weeks | | | 3 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -This field MUST be ignored if the Recurrence Offset field is set to 0. - -Recurrence Offset (4 bits) - -This field is used to specify the interval at which the recurring schedule will be triggered. - -[This field MUST be encoded according to Table 110 and MUST be interpreted together with the](04.77-schedule-command-class-version-3.md#47741-recurrence-fields) Recurrence Mode field. - -Table 110. Recurrence Offset encoding - -| | Offset | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Recurrence Disabled | | | -| 1..15 | | | Repeat every 1..15 hour, day or week The unit (hour, day or week) is indicated by the Recurrence Mode field. | | | - -When a schedule starts due to its start time options, it MUST restart the current recurrence timer. It CC:0053.03.03.11.00B means that a schedule MUST start every time the start time condition is met and the recurrence offset CC:0053.03.03.11.00C MUST trigger the schedule to restart based on the last time it started. - -st For example, a schedule set to start on the 1 of each month with a 2 day recurrence offset MUST start st rd th th th st st rd on the 1, 3, 5 …, 27, 29, 31 and will start again the next month on the 1, 3, etc. - -A receiving node MUST accept a schedule set to start in the past if recurrence is enabled. In this case, the recurrence MUST trigger the schedule to restart based on the time it should have been started last. - -### 4.77.4.2 Start time fields - -The Schedule start time is defined by the following fields: - - Start Year  Start Month  Start Day of Month  Start Weekday  Start Hour  Start Minute  Relative - -[A receiving node MUST support the start time fields combinations indicated in sections 4.75.4.1, 4.75.4.2](04.75-schedule-command-class-version-1/04.75.04-schedule-supported-report-command.md#47541-start-time-option-start-now) [4.75.4.3, 4.75.4.4 and 4.77.3.1 if the corresponding start time option is supported.](04.75-schedule-command-class-version-1/04.75.04-schedule-supported-report-command.md#47543-start-time-option-calendar-time) - -If none of the start time fields are specified, the schedule MUST start immediately if the start now option is supported. In this case, the schedule MUST NOT be activated again at a later time unless receiving another Schedule Set Command. - -Relative (1 bit) - -This field is used to indicate if the schedule start time is using the start from now start option. - -The value 1 MUST indicate that the start time fields MUST be interpreted as the time left before the [schedule starts. In this case, the start time fields MUST be set and interpreted as indicated in 4.77.3.1](04.77-schedule-command-class-version-3.md#47731-start-time-option-start-from-now) and the schedule MUST NOT be activated again at a later time unless receiving another Schedule Set Command. - -The value 0 MUST indicate that the start time fields MUST be interpreted as an absolute start time for the schedule. - -## 4.77.5 Schedule Get Command - -This command is used to request the configuration for a specific schedule ID. - -The Schedule Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE GET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| AID RO CTL _ _ | | | Reserved | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 2. Active_ID / Recurrence Offset control (AID_RO_CTL) (1 bit) - -This field is used to request either the Active_ID or the Recurrence Offset value in the Schedule Report Command which is returned in response to this command. - -A receiving node MUST return a Schedule Report Command advertising the Active_ID of the Schedule if this field is set to 0. - -A receiving node MUST return a Schedule Report Command advertising the Recurrence Offset of the schedule if this field is set to 1. - -## 4.77.6 Schedule Report Command - -The Schedule Report Command is used to advertise the configuration for a specific schedule. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Active ID/Recurrence Offset (AID RO) _ _ | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| AID RO _ _ CTL | | | Recurrence Mode | | | | | | Start Day of Month | | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Res. | | | Relative | | | | Start Minute | | | | | | | | | | | | | | | | | -| Duration Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Report to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 – N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 2. Active_ID/Recurrence Offset (AID_RO) (4 bits) - -This field is used to advertise the Active_ID or the Recurrence Offset of the advertised schedule. - -[If this field carries the Active_ID value, this field MUST be encoded according to Table 107.](04.75-schedule-command-class-version-1/04.75.11-schedule-state-report-command.md#47511-schedule-state-report-command) - -[If this field carries the Recurrence Offset, this field MUST be encoded according to Table 110 and MUST](04.77-schedule-command-class-version-3.md#47741-recurrence-fields) be interpreted together with the Recurrence Mode field. - -Active_ID / Recurrence Offset control (AID_RO_CTL) (1 bit) - -This field is used to indicate whether the Active_ID or the Recurrence Offset value is advertised in the command. - -The value 0 MUST indicate that the Active_ID/Recurrence Offset (AID_RO) field carried the Active_ID value. - -The value 1 MUST indicate that the Active_ID/Recurrence Offset (AID_RO) field carried the Recurrence Offset value. - -Recurrence mode (2 bits) - -This field is used to specify the Recurrence Offset unit. - -This field MUST be ignored if the AID_RO_CTL field is set to 0. [This field MUST comply with Table 109 if the AID_RO_CTL field is set to 1.](04.77-schedule-command-class-version-3.md#47741-recurrence-fields) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.78-schedule-command-class-version-4.md b/docs/specs/command-class-specification/04-command-class-definitions/04.78-schedule-command-class-version-4.md deleted file mode 100644 index 210001c..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.78-schedule-command-class-version-4.md +++ /dev/null @@ -1,265 +0,0 @@ - -# 4.78 Schedule Command Class, version 4 - -The Schedule Command Class, version 4 allows supporting nodes to advertise the list of commands they support for scheduling. - -## 4.78.1 Compatibility considerations - -The Schedule Command Class version 4 introduces the possibility to advertise the list of command supported for scheduling and explicitly allows scheduling extended command classes. The following commands are introduced: - - [Schedule Supported Commands Get Command](04.78-schedule-command-class-version-4.md#4783-schedule-supported-commands-get-command)  [Schedule Supported Commands Report Command](04.78-schedule-command-class-version-4.md#4784-schedule-supported-commands-report-command) - -The following functionalities become obsoleted: - - Redundant values in the Active_ID field encoding  The Report to Follow field. - -A supporting node no longer needs to be able to parse and handle several commands in order to set or report schedules or schedules states. Supporting nodes MUST use the Transport Service Command Class, version 2 in order to transmit long Z-Wave payloads. - -A node supporting the Schedule Command Class, version 4 MUST also support version 3. - -Commands not mentioned in this version remain unchanged from version 3. - -## 4.78.2 Schedule Supported Report Command - -This command is used to advertise the scheduling properties of a device. - -| | 7 | | | 6 | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule IDs | | | | | | | | | | | | | | | | | | | | | | -| Support Enable/Di sable | | | Fall- back Support | | Start Time Support | | | | | | | | | | | | | | | | | -| Number of supported CC | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC 1 | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | Command 1 | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | -| | Supported CC N | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | Supported | | | | | -| | | | | | | | | | | | | | | | | | Command N | | | | | -| Override Support | | | Supported Override Types | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule Blocks | | | | | | | | | | | | | | | | | | | | | | - -All fields not described below remain unchanged from version 3. - -Supported Command (N * 2 bits) - -This field MUST advertise the supported commands for the command class entry. This field MUST [comply with Table 111.](04.78-schedule-command-class-version-4.md#4782-schedule-supported-report-command) - -Table 111. Schedule Supported Report v4::Supported Command - -| | Value | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | All Commands within the Command Class are supported | | 1 | | | -| 0x01 | | Only Set Commands are supported | | 1 | | | -| 0x02 | | Only Get Commands are supported | | 1 | | | -| 0x03 | | Custom list of commands are supported. | | 4 | | | - -Certain command classes commands do not contain the string “Set” or “Get” in their name. Nodes MUST consider all commands mandating to return a response to be of type “Get” and all other commands to be of type “Set”. - -The length of this field MUST be according to the Number of supported CC field value. A supporting node MUST NOT advertise the 0x03 value if the list of supported command can be advertised with the other values. - -If a sending node advertises 0x03 for a given Schedule ID Block and Command Class, a controlling node SHOULD retrieve the exact list of supported commands using the Schedule Supported Commands Get Command. - -## 4.78.3 Schedule Supported Commands Get Command - -This command is used to query the list of commands that can be scheduled within for a given command class and Schedule ID Block. - -The Schedule Supported Commands Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED COMMANDS GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Schedule ID Block (8 bits) - -This field is used to request a particular Schedule ID Block. - -If a non-supported Schedule ID Block is specified, a receiving node SHOULD return a response for the Schedule ID block 1. - -## 4.78.4 Schedule Supported Commands Report Command - -This command is used to advertise the list of commands that can be scheduled within for a given Schedule ID Block - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SUPPORTED COMMANDS REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Command Class List Length | | | | | | | | | | | | | | | | | | | | | | | | -| | Command Class 1 (1 or 2 bytes) | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Command List Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Command 1 – 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Command 1 – K | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Command Class N (1 or 2 bytes) | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Command List Length N | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Command N – 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Supported Command N – K | | | | | | | | | | | | | | | | | | | | | | | - -Schedule ID Block (8 bits) - -This field is used to specify the requested Schedule ID Block. - -Command Class List Length (8 bit) - -This field is used to advertise the number of command classes contained in the command. - -This field MUST be set to the number of Command Class entries present in this command (represented by N in the command structure). - -Command Class (8 or 16 bits) - -This field is used to indicate the command class to which the advertised commands belong. This field MAY carry extended Command Classes - -Supported Command List Length (8 bits) - -This field is used to advertise how many commands are advertised in the current Command Class’ list. - -This field MUST be set to the number of Supported Commands present in the current Command Class entry (represented by K in the command structure). Supported Command (K bytes) - -This field is used to advertise the list of commands for the given Command Class entry that can be scheduled for the actual Schedule ID Block. - -The length of this field in bytes MUST be according to the corresponding Supported Command List Length field value. - -## 4.78.5 Schedule Set Command - -This command is used to create a new schedule or modify an existing schedule. This command MUST enable the schedule if a new schedule is created. This command MUST NOT change the enabled/disabled state of existing schedules - -If the receiving node supports S0 or S2 Command Class, it MUST NOT process the schedule creation if any of the scheduled command classes is not supported at the security level of the received Schedule Set Command. - -A controlling node using previous versions may try to schedule unsupported commands. In this case, a receiving node MUST ignore the Schedule Set Command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE SET _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Recurrence Offset | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| Res. | | | Recurrence Mode | | | | | | Start Day of Month | | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Res. | | | Relative | | | Start Minute | | | | | | | | | | | | | | | | | | -| Duration Byte 1 MSB | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 LSB | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow [OBSOLETED] | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 3. Reports to Follow (8 bits) [OBSOLETED] - -This field has been OBSOLETED: a sending node MUST use the Transport Service Command Class in order to set a schedule containing commands payload too large to fit in the Z-Wave MAC frame size. - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.78.6 Schedule Report Command - -The Schedule Report Command is used to advertise the configuration for a specific schedule. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE REPORT _ | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year | | | | | | | | | | | | | | | | | | | | | | | | -| Active ID/Recurrence Offset (AID RO) _ _ | | | | | | | | | | | | Start Month | | | | | | | | | | | | -| AID RO _ _ CTL | | | Recurrence Mode | | | | | | Start Day of Month | | | | | | | | | | | | | | | -| Res. | | | Start Weekday | | | | | | | | | | | | | | | | | | | | | -| Duration Type | | | | | | | | | Start Hour | | | | | | | | | | | | | | | -| Res. | | | Relative | | | | Start Minute | | | | | | | | | | | | | | | | | -| Duration Byte 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Duration Byte 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Report to Follow [OBSOLETED] | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Cmd to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length 1 | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte 1 – N | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Length P | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - 1 | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Cmd Byte P - N | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 3. Active_ID/Recurrence Offset (4 bits) - -This field is used to advertise the Active_ID or the Recurrence Offset of the advertised schedule. - -[If this field carries the Active_ID value, this field MUST be encoded according to Table 112.](04.78-schedule-command-class-version-4.md#4787-schedule-state-report-command) - -[If this field carries the Recurrence Offset, this field MUST be encoded according to Table 110 and MUST](04.77-schedule-command-class-version-3.md#47741-recurrence-fields) be interpreted together with the Recurrence Mode field. - -Reports to Follow (8 bits) [OBSOLETED] - -This field has been OBSOLETED: a sending node MUST use the Transport Service Command Class in order to report a schedule containing commands payload too large to fit in the Z-Wave MAC frame size. - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.78.7 Schedule State Report Command - -This command is used to advertise the status of all schedules supported by the specified schedule block. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCHEDULE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCHEDULE STATE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Supported Schedule ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow [OBSOLETED] | | | | | | | | | | | | | | | | | | | | Override | | | | -| Active ID 2 _ | | | | | | | | | | | | Active ID 1 _ | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Active ID N _ | | | | | | | | | | | | Active ID N-1 _ | | | | | | | | | | | | -| Schedule ID Block | | | | | | | | | | | | | | | | | | | | | | | | - -Fields not described below remain unchanged from version 3. - -Reports to Follow (8 bits) [OBSOLETED] - -This field has been OBSOLETED: a sending node MUST use the Transport Service Command Class in order to advertise an Active_ID field too large to fit in the Z-Wave MAC frame size. - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Active_ID (N * 4 bits) - -The Active_ID field MUST be used to advertise the status for each supported schedule ID. Four bits are used for each Schedule ID to indicate the status. This means that : - - Bits 0 to 3 in Active_ID byte 1 represent Schedule ID = 1,.  Bits 4 to 7 in Active_ID byte 1 represent Schedule ID = 2  Bits 0 to 3 in Active_ID byte 2 represent Schedule ID = 3  … - -The size of this field MUST be the smallest number of bytes needed to advertise the number of supported Schedule IDs advertised in this command. - -[Each 4 bits unit MUST be encoded according to Table 112.](04.78-schedule-command-class-version-4.md#4787-schedule-state-report-command) - -Table 112. Active_ID encoding, version 4 - -| | Hex | | | Description | | | _ Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0x00 | | | Not used | | | The Schedule ID is not used (not set/configured) or unsupported. | | | 1 | | | -| 0x01 | | | [OBSOLETED] Override + Not used | | | [OBSOLETED] A sending node MUST NOT use this status and MUST use 0x00 instead (and the override field set to 1 for the Schedule State Report Command). | | | 4 | | | -| 0x02 | | | Not Active | | | The Schedule ID is used, enabled and currently not active. | | | 1 | | | -| 0x03 | | | Active | | | The Schedule ID is used, enabled and currently active. | | | 1 | | | -| 0x04 | | | Disabled | | | The Schedule ID is used and disabled. | | | 1 | | | -| 0x05 | | | Override + Active | | | The Schedule ID is used, enabled and should currently be active but it is suspended by the Override Schedule The override field MUST be set to 1 when using this status in the Schedule State Report Command | | | 1 | | | -| 0x06 | | | [OBSOLETED] Override + Not Active | | | [OBSOLETED] A sending node MUST NOT use this status and MUST use 0x02 instead. (and the override field set to 1 for the Schedule State Report Command). | | | 4 | | | -| 0x07 | | | [OBSOLETED] Override + Disabled | | | [OBSOLETED] A sending node MUST NOT use this status and MUST use 0x04 instead. (and the override field set to 1 for the Schedule State Report Command). | | | 4 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.82-screen-attributes-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.82-screen-attributes-command-class-version-1.md deleted file mode 100644 index a160b62..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.82-screen-attributes-command-class-version-1.md +++ /dev/null @@ -1,65 +0,0 @@ - -# 4.82 Screen Attributes Command Class, version 1 - -The Screen Attribute Command Class is used to retrieve screen attributes from the device hosting the screen. This allows another device to send data formatted according to the screen attributes to the device hosting the screen. The screen may be located on any device in the network. - -## 4.82.1 Screen Attributes Get Command - -This command is used to request the screen attributes. - -The Screen Attributes Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCREEN ATTRIBUTES _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCREEN ATTRIBUTES GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.82.2 Screen Attributes Report Command - -This command is used to advertise the screen attributes. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCREEN ATTRIBUTES _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCREEN ATTRIBUTES REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Lines | | | | | | | | | | | | | | | -| Characters per Line | | | | | | | | | | | | | | | | | | | | | | | | -| Line Buffer Size | | | | | | | | | | | | | | | | | | | | | | | | -| Character Encoding | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Number of Lines (5 bits) - -Number of lines the screen supports (1..16). - -Characters per Line (8 bits) - -Number of characters the screen supports on each line (1..255). Line Buffer Size (8 bits) - -Number of characters the line buffer supports for each line (1..255). Size of line buffer will always be equal or larger than the number of visual characters per line. The text will typically scroll in case it is larger than the number of visual characters. - -Character Encoding (8 bits) - -The screen supports the following numerical representations of a character: - -Table 118, Screen Attributes Report::Character Encoding encoding - -| | Bit Map | | | Description | | -| --- | --- | --- | --- | --- | --- | -| Bit 0 | | | Supports ASCII codes if the bit is 1 and the opposite if 0. See APPENDIX A (values 128-255 are ignored) | | | -| Bit 1 | | | Supports ASCII codes and Extended ASCII codes if the bit is 1 and the opposite if 0. See APPENDIX A | | | -| Bit 2 | | | Supports Unicode UTF-16 if the bit is 1 and the opposite if 0. | | | -| Bit 3 | | | Supports ASCII codes and Player codes, see APPENDIX A (undefined values are ignored) | | | - -All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.83-screen-attributes-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.83-screen-attributes-command-class-version-2.md deleted file mode 100644 index d555f1f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.83-screen-attributes-command-class-version-2.md +++ /dev/null @@ -1,54 +0,0 @@ - -# 4.83 Screen Attributes Command Class, version 2 - -The Screen Attribute Command Class, version 2 introduces the Screen Timeout of the Screen Attributes Command. - -Details not mentioned remain the same as in version 1. - -## 4.83.1 Screen Attributes Report Command - -This command is used to advertise the screen attributes. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCREEN ATTRIBUTES _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCREEN ATTRIBUTES REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | Escape Sequence | | | Number of Lines | | | | | | | | | | | | | | | -| Characters per Line | | | | | | | | | | | | | | | | | | | | | | | | -| Line Buffer Size | | | | | | | | | | | | | | | | | | | | | | | | -| Character Encoding | | | | | | | | | | | | | | | | | | | | | | | | -| Screen Timeout | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Escape Sequence(1 bit) - -If set to 0, escape sequences are not supported by the device. If set to 1, escape sequences are supported by the device. - -Number of Lines (5 bits) - -Number of lines the screen supports (1..16). - -Characters per Line (8 bits) - -Number of characters the screen supports on each line (1..255). - -Line Buffer Size (8 bits) - -Number of characters the line buffer supports for each line (1..255). Size of line buffer will always be equal or larger than the number of visual characters per line. The text will typically scroll in case it is larger than the number of visual characters. Character Encoding (8 bits) - -[This field MUST be encoded according to Table 118](04.82-screen-attributes-command-class-version-1.md#4822-screen-attributes-report-command) - -All other bits are reserved and MUST be set to zero by a sending node. Reserved bits MUST be ignored by a receiving node. - -Screen Timeout (8 bits) - -If Screen Timeout is set to 0, the display is always on. A value larger than 0 MUST specify the display timeout in seconds. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.84-screen-meta-data-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.84-screen-meta-data-command-class-version-1.md deleted file mode 100644 index 4bd13e9..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.84-screen-meta-data-command-class-version-1.md +++ /dev/null @@ -1,141 +0,0 @@ - -# 4.84 Screen Meta Data Command Class, version 1 - -The Screen Meta Data Command Class is used to streaming data containing user related information to a screen located on a device in a Z-Wave network. The screen can request single or multiple data packets. The device having the data containing user related information to the screen can also initiate the data streaming. - -In order not to congest the Z-Wave network, large data transfers MUST leave transmit opportunities for other nodes in the network. If sending a command longer than two frames, a node MUST implement a delay between every transmitted frame. The minimum required time delay and number of frames before a delay must be inserted depends on the actual bit rate. - - 40 kbit/s: At least 35 ms if sending more than 2 frames back-to-back  100 kbit/s: At least 15 ms if sending more than 2 frames back-to-back - -## 4.84.1 Screen Meta Data Get Command - -This command is used to request the Screen Meta Data Report Command. The Screen Meta Data Get Command is used as handshake to avoid buffer overflow in the receiving node. The Screen Meta Data Get Command will optionally be able to request multiple Screen Meta Data Report Commands to improve the effective bandwidth. - -The Screen Meta Data Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCREEN MD _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCREEN MD GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of Reports | | | | | | | | | | | | | | | | | | | | | | | | -| NodeID | | | | | | | | | | | | | | | | | | | | | | | | - -Number of Reports (8 bits) - -Number of Screen Meta Data Report Commands to be received without requesting each Screen Meta Data Report Command (1..255). Be aware of overflow when requesting multiple reports. - -NodeID (8 bits) - -The NodeID (1..232) specifies the device to receive the requested reports. In case NodeID is equal to 0x00, the information is requested by the source NodeID of the Screen Meta Data Get Command. - -## 4.84.2 Screen Meta Data Report Command - -This command is used to send data to the device hosting the screen. - -The size of the payload SHOULD NOT be bigger than 48 bytes. It is possible to write characters to multiple lines in the same frame. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCREEN MD _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCREEN MD REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| More Data | | | Reser- ved | | | Screen Settings | | | | | | | | | Character Encoding | | | | | | | | | -| | Line Settings A | | | | | | | | | Clear A | | | Line Number A | | | | | | | | | | | -| | Character Position A | | | | | | | | | | | | | | | | | | | | | | | -| | Number of Characters A | | | | | | | | | | | | | | | | | | | | | | | -| | Character 1,A | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Character N,A | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Line Settings B | | | | | | | | | Clear B | | | Line Number B | | | | | | | | | | | -| | Character Position B | | | | | | | | | | | | | | | | | | | | | | | -| | Number of Characters B | | | | | | | | | | | | | | | | | | | | | | | -| | Character 1,B | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Character N,B | | | | | | | | | | | | | | | | | | | | | | | - -More Data (1 bit) - -The more data bit indicates if additional reports are expected before the whole data streaming is completed. If the more data bit is set to 1 then additional reports are expected and the opposite if 0. Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Screen Settings (3 bits) - -[This field MUST comply with Table 119:](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -[Table 119, Screen Meta Data Report::Screen Settings encoding](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -| | Screen Settings | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Whole screen is cleared before lines are written | | | -| 1 | | | Current content on screen is scrolled one line down | | | -| 2 | | | Current content on screen is scrolled one line up | | | -| 7 | | | Do not change the current content on the screen | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Character Encoding (3 bits) - -[This field MUST comply with Table 120:](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -Table 120, Screen Meta Data Report::Character Encoding encoding - -| | Character Encoding | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Using standard ASCII codes, see APPENDIX A (values 128-255 are ignored) | | | -| 1 | | | Using standard ASCII codes and OEM Extended ASCII codes, see APPENDIX A | | | -| 2 | | | Unicode UTF-16 | | | -| 3 | | | Using standard ASCII codes and Player codes, see APPENDIX A (undefined values are ignored) | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Note: Devices supporting Unicode UTF-16 characters are described by a 2 byte long decimal representation. The first byte is the most significant byte. E.g. if there is one Unicode character in the set frame the char 1 will be MSB and char 2 will be LSB of the Unicode character. Line Settings (3 bits) - -[This field MUST comply with Table 121:](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -Table 121, Screen Meta Data Report::Line Settings encoding - -| | Line Settings | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Characters are written in selected font | | | -| 1 | | | Characters are written as highlighted | | | -| 2 | | | Characters are written using a larger font compared to line settings equal to 0 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Clear (1 bit) - -Determine if the characters are written directly or line is cleared first. - -Table 122, Screen Meta Data Report::Clear encoding - -| | Clear | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 | | | Characters are written directly | | | -| 1 | | | Line is cleared before characters are written | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Line Number (4 bits) - -The line number field indicates the line to write the characters to counting from zero (0..15). - -Character Position (8 bits) - -The character position field indicates where on the line to write the characters counting from zero (0..255). The character position may be larger than the display size in case the line buffer is bigger (See the Screen Attributes Report Command). - -Number of Characters (8 bits) - -The number of characters field indicates how many characters to be written on the screen for the specified line number, counting from 1. - -Character (N bytes) - -The character fields hold the string to output in specified character representation. Characters will be ignored in case there is no room left in the line buffer. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.85-screen-meta-data-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.85-screen-meta-data-command-class-version-2.md deleted file mode 100644 index a5bd618..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.85-screen-meta-data-command-class-version-2.md +++ /dev/null @@ -1,103 +0,0 @@ - -# 4.85 Screen Meta Data Command Class, version 2 - -The Screen Meta Data Command Class, version 2 introduces a Screen Timeout bit. The support for the Screen Timeout bit may be advertised by the Screen Attribute Command Class, version 2. - -Details not mentioned remain the same as in version 1. - -## 4.85.1 Screen Meta Data Report Command - -This command is used to transfer data to the device hosting the screen. The size of the payload MUST NOT be bigger than 48 bytes. It is possible to write characters to multiple lines in the same frame. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SCREEN MD _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SCREEN MD REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| More Data | | | Ex- tended Setup | | | Screen Settings | | | | | | | | | Character Encoding | | | | | | | | | -| | Line Settings A | | | | | | | | | Clear A | | | Line Number A | | | | | | | | | | | -| | Character Position A | | | | | | | | | | | | | | | | | | | | | | | -| | Number of Characters A | | | | | | | | | | | | | | | | | | | | | | | -| | Character 1,A | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Character N,A | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Line Settings B | | | | | | | | | Clear B | | | Line Number B | | | | | | | | | | | -| | Character Position B | | | | | | | | | | | | | | | | | | | | | | | -| | Number of Characters B | | | | | | | | | | | | | | | | | | | | | | | -| | Character 1,B | | | | | | | | | | | | | | | | | | | | | | | -| | … | | | | | | | | | | | | | | | | | | | | | | | -| | Character N,B | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | | | Screen Timeout | | | - -More Data (1 bit) - -The more data bit indicates if additional reports are expected before the whole data streaming is completed. If the more data bit is set to 1 then additional reports are expected and the opposite if 0. Extended Setup (1 bit) - -If set to true, the last byte of the payload defines an extended setup. - -Screen Settings (3 bits) - -[The screen settings identifier MUST be encoded according to Table 119.](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Character Encoding (3 bits) - -[The Character Encoding identifier MUST be encoded according to Table 120.](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -Note: Devices supporting Unicode UTF-16 characters are described by a 2 byte long decimal representation. The first byte is the most significant byte. E.g. if there is one Unicode character in the set frame the char 1 will be MSB and char 2 will be LSB of the Unicode character. - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Line Settings (3 bits) - -[The line settings identifier MUST be encoded according to Table 123.](04.85-screen-meta-data-command-class-version-2.md#4851-screen-meta-data-report-command) - -Table 123, Screen Meta Data Report version 2::Line Settings encoding - -| | Line Settings | | | Description | | | Version | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 0 | | | Characters are written in selected font | | | 1 | | | -| 1 | | | Characters are written as highlighted | | | 1 | | | -| 2 | | | Characters are written using a larger font compared to line settings equal to 0 | | | 1 | | | -| 3 | | | Characters are written using a larger font (font B) & highlighted | | | 2 | | | -| 4 | | | Characters are written in selected font (font A), no scroll | | | 2 | | | -| 5 | | | Characters are written in selected font (font A) & highlighted, no scroll | | | 2 | | | -| 6 | | | Characters are written using a larger font (font B), no scroll | | | 2 | | | -| 7 | | | Characters are written using a larger font (font B) & highlighted, no scroll | | | 2 | | | - -For values 0-3, text will be scrolled. For values 4-7 the text will not be scrolled, and will be truncated if it is longer than the width of the display. - -Clear (1 bit) - -[Determine if the characters are written directly or line is cleared first. Refer to Table 122](04.84-screen-meta-data-command-class-version-1.md#4842-screen-meta-data-report-command) - -Line Number (4 bits) - -The line number field indicates the line to write the characters to counting from zero (0..15). Character Position (8 bits) - -The character position field indicates where on the line to write the characters counting from zero (0..255). The character position MAY be larger than the display size in case the line buffer is bigger (See the Screen Attributes Report Command). - -Number of Characters (8 bits) - -The number of characters field indicates how many characters to be written on the screen for the specified line number, counting from 1. - -Character (N bytes) - -The character fields hold the string to output in specified character representation. Characters will be ignored in case there is no room left in the line buffer. If the Escape Sequence Bit is true in the SCREEN_ATTRIBUTES_REPORT Command, the device supports advanced display features by making escape sequences in the form of an Escape char followed by a char value 0..255. - -Screen Timeout (1 bit) - -If the screen timeout is set to 0 the preset timeout SHOULD be used. - -If set to 1 the device SHOULD keep the display powered. This does not affect the RF. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.87-simple-av-control-command-class-version-1-4.md b/docs/specs/command-class-specification/04-command-class-definitions/04.87-simple-av-control-command-class-version-1-4.md deleted file mode 100644 index 0c7bc58..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.87-simple-av-control-command-class-version-1-4.md +++ /dev/null @@ -1,130 +0,0 @@ - -# 4.87 Simple AV Control Command Class, version 1-4 - -The Simple AV Control Command Class is used to control an AV device in a Z-Wave network. The Simple AV Control Command Class is suited for IR remote replacement. Furthermore, this command class supports Windows Vista Media Center and Media Center 2005 remote controls. - -## 4.87.1 Simple AV Control Set Command - -This command is used to control an AV device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SIMPLE AV CONTROL SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Sequence Number | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | Key Attributes | | | | | | | | | -| Reseved [OBSOLETED] | | | | | | | | | | | | | | | | | | | | | | | | -| Reseved [OBSOLETED] | | | | | | | | | | | | | | | | | | | | | | | | -| | Command MSB,1 | | | | | | | | | | | | | | | | | | | | | | | -| | Command LSB,1 | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Command MSB,N | | | | | | | | | | | | | | | | | | | | | | | -| | Command LSB,N | | | | | | | | | | | | | | | | | | | | | | | - -Sequence Number (8 bits) - -The sequence number is incremented each time a Simple AV Control Set Command is issued. The receiving node uses the sequence number to ignore duplicates. - -Key Attributes (3 bits) - -The key attributes specifies the state of the key. Currently the following key attribute definitions exist: Table 124, Simple AV Control Set::Key Attributes encoding - -| | Key Attribute | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | Key Down – Sent when a new key is pressed. It is mandatory to send a Simple AV Control Set Command when this event occurs. | | | -| 0x01 | | | Key Up – Sent when the key is released. It is optional to send a Simple AV Control Set Command when this event occurs. Only the sequence number and key attribute parameter is changed in the Command. | | | -| 0x02 | | | Keep Alive – Sent every 100-200ms while the key is still held down. Event used as a failsafe feature for the ramping function, e.g. avoid volume jumps to maximum in case a key up event is not received. The keep alive event can also be used to control the speed of the ramping function, e.g. the first few seconds of the key held down is the speed slow and afterwards will it gradually accelerate. It is optional to send a Simple AV Control Set Command when this event occurs. Only the sequence number and key attribute parameter is changed in the Command. | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Un-supported key attribute values MUST be ignored. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Command MSB, Command LSB (N * 16 bits) - -This field is used to carry the AV Control command. - -[Each 16 bits-unit MUST carry a defined AV Control code. Refer to [19] for the defined AV Control codes. Values not defined in [19] are reserved and MUST NOT be used.](04.107-window-covering-command-class-version-1.md#410710-window-covering-stop-level-change-command) - -It is possible to specify a sequence of AV commands in one frame. If an AV control command is not supported, it MUST be ignored by a receiving node. - -Command numbers 1 through 40 are the most popular commands used in AV remotes. Command numbers 41 through 363 are less popular and is sorted in alphanumerical order. Support for Windows Vista Media Center and Media Center 2005 remote controls is added with command numbers from 364 to 377 including 16, 200 and 231. - -## 4.87.2 Simple AV Control Get Command - -This command is used to request the number of reports necessary to report the supported AC Commands from the device. - -The Simple AV Control Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SIMPLE AV CONTROL GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.87.3 Simple AV Control Report Command - -This command is used to report the necessary number of reports to report the supported AC Commands from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SIMPLE AV CONTROL REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Number of reports | | | | | | | | | | | | | | | | | | | | | | | | - -Number of reports (8 bits) - -The number of reports necessary to report the entire list of supported AC Commands. - -## 4.87.4 Simple AV Control Supported Get Command - -This command is used to request the AV Commands supported by the AV device. - -The Simple AV Control Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SIMPLE AV CONTROL SUPPORTED GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Report No | | | | | | | | | | | | | | | | | | | | | | | | - -Report No (8 bits) - -Report no. field is used to request wanted report number. The report no. values MUST be a sequence starting from 1. - -## 4.87.5 Simple AV Control Supported Report Command - -This command is used to report the supported AC Commands from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SIMPLE AV CONTROL _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SIMPLE AV CONTROL SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Report No | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Report No (8 bits) - -Report no. field specify the request report number. - -Bit Mask (N bytes) - -The Bit Mask fields describe the supported AV Control Commands by the device. - - Bit 0 in Bit Mask 1 indicates if Command #1 is supported.  Bit 1 in Bit Mask 1 indicates if Command #2 is supported.  … - -If a Command is supported, the bit MUST be set to 1. If a Command is not supported, the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported Command #. Mask fields bigger than 45 bytes not allowed. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.88-sound-switch-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.88-sound-switch-command-class-version-1.md deleted file mode 100644 index 02e7cc6..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.88-sound-switch-command-class-version-1.md +++ /dev/null @@ -1,255 +0,0 @@ - -# 4.88 Sound Switch Command Class, version 1 - -The Sound Switch Command Class is used to manage nodes with a speaker or sound notification capability. It can be used for a doorbell, alarm clock, siren or any device issuing sound notifications. - -## 4.88.1 Terminology - -A Sound Switch is a sound notification device with pre-recorded tones. A tone can be a short sound effect as well as an entire song. The volume setting can be configured and the node will subsequently play tones using the configured volume for any tone. A default tone can also be configured, allowing the Sound Switch to play same sound when controlled by a node without the ability to select between tones. - -A Sound Switch node advertises a name and duration for each tone. This information is used to guide an end-user in its tone selection and helps controlling nodes to know when the tone is finished playing. - -## 4.88.2 Compatibility considerations - -[The Sound Switch Command Class is an actuator control Command Class. Refer to section 3.6.](../03-command-class-overview/03.06-actuator-control.md#36-actuator-control) - -A node supporting this Command Class MUST support at least 1 tone. - -The implemented tone identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 tones MUST accept Tone Identifiers in the range 1..10. - -## 4.88.3 Sound Switch Tones Number Get Command - -This command is used to request the number of tones supported by the receiving node. - -[The Sound Switch Tones Number Report Command MUST be returned in response to this command.](04.88-sound-switch-command-class-version-1.md#4884-sound-switch-tones-number-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONES NUMBER GET (0x01) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.88.4 Sound Switch Tones Number Report Command - -This command is used to advertise the number of tones supported by the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONES NUMBER REPORT (0x02) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Supported Tones | | | | | | | | | | | | | | | | | | | | | | | | - -Supported Tones (8 bits) - -This field MUST be set to the total amount of supported tones. This field MUST be in the range 1..255. - -## 4.88.5 Sound Switch Tone Info Get Command - -This command is used to query the information associated to a tone at a supporting node. - -[The Sound Switch Tone Info Report MUST be returned in response to this command.](04.88-sound-switch-command-class-version-1.md#4886-sound-switch-tone-info-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONE INFO GET (0x03) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Tone Identifier | | | | | | | | | | | | | | | | | | | | | | | | - -Tone Identifier (8 bits) - -This field is used to specify the requested Tone Identifier. - -The implemented tone identifier values MUST be in a sequence starting from 1, i.e. a node supporting 10 tones MUST accept Tone Identifiers in the range 1..10. - -A sending node MUST specify a Tone Identifier that is supported by a receiving node, i.e. in the range 1..{Total number of supported tones}. - -A node receiving this command for an unsupported Tone Identifier or for Tone Identifier 0x00 MUST return a zero duration and a zero length name. - -## 4.88.6 Sound Switch Tone Info Report Command - -This command is used to advertise the information associated to a tone at a supporting node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONE INFO REPORT (0x04) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Tone Identifier | | | | | | | | | | | | | | | | | | | | | | | | -| Tone Duration 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Tone Duration 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Name Length | | | | | | | | | | | | | | | | | | | | | | | | -| Name 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Name N | | | | | | | | | | | | | | | | | | | | | | | | - -Tone Identifier (8 bits) - -This field is used to advertise the Tone Identifier for which the associated information is being advertised. - -Tone Duration (16 bits) - -This field is used to advertise duration of the Tone Identifier. - -This field MUST indicate the time in seconds it takes to play the actual Tone Identifier. - -This field MUST be set to 0 if the Tone Identifier is set to 0x00 or a value higher than the total number of [supported tones advertised in the Sound Switch Tones Number Report Command.](04.88-sound-switch-command-class-version-1.md#4884-sound-switch-tones-number-report-command) - -Name Length (8 bits) - -This field indicates the length in bytes of the Name field. This field MUST be in the range 1..255 if the Tone Identifier is supported. - -This field MUST be set to 0 if the Tone Identifier is set to 0x00 or a value higher than the total number of [supported tones advertised in the Sound Switch Tones Number Report Command.](04.88-sound-switch-command-class-version-1.md#4884-sound-switch-tones-number-report-command) - -Name (N bytes) - -This field is used to indicate the assigned name or label for the actual Tone Identifier. - -The length of this field in bytes MUST comply with the advertised value in the Name Length field. This field MUST be omitted if the Name Length field is set to 0. The field MUST be formatted as a byte array with no zero termination. The characters MUST be encoded in UTF-8 format. - -## 4.88.7 Sound Switch Configuration Set Command - -This command is used to set the configuration for playing tones at the supporting node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH CONFIGURATION SET (0x05) _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Volume | | | | | | | | | | | | | | | | | | | | | | | | -| Default Tone Identifier | | | | | | | | | | | | | | | | | | | | | | | | - -Volume (8 bits) - -This field is used to specify the volume at which the node will play tones. - -[The encoding of the Volume field MUST be according to Table 125.](04.88-sound-switch-command-class-version-1.md#4887-sound-switch-configuration-set-command) - -Table 125, Sound Switch Configuration Set::Volume encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0 (0x00) | | | This value MUST indicate an Off/Mute volume setting (0%) | | | -| 1..100 (0x01..0x64) | | | These values MUST indicate the actual volume setting from respectively 1% to 100%. A supporting node MAY implement fewer than 100 hardware level. In this case, mapping of hardware levels MUST be monotonous. , i.e. a higher value MUST be mapped to either the same or a higher hardware level. | | | -| 255 (0xFF) | | | This value MUST indicate to restore most recent non-zero volume setting. This value MUST be ignored if the current volume is not zero (0x00). This value MAY be used to set the Default Tone Identifier and do not modify the volume setting | | | - -CC:0079.01.05.11.002 0 (0x00) This value MUST indicate an Off/Mute volume setting (0%) - -CC:0079.01.05.11.003 1..100 These values MUST indicate the actual volume setting from respectively 1% to 100%. - -CC:0079.01.05.11.004 255 (0xFF) This value MUST indicate to restore most recent non-zero volume setting. - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -Default Tone Identifier (8 bits) - -[This field is used to specify the Default Tone. This Tone will be played if receiving the Sound Switch Tone Play Set Command for an unsupported value or for the 0xFF value.](04.88-sound-switch-command-class-version-1.md#4889-sound-switch-configuration-report-command) - -The value 0x00 MUST indicate that the receiving node MUST NOT update its current default tone and the command is sent to configure the volume only. - -Values in the range 1..{Total number of supported tones} MUST indicate that the receiving node MUST use the specified Identifier as Default Tone. - -[Values higher than the Total number of supported tones advertised in the Sound Switch Tones Number Report Command MUST be ignored by a receiving node.](04.88-sound-switch-command-class-version-1.md#4884-sound-switch-tones-number-report-command) - -## 4.88.8 Sound Switch Configuration Get Command - -This command is used to request the current configuration for playing tones at the supporting node. - -[The Sound Switch Configuration Report Command MUST be returned in response to this command.](04.88-sound-switch-command-class-version-1.md#4889-sound-switch-configuration-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH CONFIGURATION GET (0x06) _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.88.9 Sound Switch Configuration Report Command - -This command is used to advertise the current configuration for playing tones at the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH CONFIGURATION REPORT (0x07) _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Volume | | | | | | | | | | | | | | | | | | | | | | | | -| Default Tone Identifer | | | | | | | | | | | | | | | | | | | | | | | | - -Volume (8 bits) - -This field is used to advertise the current volume setting at the sending node. - -This field MUST be in the range 0..100. Values in the range 0..100 MUST indicate the current volume percentage. - -Default Tone Identifier (8 bits) - -This field is used to advertise the current configured Default Tone. This Tone Identifier will be played if [receiving a Sound Switch Tone Play Set Command for an unsupported value or for the 0xFF value.](04.88-sound-switch-command-class-version-1.md#4889-sound-switch-configuration-report-command) - -This field MUST be in the range 1..{Total number of supported Tones}. Sound Switch Tone Play Set Command 4.88.10 - -This command is used to instruct a supporting node to play (or stop playing) a tone. - -The supporting node MUST play the specified tone immediately when receiving this command. A node already playing a tone MUST interrupt the current tone and start playing the tone specified in this command. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONE PLAY SET (0x08) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Tone identifier | | | | | | | | | | | | | | | | | | | | | | | | - -Tone Identifier (8 bits) - -This field is used to specify the tone that the receiving node MUST play. [This field MUST be encoded according to Table 126.](04.88-sound-switch-command-class-version-1.md#4889-sound-switch-configuration-report-command) - -Table 126, Sound Switch Tone Play Set::Tone Identifier encoding - -| | Value | | | Description | | -| --- | --- | --- | --- | --- | --- | -| 0x00 | | | No Tone MUST be played. A supporting node MUST stop playing any tone when receiving this value. | | | -| 0x01..0xFE | | | A supporting node MUST play the specified Tone identifier using the configured volume setting. A node receiving a non-supported Tone Identifier (higher than the Total number of supported tones) MUST play the default tone using the configured volume setting. | | | -| 0xFF | | | The supporting node MUST play the default tone using the configured volume setting. | | | - -CC:0079.01.08.11.005 0x00 No Tone MUST be played. - -CC:0079.01.08.11.006 0x01..0xFE A supporting node MUST play the specified Tone identifier using the configured volume - -CC:0079.01.08.11.007 0xFF The supporting node MUST play the default tone using the configured volume setting. - -## 4.88.11 Sound Switch Tone Play Get Command - -This command is used to request the current tone being played by the receiving node. - -[The Sound Switch Tone Play Report Command MUST be returned in response to this command.](04.88-sound-switch-command-class-version-1.md#48812-sound-switch-tone-play-report-command) - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONE PLAY GET (0x09) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.88.12 Sound Switch Tone Play Report Command - -This command is used to advertise the current tone being played by the sending node. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS SOUND SWITCH _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = SOUND SWITCH TONE PLAY REPORT (0x0A) _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Tone Identifier | | | | | | | | | | | | | | | | | | | | | | | | - -Tone Identifier (8 bits) - -This field MUST indicate which tone is currently being played by the sending node. This field MUST be in the range 0..{Total number of supported tones}. - -The value 0 MUST indicate that no Tone is currently being played. This field MUST be set to 0x00 by a sending node if the configured volume is 0x00 (muted). - -Values in the range 1..{Total number of supported tones} MUST indicate the Tone that is currently being played. - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.89-tariff-table-configuration-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.89-tariff-table-configuration-command-class-version-1.md deleted file mode 100644 index c44b227..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.89-tariff-table-configuration-command-class-version-1.md +++ /dev/null @@ -1,165 +0,0 @@ - -# 4.89 Tariff Table Configuration Command Class, version 1 - -The Tariff Table Configuration Command Class defines the cost for a range of rates. - -The Tariff Table configuration commands are separated for the Tariff Table monitor commands in the Tariff Table Monitor Command Class, allowing the classes to be optionally supported at different Z-Wave security levels. - -## 4.89.1 Tariff Table Supplier Set Command - -This command is used to set the name of the utility supplier in the metering device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF CONFIG _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL SUPPLIER SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Month | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Day | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Precision | | | | | | | | | Standing Charge Period | | | | | | | | | | | | | | | -| Standing Charge Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Value 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Value 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Value 4 | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Supplier Characters | | | | | | | | | | | | | | | -| Supplier Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Supplier Character N | | | | | | | | | | | | | | | | | | | | | | | | - -Utility Timestamp Year (16 bits) - -Tariff applies from the specified year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Utility Timestamp Month (8 bits) - -Tariff applies from the specified month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. - -Utility Timestamp Day (8 bits) - -Tariff applies from the specified day of the month between 01 and 31. - -Utility Timestamp Hour Local Time (8 bits) - -Tariff applies from the specified number of complete hours that have passed since midnight (00-23) in local time. - -Utility Timestamp Minute Local Time (8 bits) - -Tariff applies from the specified number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Utility Timestamp Second Local Time (8 bits) - -Tariff applies from the specified number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. - -Currency (3 bytes) - -ISO 4217 defines the currency code. In the table below are some examples of the codes listed: - -Table 127, Tariff Table Supplier Set::Currency encoding examples - -| | Currency Code | | | Currency 1 | | | Currency 2 | | | Currency 3 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Pound sterling | | | G | | | B | | | P | | | -| US Dollar | | | U | | | S | | | D | | | - -Standing Charge Period (5 bits) - -This field indicates the stated period that standing charge applies e.g. 50p/week. - -Table 128, Tariff Table Supplier Set::Standing Charge Period encoding - -| | Period | | | Value | | -| --- | --- | --- | --- | --- | --- | -| Weekly | | | 0x01 | | | -| Monthly | | | 0x02 | | | -| Quarterly | | | 0x03 | | | -| Yearly | | | 0x04 | | | -| Reserved | | | 0x05-0x1F | | | - -Standing Charge Precision (3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Standing Charge Value (32 bits) - -The Standing Charge value MUST be encoded as a 32-bit signed integer. The first byte MUST be the [most significant byte. Table 10 shows signed decimal values together with their hexadecimal equivalents.](../03-command-class-overview/03.07-common-fields-and-encoding.md#375-signed-encoding) - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Number of Supplier Characters (5 bits) - -Number of characters defining the name of the utility supplier ID (1 … 32). - -Supplier Character (N bytes) - -The supplier character fields hold the string identifying the utility supplier. The character presentation uses standard ASCII codes (values 128-255 are ignored). - -## 4.89.2 Tariff Table Set Command - -This command adds a tariff to a given rate parameter set identifier. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Precision | | | | | | | | | Reserved | | | | | | | | | | | | | | | -| Tariff Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Value 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Value 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Value 4 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID indicates the requested parameter set. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Tariff Precision (3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Tariff Value (32 bits) - -The Tariff value is a 32 bit signed field. The first byte is the most significant byte. shows signed decimal values together with their hexadecimal equivalents. - -## 4.89.3 Tariff Table Remove Command - -This command is used to remove rate parameter set(s). - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL CONFIG _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL REMOVE _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | Rate Parameter Set IDs | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID 1 | | | | | | | | | | | | | | | | | | | | | | | | -| ... | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID N | | | | | | | | | | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Rate Parameter Set IDs (6 bits) - -The rate parameter set id’s indicates the number of rate parameter set id’s in the command. - -Rate Parameter Set ID (N bytes) - -These fields contain a list of Tariffs to be removed from the Tariff Table. All Tariffs are cleared in case no Rate Parameter Set ID’s are supplied. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.90-tariff-table-monitor-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.90-tariff-table-monitor-command-class-version-1.md deleted file mode 100644 index f1e9cfb..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.90-tariff-table-monitor-command-class-version-1.md +++ /dev/null @@ -1,235 +0,0 @@ - -# 4.90 Tariff Table Monitor Command Class, version 1 - -The Tariff Table Monitor Command Class defines the cost for a range of rates. - -## 4.90.1 Tariff Table Supplier Get Command - -This command is used to request the name of the utility supplier. - -The Tariff Table Supplier Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL SUPPLIER GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.90.2 Tariff Table Supplier Report Command - -This command is used to advertise the name of the utility supplier. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL SUPPLIER REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Month | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Day | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Utility Timestamp Second Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Precision | | | | | | | | | Standing Charge Period | | | | | | | | | | | | | | | -| Standing Charge Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Value 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Value 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Standing Charge Value 4 | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Number of Supplier Characters | | | | | | | | | | | | | | | -| Supplier Character 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Supplier Character N | | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to description of fields under the Tariff Table Supplier Set Command (section 4.89.1)](04.89-tariff-table-configuration-command-class-version-1.md#4891-tariff-table-supplier-set-command) - -## 4.90.3 Tariff Table Get Command - -This command is used to request the tariff for the corresponding rate parameter set. - -The Tariff Table Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -[The Rate Parameter Set ID addresses the price for the accompanying rate parameter set. The Rate Table Supported Report Command determines the number of supported rate parameter sets.](04.71-rate-table-monitor-command-class-version-1.md#4712-rate-table-supported-report-command) - -## 4.90.4 Tariff Table Report Command - -This commandis used to advertise information relating to a given Rate Parameter Set Identifier. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Precision | | | | | | | | | Reserved | | | | | | | | | | | | | | | -| Tariff Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Value 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Value 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Tariff Value 4 | | | | | | | | | | | | | | | | | | | | | | | | - -[Refer to description of fields under the Tariff Table Set Command (section 4.89.2)](04.89-tariff-table-configuration-command-class-version-1.md#4892-tariff-table-set-command) - -## 4.90.5 Tariff Table Cost Get Command - -This command is used to request the cost according to rate parameter set ID, rate type, dataset mask and time interval. - -The Tariff Table Cost Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL COST GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID indicates the requested parameter set. Rate Parameter Set ID equal to 0xFF returns overall accumulated cost. - -Start Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Start Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). - -Start Day (8 bits) - -Specify the day of the month between 01 and 31. Start Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Start Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Stop Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. Setting the parameter to 0xFFFF indicates now. - -Stop Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that an accumulated value is not determined yet. Setting the parameter to 0xFF indicates now. - -Stop Day (8 bits) - -Specify the day of the month between 01 and 31. Setting the parameter to 0xFF indicates now. - -Stop Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. Setting the parameter to 0xFF indicates now. - -Stop Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. Setting the parameter to 0xFF indicates now. - -Stop Second Local Time (8 bits) - -Specify the number of complete seconds since the start of the minute (00-59) in local time. The value 60 used to keep UTC from wandering away is not supported. Setting the parameter to 0xFF indicates now. - -## 4.90.6 Tariff Table Cost Report Command - -This command is used to report a number of time stamped values (historical) in physical units in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS TARIFF TBL MONITOR _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = TARIFF TBL COST REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Rate Parameter Set ID | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | | | | | | | | Rate Type | | | | | -| Start Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Start Month | | | | | | | | | | | | | | | | | | | | | | | | -| Start Day | | | | | | | | | | | | | | | | | | | | | | | | -| Start Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Start Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Year 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Month | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Day | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Hour Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Stop Minute Local Time | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Currency 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Cost Precision | | | | | | | | | Reserved | | | | | | | | | | | | | | | -| Cost Value 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Cost Value 2 | | | | | | | | | | | | | | | | | | | | | | | | -| Cost Value 3 | | | | | | | | | | | | | | | | | | | | | | | | -| Cost Value 4 | | | | | | | | | | | | | | | | | | | | | | | | - -Rate Parameter Set ID (8 bits) - -The Rate Parameter Set ID indicates the requested parameter set. Rate Parameter Set ID equal to 0xFF returns accumulated cost. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. Rate Type (2 bits) - -[Rate Type specifies the type of parameters in the report. This field MUST be encoded according to Table 58.](04.47-meter-command-class-version-2.md#4475-meter-report-command) - -Start/Stop Year (16 bits) - -Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. - -Start/Stop Month (8 bits) - -Specify the month of the year between 01 (January) and 12 (December). A year equal to 0x0000 indicates that a accumulated value is not determined yet. - -Start/Stop Day (8 bits) - -Specify the day of the month between 01 and 31. - -Start/Stop Hour Local Time (8 bits) - -Specify the number of complete hours that have passed since midnight (00-23) in local time. - -Start/Stop Minute Local Time (8 bits) - -Specify the number of complete minutes that have passed since the start of the hour (00-59) in local time. - -Currency (3 bytes) - -[ISO 4217 defines the currency code. Examples are given in Table 127.](04.89-tariff-table-configuration-command-class-version-1.md#4891-tariff-table-supplier-set-command) - -Cost Precision (3 bits) - -The precision field describes what the precision of the value is. The number indicates the number of decimals. The decimal value 1025 with precision 2 is therefore equal to 10.25. - -Cost Value (32 bits) - -The Cost value is a 32 bit un-signed field. The first byte is the most significant byte. - -The value 0xFFFFFFFF is reserved, and SHOULD be used to report that the cost calculation has not yet been performed. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.92-thermostat-fan-mode-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.92-thermostat-fan-mode-command-class-version-2.md deleted file mode 100644 index abd85fd..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.92-thermostat-fan-mode-command-class-version-2.md +++ /dev/null @@ -1,52 +0,0 @@ - -# 4.92 Thermostat Fan Mode Command Class, Version 2 - -The Thermostat Fan Mode Command Class, version 2 is used for the HVAC’s systems manual fan. - -The commands not mentioned here will remain the same as specified for Thermostat Fan Mode Command Class (Version 1). - -## 4.92.1 Thermostat Fan Mode Set Command - -This command is used to set the fan mode in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE SET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Off | | | Reserved | | | | | | | | | Fan Mode | | | | | | | | | | | | - -Off (1 bit) - -The “Off bit” set to “1” will switch the fan fully OFF regardless of what fan mode has been set. In order to activate a fan mode the “Off bit” MUST be set to “0”. - -Fan Mode (4 bits) - -[This field MUST comply with the values indicated for version 2 and older in Table 129.](04.94-thermostat-fan-mode-command-class-version-4.md#4941-thermostat-fan-mode-set-command) - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.92.2 Thermostat Fan Mode Report Command - -This command is used to report the fan mode in a device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN MODE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN MODE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Fan Mode | | | | | | | | | | | | - -Fan Mode (4 bits) - -Refer to description under the Thermostat Fan Mode Set Command. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.95-thermostat-fan-state-command-class-version-1-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.95-thermostat-fan-state-command-class-version-1-2.md deleted file mode 100644 index 467dbb1..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.95-thermostat-fan-state-command-class-version-1-2.md +++ /dev/null @@ -1,67 +0,0 @@ - -# 4.95 Thermostat Fan State Command Class, version 1-2 - -The Thermostat Fan State Command Class is used to obtain the fan operating state of the thermostat. - -## 4.95.1 Compatibility considerations - -A device supporting Thermostat Fan State CC, Version 2 MUST support Thermostat Fan State CC, Version 1. - -Version 2 adds Fan Operating State identifiers for use in the Thermostat Fan State Report Command. - -Commands not described in Version 2 stays unchanged from version 1. - -## 4.95.2 Thermostat Fan State Get Command - -This command is used to request the fan operating state from the device. - -The Thermostat Fan State Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN STATE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.95.3 Thermostat Fan State Report Command - -This command is used to report the fan operating state of the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT FAN STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT FAN STATE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Fan Operating State | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Fan Operating State (4 bits) - -[The fan operating state identifier MUST comply with Table 130.](04.95-thermostat-fan-state-command-class-version-1-2.md#4953-thermostat-fan-state-report-command) - -Table 130, Thermostat Fan State Report::Fan Operating State encoding - -| | Fan | | Description | CC Version | -| --- | --- | --- | --- | --- | -| | Operating | | | | -| | State | | | | -| 0 | | | Idle / Off | 1 | -| 1 | | | Running / Running Low – If device only supports one fan speed, this state is used to report the fan is running. If the device is a multi-speed device, this state is used to report that the fan is running at the low speed. | 1 | -| 2 | | | Running High | 1 | -| 3 | | | Running Medium | 2 | -| 4 | | | Circulation Mode | 2 | -| 5 | | | Humidity Circulation Mode | 2 | -| 6 | | | Right – Left Circulation Mode | 2 | -| 7 | | | Up – Down Circulation Mode | 2 | -| 8 | | | Quiet Circulation Mode | 2 | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.96-thermostat-mode-command-class-version-1-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.96-thermostat-mode-command-class-version-1-2.md deleted file mode 100644 index e56f207..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.96-thermostat-mode-command-class-version-1-2.md +++ /dev/null @@ -1,112 +0,0 @@ - -# 4.96 Thermostat Mode Command Class, version 1-2 - -The Thermostat Mode Command Class is used to control a thermostat. These Commands allow applications to set and get the thermostat parameters. Version 2 extends the available number of modes. - -NOTE: A device supporting the Thermostat Mode Command Class cannot support Auto and Auto Changeover mode simultaneously. Devices controlling a device supporting the Thermostat Mode Command Class MUST be able to control both modes to ensure interoperability. - -## 4.96.1 Thermostat Mode Set Command - -This command is used to set the wanted mode in the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Mode | | | | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Mode (5 bits) - -[The thermostat mode identifier MUST comply with Table 131.](04.97-thermostat-mode-command-class-version-3.md#4971-thermostat-mode-set-command) - -## 4.96.2 Thermostat Mode Get Command - -This command is used to request the current mode from the device. - -The Thermostat Mode Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.96.3 Thermostat Mode Report Command - -This command is used to report the mode from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | Mode | | | | | | | | | | | | | | | - -Mode (5 bits) - -Refer to description under the Thermostat Mode Set Command. - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -## 4.96.4 Thermostat Mode Supported Get Command - -This command is used to request the supported modes. - -The Thermostat Mode Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.96.5 Thermostat Mode Supported Report Command - -This command is used to report the supported modes from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields describe the supported modes by the device. - - Bit 0 in Bit Mask 1 indicates if Mode = 0 (Off) is supported.  Bit 1 in Bit Mask 1 indicates if Mode = 1 (Heat) is supported.  … - -If the Mode is supported the bit MUST be set to 1. If the Mode is supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported mode. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. - -For example if thermostat supports Heat, Cool, Energy Save Heat and Energy Save Cool bit mask would be 0x06 and 0x18 respectively: - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | 0 | | | 0 | | | 0 | | | 0 | | | 0 | | | 1 | | | 1 | | | 0 | | - -Bit Mask Byte 1 = 0x06 Heat - -Cool - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| | 0 | | | 0 | | | 0 | | | 1 | | | 1 | | | 0 | | | 0 | | | 0 | | - -Bit Mask Byte 2 = 0x18 Energy Save Heat - -Energy Save Cool diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.97-thermostat-mode-command-class-version-3.md b/docs/specs/command-class-specification/04-command-class-definitions/04.97-thermostat-mode-command-class-version-3.md deleted file mode 100644 index d79fd2f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.97-thermostat-mode-command-class-version-3.md +++ /dev/null @@ -1,157 +0,0 @@ - -# 4.97 Thermostat Mode Command Class, version 3 - -The Thermostat Mode Command Class is an extension to support control and status monitoring functions of air-conditioning devices in order to achieve a global framework that covers the majority of generic functions implemented by world-wide air-conditioning manufacturer. The new features comprises of: - - FULL POWER thermostat mode - - MANUFACTURER SPECIFIC mode allowed under defined rules - -NOTE: A device supporting the Thermostat Mode Command Class cannot support AUTO and AUTO CHANGEOVER mode simultaneously. Devices controlling a device supporting the Thermostat Mode Command Class MUST be able to control both modes to ensure interoperability. - -## 4.97.1 Thermostat Mode Set Command - -The Thermostat Mode Set Command is used to set the desired mode in the thermostat device. - -The controlling device SHOULD interview the thermostat device for supported modes to avoid setting an unsupported thermostat mode. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SET _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| No of Manufacturer Data fields | | | | | | | | | Mode | | | | | | | | | | | | | | | -| Manufacturer Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer Data N | | | | | | | | | | | | | | | | | | | | | | | | - -No of Manufacturer Data fields (3 bits) - -To indicate 0-7 bytes of appended Manufacturer Data. This field is only used when setting a MANUFACTURER SPECIFIC mode (Mode = 0x1F). If not setting the MANUFACTURER SPECIFIC mode this field MUST be set to 0. Mode (5 bits) - -If the Thermostat Mode Set command specifies a non-supported mode, the receiving node MUST ignore the command. - -MANUFACTURER SPECIFIC (proprietary) mode MUST NOT be implemented unless the following conditions are fulfilled: - - The device MUST support minimum two Z-Wave specified thermostat modes e.g. HEAT and COOL and MAY use MANUFACTURER SPECIFIC mode for vendor specific thermostat modes.  If the MANUFACTURER SPECIFIC mode can in whole or in part be supported by a Z-Wave specified thermostat mode, the device MUST include support of the Z-Wave specified thermostat mode. For instance if the device manufacturer desires MANUFACTURER SPECIFIC mode to set the thermostat into energy saving heating mode, the Z-Wave specified thermostat mode: ENERGY HEAT, MUST be used instead.  The MANUFACTURER SPECIFIC mode and all of its associated Manufacturer Data fields MUST be described in the product manual. - -Table 131, Thermostat Mode Set version 3::Mode encoding - -| Mode (5 bits) | | Description | | CC | | -| --- | --- | --- | --- | --- | --- | -| | | | | Version | | -| 0x00 | OFF | System is OFF. | 1 | | | -| 0x01 | HEAT | Continuous heating only. | 1 | | | -| 0x02 | COOL | Continuous cooling only. | 1 | | | -| 0x03 | AUTO | The system will automatically switch between heating and cooling when the temperature exceeds the HEAT and COOL set point types. | 1 | | | -| 0x04 | AUXILIARY | Auxiliary/Emergency Heat. A heat pump (especially air exchange types) is not efficient when the outside temperature is below 35 degrees Fahrenheit (~0 degrees centigrade). Thus, the thermostat may be put into auxiliary heat mode simply to use a more efficient secondary heat source when there are no failures of the compressor or heat pump unit itself. | 1 | | | -| 0x05 | RESUME (ON) | The system MUST resume to last active mode. The Thermostat Mode Report command MUST NOT advertise this Mode identifier. | 1 | | | -| 0x06 | FAN | Fan only - cycle fan to circulate air. | 1 | | | -| 0x07 | FURNACE | Cycle fan to circulate air - heating or cooling will be activated according to the FURNACE set point. | 1 | | | -| 0x08 | DRY | Dehumidification - The system will cycle cooling in relation to the room and the DRY set point temperature in order to remove moisture from ambient. | 1 | | | -| 0x09 | MOIST | Humidification - Moist Air, heating or cooling will be activated according to the MOIST set point. | 1 | | | -| 0x0A | AUTO CHANGEOVER | Auto Changeover - heating or cooling will be activated according to the AUTO CHANGEOVER set point. | 1 | | | - -| Mode (5 bits) | | Description | | CC | | -| --- | --- | --- | --- | --- | --- | -| | | | | Version | | -| 0x0B | ENERGY HEAT | Energy Saving Heating (usually lower than normal set point) - heating will be activated according to the ENERGY HEAT set point. | 2 | | | -| 0x0C | ENERGY COOL | Energy Saving Cooling (usually higher than normal set point) - cooling will be activated according to the ENERGY COOL set point. | 2 | | | -| 0x0D | AWAY | Away mode, e.g. preventing water from freezing in forced water systems - heating or cooling will be activated when temperature exceeds the AWAY HEAT and/or AWAY COOL set points. | 2 | | | -| 0x0E | Reserved | Reserved for future use. | 3 | | | -| 0x0F | FULL POWER | SPEED UP / FULL POWER heating or cooling mode will be activated when temperature exceeds FULL POWER set point. | 3 | | | -| 0x10 - 0x1E | Reserved | Reserved for future use. | 3 | | | -| 0x1F | MANUFACTURER SPECIFIC | Reserved for vendor specific thermostat mode | 3 | | | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -## 4.97.2 Thermostat Mode Get Command - -This ommand is used to request the current mode from the device. - -The Thermostat Mode Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE GET _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.97.3 Thermostat Mode Report Command - -This command is used to report the current mode of the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE REPORT _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| No of Manufacturer Data fields | | | | | | | | | | Mode | | | | | | | | | | | | | | -| Manufacturer Data 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Manufacturer Data N | | | | | | | | | | | | | | | | | | | | | | | | - -Refer to Thermostat Mode Set command for field description. - -## 4.97.4 Thermostat Mode Supported Get Command - -This command is used to request the supported modes. - -The Thermostat Mode Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SUPPORTED GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.97.5 Thermostat Mode Supported Report Command - -This command is used to report the supported thermostat modes from the device. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields describe the supported modes by the device (see Thermostat Mode Set command). MANUFACTURER SPECIFIC thermostat mode cannot be listed in this command. - - Bit 0 in Bit Mask 1 field indicates support for mode = 0 (OFF)  Bit 1 in Bit Mask 1 field indicates support for mode = 1 (HEAT)  Bit 2 in Bit Mask 1 field indicates support for mode = 2 (COOL)  … - -The mode is supported if the bit is 1 and the opposite if 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported mode. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. Example: - -To indicate the thermostat device supports OFF, HEAT, COOL, AUTO and DRY, the Thermostat Mode Supported Report command MUST be structured as illustrated below. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT MODE _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT MODE SUPPORTED REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 0 0 0 0 1 1 1 1 | | | | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 2 0 0 0 0 0 0 0 1 | | | | | | | | | | | | | | | | | | | | | | | | - -![figure p543](assets/img-2f5fb50cdf.png) - -![figure p543](assets/img-2f5fb50cdf.png) - -![figure p543](assets/img-2f5fb50cdf.png) - -![figure p543](assets/img-2f5fb50cdf.png) - -| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | -| --- | --- | --- | --- | --- | --- | --- | --- | - -![figure p543](assets/img-2f5fb50cdf.png) - -| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| --- | --- | --- | --- | --- | --- | --- | --- | diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.98-thermostat-operating-state-command-class-version-1.md b/docs/specs/command-class-specification/04-command-class-definitions/04.98-thermostat-operating-state-command-class-version-1.md deleted file mode 100644 index 74acea3..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.98-thermostat-operating-state-command-class-version-1.md +++ /dev/null @@ -1,41 +0,0 @@ - -# 4.98 Thermostat Operating State Command Class, version 1 - -The Thermostat Operating State Command Class is used to obtain the operating state of the thermostat. - -## 4.98.1 Thermostat Operating State Get Command - -This command is used to request the operating state. - -The Thermostat Operating State Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.98.2 Thermostat Operating State Report Command - -The Thermostat Operating State Report Command is used to report the operating state. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reserved | | | | | | | | | | | | Operating State | | | | | | | | | | | | - -Reserved - -This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. - -Operating State (4 bits) - -[The thermostat operating state identifier MUST comply with Table 132.](04.99-thermostat-operating-state-command-class-version-2.md#4992-thermostat-operating-state-report) diff --git a/docs/specs/command-class-specification/04-command-class-definitions/04.99-thermostat-operating-state-command-class-version-2.md b/docs/specs/command-class-specification/04-command-class-definitions/04.99-thermostat-operating-state-command-class-version-2.md deleted file mode 100644 index 5bc5e16..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/04.99-thermostat-operating-state-command-class-version-2.md +++ /dev/null @@ -1,153 +0,0 @@ - -# 4.99 Thermostat Operating State Command Class, version 2 - -The Thermostat Operating State Command Class is used to obtain the operating state of the thermostat as well as logged operating runtime times of thermostat. - -## 4.99.1 Thermostat Operating State Get - -This command gets the operating state of the thermostat. - -The Thermostat Operating State Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE GET _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.99.2 Thermostat Operating State Report - -This command is used to report the operating state. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE REPORT _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Operating State | | | | | | | | | | | | | | | | | | | | | | | | - -Operating State (8 bits) - -[The thermostat operating state identifier MUST be set according to Table 132.](04.99-thermostat-operating-state-command-class-version-2.md#4992-thermostat-operating-state-report) Table 132, Thermostat Operating State Report version 2::Operating State encoding - -| | Operating | | Description | Version | -| --- | --- | --- | --- | --- | -| | State | | | | -| 0x00 | | | Idle | 1 | -| 0x01 | | | Heating | 1 | -| 0x02 | | | Cooling | 1 | -| 0x03 | | | Fan Only | 1 | -| 0x04 | | | Pending Heat. Short cycle prevention feature used in heat pump applications to protect the compressor. | 1 | -| 0x05 | | | Pending Cool. Short cycle prevention feature used in heat pump applications to protect the compressor. | 1 | -| 0x06 | | | Vent/Economizer. | 1 | -| 0x07 | | | Aux Heating | 2 | -| 0x08 | | | 2nd Stage Heating | 2 | -| 0x09 | | | 2nd Stage Cooling | 2 | -| 0x0A | | | 2nd Stage Aux Heat | 2 | -| 0x0B | | | 3rd Stage Aux Heat | 2 | - -All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. - -## 4.99.3 Thermostat Operating State Logging Supported Get - -This command is used to request the operating state logging supported by the device. - -The Thermostat Operating State Logging Supported Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE LOGGING SUPPORTED GET _ _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | - -## 4.99.4 Thermostat Operating State Logging Supported Report - -This command is used to report the operating state logging supported by the device. - -| | 7 | | | 6 | 5 | | | 4 | | | 3 | | | 2 | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING LOGGING SUPPORTED REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields describe the operating state logging supported by the device. - - Bit 0 in Bit Mask 1 is not allocated to any Operating State and MUST beset to zero.  Bit 1 in Bit Mask 1 indicates if Operating State = 1 (Heating) log is supported.  Bit 2 in Bit Mask 1 indicates if Operating State = 2 (Cooling) is supported.  … - -If the Operating State log is supported the bit MUST be set to 1. If the Operating State log is not supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last supported operating state log. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. - -## 4.99.5 Thermostat Operating State Logging Get - -This command is used to request the operating state logging supported by the device. - -The Thermostat Operating State Logging Report Command MUST be returned in response to this command. - -This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. - -| | 7 | | | 6 | 5 | | | 4 | | | 3 | | | 2 | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE LOGGING GET _ _ _ _ | | | | | | | | | | | | | | | | | | | | | -| Bit Mask 1 | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | -| Bit Mask N | | | | | | | | | | | | | | | | | | | | | - -Bit Mask (N bytes) - -The Bit Mask fields describe the operating state log types to be requested.  Bit 0 in Bit Mask 1 is not allocated to any Operating State and MUST be set to zero.  Bit 1 in Bit Mask 1 indicates if Operating State = 1 (Heating) log is supported.  Bit 2 in Bit Mask 1 indicates if Operating State = 2 (Cooling) is supported.  … - -If the Operating State log is supported the bit MUST be set to 1. If the Operating State log is not supported the bit MUST be set to 0. It is only necessary to send the Bit Mask fields from 1 and up to the one indicating the last requested operating state log type. The number of Bit Mask fields transmitted MUST be determined from the length field in the frame. - -## 4.99.6 Thermostat Operating State Logging Report - -This command is used to report the operating state logged for requested operating states. - -| | 7 | | | 6 | | | 5 | | | 4 | | | 3 | | | 2 | | | 1 | | | 0 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| Command Class = COMMAND CLASS THERMOSTAT OPERATING STATE _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Command = THERMOSTAT OPERATING STATE LOGGING REPORT _ _ _ _ | | | | | | | | | | | | | | | | | | | | | | | | -| Reports to Follow | | | | | | | | | | | | | | | | | | | | | | | | -| | Reserved | | | | | | | | | | | | Operating State Log Type 1 | | | | | | | | | | | -| | Usage Today (Hours) | | | | | | | | | | | | | | | | | | | | | | | -| | Usage Today (Minutes) | | | | | | | | | | | | | | | | | | | | | | | -| | Usage Yesterday (Hours) | | | | | | | | | | | | | | | | | | | | | | | -| | Usage Yesterday (Minutes) | | | | | | | | | | | | | | | | | | | | | | | -| … | | | | | | | | | | | | | | | | | | | | | | | | -| | Reserved | | | | | | | | | | | | Operating State Log Type N | | | | | | | | | | | -| | Usage Today (Hours) | | | | | | | | | | | | | | | | | | | | | | | -| | Usage Today (Minutes) | | | | | | | | | | | | | | | | | | | | | | | -| | Usage Yesterday (Hours) | | | | | | | | | | | | | | | | | | | | | | | -| | Usage Yesterday (Minutes) | | | | | | | | | | | | | | | | | | | | | | | - -Reports to Follow (8 bits) - -This value indicates how many report frames left before transferring all of the requested thermostat operating state logs. - -Operating State Log Type (N * 4 bits) - -The Operating State Log Type indicates the operating state type to be requested. - -Usage Today Hours (8 bits) - -The number of hours (00:24) the thermostat has been in the indicated operating state since 12:00 am of the current day. Usage Today Minutes (8 bits) - -The number of minutes (00-59) the thermostat has been in the indicated operating state since 12:00 am of the current day. - -Usage Yesterday Hours (8 bits) - -The number of hours (00:24) the thermostat had been in the indicated operating state between 12:00 am and 11:59pm of the previous day. - -Usage Yesterday Hours (8 bits) - -The number of minutes (00-59) the thermostat had been in the indicated operating state between 12:00 am and 11:59pm of the previous day. diff --git a/docs/specs/command-class-specification/04-command-class-definitions/index.md b/docs/specs/command-class-specification/04-command-class-definitions/index.md deleted file mode 100644 index da4320f..0000000 --- a/docs/specs/command-class-specification/04-command-class-definitions/index.md +++ /dev/null @@ -1,124 +0,0 @@ - -# 4 Command Class Definitions - -The following subchapters contain definitions of Application Command Classes. - -## Contents - -- [4.1 Alarm Command Class, version 1 [DEPRECATED]](04.01-alarm-command-class-version-1-deprecated.md) -- [4.2 Alarm Command Class, version 2 [DEPRECATED]](04.02-alarm-command-class-version-2-deprecated.md) -- [4.3 Alarm Sensor Command Class, version 1 [DEPRECATED]](04.03-alarm-sensor-command-class-version-1-deprecated.md) -- [4.4 Alarm Silence Command Class, version 1](04.04-alarm-silence-command-class-version-1.md) -- [4.1 All Switch Command Class, version 1 [OBSOLETED]](04.01-all-switch-command-class-version-1-obsoleted.md) -- [4.2 Anti-theft Command Class, version 1 [OBSOLETED]](04.02-anti-theft-command-class-version-1-obsoleted.md) -- [4.3 Anti-theft Command Class, version 2](04.03-anti-theft-command-class-version-2.md) -- [4.4 Barrier Operator Command Class, version 1](04.04-barrier-operator-command-class-version-1.md) -- [4.5 Basic Command Class, version 1](04.05-basic-command-class-version-1.md) -- [4.6 Basic Command Class, version 2](04.06-basic-command-class-version-2.md) -- [4.7 Basic Tariff Information Command Class, version 1](04.07-basic-tariff-information-command-class-version-1.md) -- [4.8 Basic Window Covering Command Class, version 1 [OBSOLETED]](04.08-basic-window-covering-command-class-version-1-obsoleted.md) -- [4.9 Binary Sensor Command Class, version 1 [DEPRECATED]](04.09-binary-sensor-command-class-version-1-deprecated.md) -- [4.10 Binary Sensor Command Class, version 2 [DEPRECATED]](04.10-binary-sensor-command-class-version-2-deprecated.md) -- [4.11 Binary Switch Command Class, version 1](04.11-binary-switch-command-class-version-1.md) -- [4.12 Binary Switch Command Class, version 2](04.12-binary-switch-command-class-version-2.md) -- [4.13 Binary Toggle Switch Command Class, version 1 [OBSOLETED]](04.13-binary-toggle-switch-command-class-version-1-obsoleted.md) -- [4.14 Climate Control Schedule Command Class, version 1 [DEPRECATED]](04.14-climate-control-schedule-command-class-version-1-deprecated.md) -- [4.15 Central Scene Command Class, version 1 [OBSOLETED]](04.15-central-scene-command-class-version-1-obsoleted.md) -- [4.16 Central Scene Command Class, version 2 [OBSOLETED]](04.16-central-scene-command-class-version-2-obsoleted.md) -- [4.17 Central Scene Command Class, version 3](04.17-central-scene-command-class-version-3.md) -- [4.18 Clock Command Class, version 1](04.18-clock-command-class-version-1.md) -- [4.19 Color Switch Command Class, version 1](04.19-color-switch-command-class-version-1.md) -- [4.20 Color Switch Command Class, version 2](04.20-color-switch-command-class-version-2.md) -- [4.21 Color Switch Command Class, version 3](04.21-color-switch-command-class-version-3.md) -- [4.22 Configuration Command Class, version 1](04.22-configuration-command-class-version-1.md) -- [4.23 Configuration Command Class, version 2](04.23-configuration-command-class-version-2.md) -- [4.24 Configuration Command Class, version 3](04.24-configuration-command-class-version-3.md) -- [4.25 Configuration Command Class, version 4](04.25-configuration-command-class-version-4.md) -- [4.26 Controller Replication Command Class, version 1](04.26-controller-replication-command-class-version-1.md) -- [4.27 Demand Control Plan Configuration Command Class, version 1](04.27-demand-control-plan-configuration-command-class-version-1.md) -- [4.28 Demand Control Plan Monitor Command Class, version 1](04.28-demand-control-plan-monitor-command-class-version-1.md) -- [4.29 Door Lock Command Class, version 1-2](04.29-door-lock-command-class-version-1-2.md) -- [4.30 Door Lock Command Class, version 3](04.30-door-lock-command-class-version-3.md) -- [4.31 Door Lock Logging Command Class, version 1](04.31-door-lock-logging-command-class-version-1.md) -- [4.32 Energy Production Command Class, version 1](04.32-energy-production-command-class-version-1.md) -- [4.33 Entry Control Command Class, version 1](04.33-entry-control-command-class-version-1.md) -- [4.34 Geographic Location Command Class, version 1](04.34-geographic-location-command-class-version-1.md) -- [4.35 HRV Status Command Class, version 1](04.35-hrv-status-command-class-version-1.md) -- [4.36 HRV Control Command Class, version 1](04.36-hrv-control-command-class-version-1.md) -- [4.37 Humidity Control Mode Command Class, version 1](04.37-humidity-control-mode-command-class-version-1.md) -- [4.38 Humidity Control Operating State Command Class, version 1](04.38-humidity-control-operating-state-command-class-version-1.md) -- [4.39 Humidity Control Setpoint Command Class, version 1](04.39-humidity-control-setpoint-command-class-version-1.md) -- [4.40 Indicator Command Class, version 1](04.40-indicator-command-class-version-1.md) -- [4.41 Indicator Command Class, version 2](04.41-indicator-command-class-version-2.md) -- [4.42 Irrigation Command Class, version 1](04.42-irrigation-command-class-version-1/index.md) -- [4.43 Language Command Class, version 1](04.43-language-command-class-version-1.md) -- [4.44 Lock Command Class, version 1 [DEPRECATED]](04.44-lock-command-class-version-1-deprecated.md) -- [4.45 Manufacturer Proprietary Command Class, version 1](04.45-manufacturer-proprietary-command-class-version-1.md) -- [4.46 Meter Command Class, version 1](04.46-meter-command-class-version-1.md) -- [4.47 Meter Command Class, version 2](04.47-meter-command-class-version-2.md) -- [4.48 Meter Command Class, version 3](04.48-meter-command-class-version-3.md) -- [4.49 Meter Command Class, version 4](04.49-meter-command-class-version-4.md) -- [4.50 Meter Command Class, version 5](04.50-meter-command-class-version-5.md) -- [4.51 Meter Table Configuration Command Class, version 1](04.51-meter-table-configuration-command-class-version-1.md) -- [4.52 Meter Table Monitor Command Class, version 1](04.52-meter-table-monitor-command-class-version-1/index.md) -- [4.53 Meter Table Monitor Command Class, version 2](04.53-meter-table-monitor-command-class-version-2/index.md) -- [4.54 Meter Table Push Configuration Command Class version 1](04.54-meter-table-push-configuration-command-class-version-1.md) -- [4.55 Move To Position Window Covering Command Class, version 1 [OBSOLETED]](04.55-move-to-position-window-covering-command-class-version-1-obsoleted.md) -- [4.56 Multilevel Sensor Command Class, version 1-4](04.56-multilevel-sensor-command-class-version-1-4.md) -- [4.57 Multilevel Sensor Command Class, Version 5-11](04.57-multilevel-sensor-command-class-version-5-11.md) -- [4.58 Multilevel Switch Command Class, version 1](04.58-multilevel-switch-command-class-version-1.md) -- [4.59 Multilevel Switch Command Class, version 2](04.59-multilevel-switch-command-class-version-2.md) -- [4.60 Multilevel Switch Command Class, version 3](04.60-multilevel-switch-command-class-version-3.md) -- [4.61 Multilevel Switch Command Class, version 4](04.61-multilevel-switch-command-class-version-4.md) -- [4.62 Multilevel Toggle Switch Command Class, version 1 [DEPRECATED]](04.62-multilevel-toggle-switch-command-class-version-1-deprecated.md) -- [4.63 Notification Command Class, version 3-8](04.63-notification-command-class-version-3-8/index.md) -- [4.64 Prepayment Command Class, version 1](04.64-prepayment-command-class-version-1.md) -- [4.65 Prepayment Encapsulation Command Class, version 1](04.65-prepayment-encapsulation-command-class-version-1.md) -- [4.66 Proprietary Command Class, version 1 [DEPRECATED]](04.66-proprietary-command-class-version-1-deprecated.md) -- [4.67 Protection Command Class, version 1](04.67-protection-command-class-version-1.md) -- [4.68 Protection Command Class, version 2](04.68-protection-command-class-version-2.md) -- [4.69 Pulse Meter Command Class, version 1 [DEPRECATED]](04.69-pulse-meter-command-class-version-1-deprecated.md) -- [4.70 Rate Table Configuration Command Class, version 1](04.70-rate-table-configuration-command-class-version-1.md) -- [4.71 Rate Table Monitor Command Class, version 1](04.71-rate-table-monitor-command-class-version-1.md) -- [4.72 Scene Activation Command Class, version 1](04.72-scene-activation-command-class-version-1.md) -- [4.73 Scene Actuator Configuration Command Class, version 1](04.73-scene-actuator-configuration-command-class-version-1.md) -- [4.74 Scene Controller Configuration Command Class, version 1](04.74-scene-controller-configuration-command-class-version-1.md) -- [4.75 Schedule Command Class, version 1](04.75-schedule-command-class-version-1/index.md) -- [4.76 Schedule Command Class, version 2](04.76-schedule-command-class-version-2.md) -- [4.77 Schedule Command Class, version 3](04.77-schedule-command-class-version-3.md) -- [4.78 Schedule Command Class, version 4](04.78-schedule-command-class-version-4.md) -- [4.79 Schedule Entry Lock Command Class, version 1 [DEPRECATED]](04.79-schedule-entry-lock-command-class-version-1-deprecated.md) -- [4.80 Schedule Entry Lock Command Class, version 2 [DEPRECATED]](04.80-schedule-entry-lock-command-class-version-2-deprecated.md) -- [4.81 Schedule Entry Lock Command Class, Version 3 [DEPRECATED]](04.81-schedule-entry-lock-command-class-version-3-deprecated.md) -- [4.82 Screen Attributes Command Class, version 1](04.82-screen-attributes-command-class-version-1.md) -- [4.83 Screen Attributes Command Class, version 2](04.83-screen-attributes-command-class-version-2.md) -- [4.84 Screen Meta Data Command Class, version 1](04.84-screen-meta-data-command-class-version-1.md) -- [4.85 Screen Meta Data Command Class, version 2](04.85-screen-meta-data-command-class-version-2.md) -- [4.86 Sensor Configuration Command Class, version 1 [OBSOLETED]](04.86-sensor-configuration-command-class-version-1-obsoleted.md) -- [4.87 Simple AV Control Command Class, version 1-4](04.87-simple-av-control-command-class-version-1-4.md) -- [4.88 Sound Switch Command Class, version 1](04.88-sound-switch-command-class-version-1.md) -- [4.89 Tariff Table Configuration Command Class, version 1](04.89-tariff-table-configuration-command-class-version-1.md) -- [4.90 Tariff Table Monitor Command Class, version 1](04.90-tariff-table-monitor-command-class-version-1.md) -- [4.91 Thermostat Fan Mode Command Class, version 1](04.91-thermostat-fan-mode-command-class-version-1.md) -- [4.92 Thermostat Fan Mode Command Class, Version 2](04.92-thermostat-fan-mode-command-class-version-2.md) -- [4.93 Thermostat Fan Mode Command Class, Version 3](04.93-thermostat-fan-mode-command-class-version-3.md) -- [4.94 Thermostat Fan Mode Command Class, Version 4](04.94-thermostat-fan-mode-command-class-version-4.md) -- [4.95 Thermostat Fan State Command Class, version 1-2](04.95-thermostat-fan-state-command-class-version-1-2.md) -- [4.96 Thermostat Mode Command Class, version 1-2](04.96-thermostat-mode-command-class-version-1-2.md) -- [4.97 Thermostat Mode Command Class, version 3](04.97-thermostat-mode-command-class-version-3.md) -- [4.98 Thermostat Operating State Command Class, version 1](04.98-thermostat-operating-state-command-class-version-1.md) -- [4.99 Thermostat Operating State Command Class, version 2](04.99-thermostat-operating-state-command-class-version-2.md) -- [4.100 Thermostat Setback Command Class, version 1](04.100-thermostat-setback-command-class-version-1.md) -- [4.101 Thermostat Setpoint Command Class, version 1-2](04.101-thermostat-setpoint-command-class-version-1-2.md) -- [4.102 Thermostat Setpoint Command Class, version 3](04.102-thermostat-setpoint-command-class-version-3.md) -- [4.103 Time Command Class, version 1](04.103-time-command-class-version-1.md) -- [4.104 Time Command Class, version 2](04.104-time-command-class-version-2.md) -- [4.105 Time Parameters Command Class, version 1](04.105-time-parameters-command-class-version-1.md) -- [4.106 User Code Command Class, version 1](04.106-user-code-command-class-version-1.md) -- [4.107 Window Covering Command Class, version 1](04.107-window-covering-command-class-version-1.md) diff --git a/docs/specs/command-class-specification/assets/img-031d09cc57.jpeg b/docs/specs/command-class-specification/assets/img-031d09cc57.jpeg deleted file mode 100644 index f8e3c024611976f62c06b92322e0c5981c0c89d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70705 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 A*Z=?k diff --git a/docs/specs/command-class-specification/assets/img-0d25374112.png b/docs/specs/command-class-specification/assets/img-0d25374112.png deleted file mode 100644 index 8bc9dcfed05f5db47924e6f534ce1f6a66b0af6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 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 diff --git a/docs/specs/command-class-specification/assets/img-234b052b98.png b/docs/specs/command-class-specification/assets/img-234b052b98.png deleted file mode 100644 index bae74a0de519f3c5d33809edcea811aed3903f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2706 zcmeHJ`CF4$7QSBsUw|S3p_XMZ5d}n$%?4~K5DG{D3yg|Uc8xV4$Rhia1+WjJQ(3II zfq+seVo9cs5C;g0ED?byI}$?R!Lo=X>|qO;kGAt4%=|J>f4KLa=iGD7z3096p7&n! z@p9XxqN@S`*yT=gIROBKh~SYDjP$H-OuxVXDGok}X4 z6Ue=NrTV-W`7PNqT)|pFJ6(8xz{n=%-i${>Xf-R`E&Qp_Z?HnK0jzj_nky+mw?xuQ zQ9(Xh&kuLPXTJPQ(W4JfSB7tRSZgxYJ7cS36S*U?wBnBO`q6rt@V&+lMFITT0DkhZ zznl9#56#>Eh`J{YXpA>v)HT%p2g2jzFiO;E3zp+}kvtYve`Nk;slE5`S2zonBt5wF z+&pya*rJb_FdCV99Rw2(uYv1h-@U2nhXFV93JOQmumoC15G4~Tx!Z*CQBVb~st!zp z5ODC~JfsDoiB_4|5+!YLT_+8=HUgi{G4w$c%sdbOH(Y%^JUs)0gNyxY1zww2f2Vf$ zwcA8>u$*mt_LuXDTiYj;9EhJ<04l#QW{@3Be!@t4$ru{wQ)}cXWPp;y3;(3>)Hq2C z=htM9)zg@Vg24TP0%5)>d89cD+rQ3hIV?Z7c|oF{=80DVDQ7yE;3MUS=mp}(?AjRmRJ#_lz&5JJE>T==8BOnD z3~diZtJNE-D**0(OMCk{^Psv{;8i20eD@w8A@9m4M*Uo=cQr~`0U}D20=OypP%g6e zcTfl@vYLk~NGMAJ;a4ML<9%K<$4SQs+&~&ekZZ04u4GE7bQo{^o6VRonnIyO#>IUu zso`&rIYvBvTAyC%_yZo4FQtmG+iG~~jvYFB{H3Ct+Ue}$uHCH)jpKKpx;{+CIqj`B6a`w74 zSVG}SJo>+sZm=K8Fhkv3IyOrHMgr-r@a<3%FDguAegPK}+ex=o0uatHoF zDXJ7C)|QnS!FUG*g-&D8L6=qglj(hgRWJU+#%96D{bv`+LPF8PS`T?tnIXaWf1Shi zJM*5t*gLhj{Y7Pf|NZ!0_UOiei7NU!=V75EMlxIf{No)}VjY6jy(lm$tK<77X4mi; z_Q(A=vn89Yi}~U?Z_|hPZjgkM5!~6 z^WH*Ag7=E}-YQnW$(u`4jlfI^VUS5ZW`BX+h}*ZRLN~)3Ims(RZ=v0+^hK57H?i53 z=B$K{AX8OZl+$?ITZ$=NYGnrA*>JboFgon2Xo@SpI8z$0!yIbDlv@{rh|y|ZKW<%Y z6`!>oPM!@TpB5FZtnnwsZz;7s*^dvge~#mFxyk*@zU1km*KB^xqwBKm)$a%2r5Mdt zmEkkWbfyOnJT1lQy-`z=*s#15w!g3{7baZ@JdmfNT^AGDwxi23Ev ze56giC0oFW`lG(z0-c?mCB^B~?Rfb%4Gy6ru6gj7SXeuqTFjPnFH)&G%n@Y62Fi_< z{+tnRs+5#BGZO~mZGU4iVvQBZL#owF@RjU$8dCm*DP5vU+6-iMa<^viH^ld*3Ake( zcm<)mWvz3d1zEx!%al&kBb1b)Vg(G4NI$|Q4Gp6BgoK`xAE&!ZRf#+GQ~^4gG+z=P z8j43(R8(j)qY+&a6dD#5Q(0MgffN&Ch0fJM{u287`t6L%$EwZFK2xAGOcZcL7rY!g X^%|AK>ynu4d^z1+yFVdQ&MBb@0Nk}+(EtDd diff --git a/docs/specs/command-class-specification/assets/img-41477511d5.png b/docs/specs/command-class-specification/assets/img-41477511d5.png deleted file mode 100644 index 43a9910bae0048390b72ef3599e0a9d8a390ce68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27969 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 fo`Cw&uMHUq#Mf%uf{?xZV68_hbw& diff --git a/docs/specs/command-class-specification/assets/img-5e2a35351b.png b/docs/specs/command-class-specification/assets/img-5e2a35351b.png deleted file mode 100644 index 59a062a8a202fb7eb53a167f32af3c66c3cf304e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19288 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 diff --git a/docs/specs/command-class-specification/assets/img-7e17d638c6.png b/docs/specs/command-class-specification/assets/img-7e17d638c6.png deleted file mode 100644 index b9dfc4f9350be422587d26e13ea6f486a69c3f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38699 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 Svm1u|t|+f6S19xEv;PNVtw8_) diff --git a/docs/specs/command-class-specification/assets/img-8ec64d3ea0.jpeg b/docs/specs/command-class-specification/assets/img-8ec64d3ea0.jpeg deleted file mode 100644 index 80e686fe7269fe87a0aef743c34a2bcadbfd039b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21594 zcmd421yof}*D!u)Bn3ffkdQ_J0RiEHNK1E1T)Mk2f`mw?G!l{*q+1k}?(XhXQtI+Q z_$!}xJ^wepcdc)I_pUi--w_zrgh(pe*ig zVG00pasUee0GI$O3NnBULO5U&R=N!!fo~8U0F(#-)EgK8unCn2|AE0gKw3Z*PrE0{}L*&W_5G&uBEYv}rIV!Inq?Y=8{F zHZ*p!7gbbzaYO9}_vZbtpOdj)ya2=O|GxZRvH!y_Y!j%HF~~e7m~Us|WNZV%?f`&h zZEWx83;^gWVEz*~XL}IFpa5YaN031feslwy{Q*C}fsOuvHGko#DvN5T9 zRSgin3+9_xI7_SkneS<9B(DI%U|r-aD?8a6IyX2S#!h0OE&*B)o->C^-}Eua4+>xc zeJ&2dY#>Z!?jrRkeH0ldSCyOmUvxap#pFR4q=VvUX(*!z!ek&E;%KLQ(-z1xN*2^w z@}@12K1!Rtv*MpTplsM$%ipvG%8QBzb^0YENE2nl*<2MI`!{t_d7T|q|E!CuZE7JQ z{U^S+z4foL2=a!SV3ToQyqI;aOwTeTa#fiN10iQ)4b-Ex4iFrbcP z2tWZlzzBRA1Gc~wKm#ZPlE5?YZ4WqtC8mG{U=8L#!BQxgV}XPVSb=%}9#8QX&L4ID z!7%$(d*h}y*vh}h`J;u+KXL3(@1Z_II+mM)F-I?01YYxRRmQS^*NZ!k1F^# z2a3P(NduSxn;@ru&~X4Kt?n>RyEmZlU+EWZ1#JUu6nsvi&HPgzZ5nL` z{7wR*U=LXT;>ZT%%Hmf~IQ@;s{x33o0WqBcL-4r>;@N?`{>ACP^r)$A6xlx|H=2M3 z%b&;t{%rr`J{o_t`)Ksh`$svCw*RG#e<=QomQZ3*s!*Cx>QL%YdH@=f&nRC|no-(N zN>LjArupyt{tqgD_x&$PJ$l4PBML5M zP#S4lV-7YNLu+fAUqwzdj!-A4qbt;e1GrfSZ|VWSq4FPV?cM%=@|@)WKxhxNSp)y% zX}bVGu@eB?d;Cux6KE5OGXS8L*Vx6;^$&XB!rKb~PNv*kzkVa(JOgdh-1YS#XsbH zai8md{JH)N5MUySA%~(M(E`W>NGJqI*Ixl@a8W`7eU}^e=mz129os;_^FTbF$yrQzIx~8_SzNPi+x3>0<&aR>1k%k>JA=vnmpvM;yjxRt*X8#xYQ-KBrL$nfJvv|p0__XP9* zKa%Wk!TynJ3cx`@0y__d0Du6e=S*3CSpU<+OzO{UO2b4-e^R^+yKR1|QheJo!BJ+0 zg{@2a9A^MMo|wq(ksN(lJB#2~*N(zTCeMX))k;7~N=wyG6WN_q$if`R3VpNpGQxeq zL&-FbFhnPzT^9>T2xZDd4i)Lr%zr7h#XXdru!Kp*lVHBg#rqZSv#p)zmN~LE(+And z_RoiUX(h>UDjHrQ?U^GTsgdIv%Z*}VlV5oGH@l0|7(uX_M9_$oxmoB0Zxc&M3k3q~ z#1!1$oUr6@-qOo+mE_SxTE_Tcv0yiJTVdjyI<=#UEHs7@nQbdgZYBF>XO!tr&k&4= zGZ{fxfEsb4ltkCrR(sMmk4&_zP$nQNimQy~5xu>L5c7>3V8;KQgxquuTn3cDwqvgW zI(@xd3%>Jl|Hsqh26)rrwR9Z$2W_Mx-ur;}{!v8N7nq@+d|Yi#%w&Lrof4eYY&KiGGh zaIx7 zPDu<%lUBYK#fj?sQ5%M1!-h%kFz5GVvV@1-cD=QfH|K}K-8`WbY1_9|lf>76ClW>s zI_3&a@`%^0m16lAkC%_}j#XYSoBhN-a`^Q)q(_JrzQT&EmPucX;y|O#zc1` zKjA-+2#>Bq4Z`5(=RY5DOTRs6SF%!H0iFH>br=*5emK~{!Bbe0|LwBzAVEU z8~Hva_{(?jz;dabA!J{hvz9Q2h)-2)e2J%I>p>+hvKm1@?l%zLm&>hw6@ZB~Aj9CV$j)J9uqo2^S==(2Eq&ktfIH$-<96c`0QG$nE z_6ZEMwYG2L$}jGb>cQ`hLCVjdby(Mc7mXWZjDY&=+ikMr)#DlMR?Su`_pu+^#Y|n# z2r{^zt{e`8d5wkX-yU3Oy7%bYQ}@Ka+qtbF0mprx9mdn&<;}XQNHsKjO|q{Lc6`Yt z=-DWb9w;wBiX8Lf53d;`JAJ!vJhF!^YF%t#%sM$Px-Nd2=SLfL$VjG(-xCY`#{ zhgqiV$Veni?)p#8k4r+=TRow3?;X6@ls(2Dy?Zdt&C*fZ&Vt7sFb>y@l`KnOC7B~s z|2DeYc6dNcLV30fHgrWRXKdhc%rmAv#I$eXFZei+lviR^%28ss9re2em%v!!+sdG^ zqq`Nd?=qvhDWa2tlqPlVYr0{Od=oanGC$a2_qJKl(idede6ba=oXv&e55sCGwBQx! zjjkABA9Ke>pPD2w?4XGdrONW-7vkFUdPpE?RVu4h>FkWcbKhkr>SlHmZsRQ|N3 z@O__$A|vwE-;S{(D;ni&Q;^dpY?EdZI4(?m=~JP3Y9p5)YL@ zs+!{$5maXWA`PysWZ^uj6qiEbT(qm4m9xRDM)|j?;hEmSPuBA&#w8yFe&`ur(@~2u z@T*~2iKan8iI@-6DEnR=o7Y$_h7(C2O(NUN-O&~NQ?={~wG6P_NLi{or=vO9%BnrJ zS?`{d#r)7zUg&-IX!-C`c|pgiYswn&E3N#naMymW#T-jgWr8B?80 zI=%UFGl#2n;sxxdt-I-v--g|m_kHPuCoXEYNJ%?(Z2L0Q{X}}LnALuX0j8MLz8I#6 z4*SZ3zc}pz#ewJRAY*nw8i_T&jj0Pj`@%gw=(O4uQ9dKdy3Hh!z-uj)gO_cqARIrk zH6@-9C1`S$V){@%m%0ag5nZnBuhU0x0tgR1%un|Z5LDz$T z#b8D_;Bc;9x;Tli7+f6fq=vJ8G{XlrRkrgtLakvgv46Wu6Fi*QWL=C`!YX~&&O-k={`Eo z#@OJDqZvw}2qMxEPA(MnuD`jD$fK&L+`FGqs+ z1fx5mFHPHK4ipzZ+S@zy-P%=} z*^Cs?u2QW83UT_skO+8&vM2~O!s=?_I%}K`~MdOdTh50lMZ9BX9gbtF1^d zlRTs&C?Gj%y&S=3AwRCXjMNl~laP;J)a9KV;@+i!rlGOwfrd3obJwdxRT;u&DHG9e>6A8hBl}jqqqa zBU`yd@IM_qiS+!LQMwFSUltDDQia8BLl#-;LG9WjBqD#xlr*oWLZV9)cBzhhvgaay z;o%o3AykV0p))jCl@czqyW|{3`(a5#xa#v&_FR1=rrxypNn$co!li<; z=cs169XGA#yPR<^I9KLve6g#uiqeqyOjxmy>ROtCw)-n_B1NSCP0}L#8QMmw&!<&G zM+{-iTh=~a|8)NvkR0dGsJOlSgLrkVHhIF*A&u3}M!tuVL_H-eA`e060~xZr0If@@ zKK__2*RH zmc9wgRiAQwdTE2HWbquFpT`k2|7WA4W5i{{=2irS?4#{~gVM27qm`XEadB#sMf7h7 z??sQQy3j9`aa_uxn!w9RbuQWiOFXwumQLh`J9GxU@H2~elX*rva9X>&70Il#>}1U5zZLNi8P0Ud`CuKOrqipBJwPK#S{|D;++7qbX)%AxDaE zDoo{m&+-Y&ElyfJ)#iocl=yzJS8-@%SurYjtYL8q&od~tK@e{nnP2YHKRE>YW)4GR z8ArzZx*2l$`AB{923mPjm6cyDH#dW0kQ+8%eGOnaesjGBT&J9l!kb%~T&0I-{iTr; z1vMB8j`CK{lOuPe_@Izh#4S5M*PjsTpBQoNxt2p=A2J+8_bZUA;g7?gP4$q%P1NaQ zFrHi%)y0U1ldilh%%)EtDf}|Rm0CcG>Q=II7de5j^r_x#1cfb^d!cu@mhKW=f|Xm3 z?T?Q~^y=`^kiEsv@7TKczrZ))nYARz^sxN3a$9d9awt59308j@+1KRjF1sWdyR(iT zm|X4Io3=)5U=sY3IzXHFv+iWS`Gsj%>H8fRS(9PO%;X~d1M?=51L2?#s-9nKjd&{i z+Cob$e9(?`7QD|3wuGyUK3cZRSQKS~1A#PNyDRy*RfiW2}8aR>~Okm_a>y$5;)85!H`%eNIx%C&#OsH|zB6)8+o`U6L)U z!Nu=$uYcU4D|<6ohq^KvH&FSmPes03WtSw2pFyIu$6u?8;Y4d)+vF2;fo0zQPL!vH z96H>`E&`sNY?%)Xm{u1=Q=;?lWcH2PF0Pt+hOcM)rCgBOD^i}_6O(crg)%4?$w}| z=Y(2WaMCu~3YdlNpV%k1IIvXR|3MWX?x-$&zqY1D*Y_M^utdGA#{*xv7wr)xMdC); zKBCSQ5V8K8rOoTkpg1x5f7=F1_2mc7`sagjoA*gd*qlfros3lu=buW(he)y*Y(~CA zn)WOgF&>yHXZbUZx~$jEq7|^-dv-N_i3Xk0Qt*1vk@#vfQWRYL*!NSsR%tL2_U2mZ zLkuG@UpvsKQUdUqIN~fP3Bvrd9F_7Ro1M=_Pdj0sTJr|f&Y6nI?VR3=Gnf!5iKB4K z-}@?dmCq_uzP|iby?yK{Okku$m-oNL%2K>HcSDaJve=lo>=`Rs_=h6GKRCk;Y1YyVAR z*5w3bp;Y4>KP!|q|EpD&R3N1o^A={Y;4VgSLPnU$HNY~Lm1?qF#^oO~vP7F~#edq? zOA+dD4UF-OZEE+pZP9r%e5NQhJy+EZN+dqmBa!x7yz;H;?j{;bB&Q%*5sQvoW3_Y5 zI^-XYzqjIvOB|hTg?#)pDdZj&WWQ|t81A_ir>mDVNy^L$PEBSaP<-IOO2pbH2y9I6 z&Xm|wRTpEWE$ujMXY!P_=ubj^PjzO6;^yGI@n$ zsFe=37ths*v76h|SatKPGMlEp*D-@=X4{=aitTe?{;j4EFyIsF3hl<^v{AG7rSX=}TE#N3_$ zZ|tbdI79n#1nDc`wox~}q~lSLz6PRnsl_fgr{dDp(*)gED}5g;XFMR4t%QlBdKB@j zpT{4G_ZC-Bm3PQljM@l5SQTEuCi~ZWwF+BWW5QH+SccZ}CsY`Mn1@aBOY+Ky&RH`% z*7qw3Gds;?@qVN?2b#1#J#pH9lgv-Fa1Fd7o>n8j;v!$|pLyr(aAl=AvPpMqaGPLC zzlQRJHj$uzbMjL>Tp#9O$CHZC4OMHWi9jsX3*FPckeIegxY`$Yx-_`*RAau%kC&;M zXRF~e&kFs#`Co@mi^JWNE*NTJ$&D-|uMUJPzVQpvLK%o%O|7O%r|5Y<^6kZ4uD}S6 z&eh}|%2{o?2|vg3HQwG~sfy2@n<ibv%{6pr+CNEI~KDj(nZ`M z(Bz?I3}!Z)GqN4$G-(%X>(pDZ!3Nu^RpC$cTGu5Y-T{bns`&niIca0p3PxKJ&xoZO z3)RS^-n$!pvv?<=CR{n+bIMY)!vYjaR4V_o-3T+bk-x~cT%S`wGGI~nnu0q}_)^ua zW>8DJa!-`H1?i%FD8;@^nv}3GzFjcTW3RdR@P&!%1lZDEntH$%~?25u%C z&A&P1wwACcPNXgYK7Ki+==$*&MJe5|y-$lrMTzr279kfw1(7p9Ln4MH&#!@Kjfa2C z8+)ap*Nc~p9h(JksqUtbzoyCivA&J_epJvX{FVPu8akV(R6ZshwdIbLjz><;yOCOBujVd2&q z8LYAvjwDcq@Mb!_PZ^$xCvUmF&yxD!vV5%0cV=uI?oVs6wol=Z>ho()kTdG_*qgawRHH z{0b|h!=ql)hHe)0j0L1B8(wP9bc;iy*22T)apxD4JNq%#BF{rNS^KkMWOd@B-D7zB zmsp$pp|v#;CKn}{p)T2G4uK;>2$T{_R@vIzvX=-=eXk$;)d1iM|7G?1}Nj z7*(zpLs5n315!cHvAB;(OTu;x!6-wuyJow$E2CGFmdT@P9Il49gm8fub6o!WS9sRq ztUk*Vk()0XH4&X`#qu5F4(%|@LphlRX~&v^c(w_{4Iff{t$iphq%(&(zkQ$E7+ zr7gvVwidem7uGQ^YD`E>!fW1Bmg#p}F{k(4iqxXRff4BPMlM2jNfu%@UA1wz@s|=Q zn*!ZFqbU{wijRO@#c+~JB^jj0pV8PQ9ayGYhNxyS3XXE$TuzLh#CP=JTZ#x086|`Q zoue=(H>ks~)hbZ+#Q+dIufSYuq>(gn7GsvzN~A zEA}cv+`Yn!OU=fZoX}%Lh}!$$ALg@N13txba;dM8FwQQS&!JzLb6e}pzhJp@2+47a z-QUekbWDhO){YUaf}Xo$xC*O-eW8ertW50w!2_C`qX?0IMzuD&q1BjR?5;zEBq7p_ z=O{bjHL#=cUK6op5Z@GOtS83g!qUppimE~CWo^T;^7;s4RXDrKM(&V9-EmZ&P({*5 z+|0Zt!+JQXtS9<19Kn;VyQ?*^6BZXg0FI@gf7{ziih8{#Ui=^Wc<}- zs*3*|MPb_8BjUQOX%8~bGU~_8{O7JEMkG@nL&C*780&iV`QlgtOrJ}VlNs(rL^d%# zU?)=2OuPTvRvF#4?i!%^?nAGl&EiH|laHQnC7Z?}b~S{n7l0620#|Ps%WCjN&(*yx zn}>^%qliGt|8m9P+E~{sH`ptH^i^(iDK&gmgjL*yrCAKMdaF^NHa{nJjm-OP(fE@Y z4E7S8GrrZ&EnR%RLfgiz8p6<&&kCG;)M83j-=9{O)!#P??-RsYH}=S)Z`*r)JS7Dm zS`Um+ze z(IuQ%89>tr(z<66<>&QEcl?cY+RoQ>4)K)YE?;X3BU|d^Ocl6(h)MMnd_f6Y zhpQ4#5>sY*j8$Yy5=5M{c|1ha3E`W5*euV4u}@p_w^EC3>*Xe-;f(PmD1X(`j8}

    bI*Pj1=c=e0?^e6Qw!SJYm(HFt zDP}9O@a8eRA7^{Kt9kMObB*AtW%m&2%2GzKibb9e=Ug?7m0`V+g=G36r9-bkzhaDR zLPcF*Rvd1JXAtEEQV+r~W=k~wMM&asweN?LFXZ&b9^FxVo~pD2tCf=PiwMe?kSW;@w1{ZseR&@oms)ECm$1dD zO6Oi)A>PiHFYa#bMmAaw_)0d*#Dr=JJpPb}Ihku0r9hzU;1E055H_tSG+JrBbxOc0 z!L?9}CRtF#6YY{K%{n6!_I}QNRhKX)5O|sDpeKQ{$CDyO!SXTjQRQU#t20SryWK|~ z2+1_+w6HU;pdBAprj3e9F2BJdS)5Q&S8MJ^{Pb7+If>7cwV+~*dvg-;CWksKQth+t z2Hr=RxELclQ4+qxKXg z^+B|=y&1WX63aF0YagcE8lQ#cUS}WHGT?cfiL1$j$>BR-_;MSatILr*?8kF~FhZTP zy=@|Qu|$VUF&Zyb^|9EZd0DQn;f|u%r1Tv3C{oo>jCoUO(n9&emzS-GmxNxY;zSyU z0z-1jy?fdOPhT#&mN^8^rel=Kbd4rsU+{dYez{HlE;Z6Pa$VLiN8WjpFJwqMK`1kf zcxts7uPQUaI@zYTaazhOdZhF{L-2C1DrH(n0hM_r^rz!?=Lin{Wd)8eU9QXMdbHH{ zo|w|PXC&(Fm-MF@hi%jyV^z#`g4tv|amE&udc<9@76ou7K7D@~PW?T04%W{Eqtm(| zCA%`h&=7ab_$y1BOuqKCM)>()RvD>sWg0VsW41o-B)PMaxT)pu_K-M!iS%g`!wB`K zFIMUwy%i^_YV_Bh!DQ+!468A(NTU?E-rmP9k`viufh9pm;Kj(c0J2b z(P>!zLwnGi_l*4RLgp3WY`RhJMXoDPR$nlYkD~D@>PUxf`>G;Su$?_sT81Mf;N z+>XJpc_IWd5TJSu=oy0PoB3(+KmK#t!=;fkUr~rZ1k%%^((u&=(enf@(DT~tD<9)U zS>y__kX%B9V&F&tC)R zLOXv@yi`E-^I4%m5SKa~%zQ@tETp1SIx#1&b%e+a;m=7B->YqH8FF&EH&~QiqSA{0 z_Dthq5WFFvrzftqpR5RL5Cwfw(=X!0-+uPDp~y)LS8gIT8NQ*XIHS7;LJ_J%Hj}p+ z$OpGiDt-o5hTtc$IV8q^S;TDbK3=OT>Jp}inPZH87bDj|DBa0O+oWIUu|OGoq@($F{)BE_ERYSo=_EOx`H(m~#og!Zo#w z5a{Zh>vCmsqus}7mibck>F!jVhC@ao|N3x~XLxS8q?#_>ZsCW^g0eTgSU zc%M$}T|_R6+^s*HOPe8(;xE2PQ!-|wBR^|-HQHZO1?VT3zYptV3k^Y+<@`+i77}Ws z);tK`)`LWSxY1tmt1YKVL2Lm$Ol$Vp4=w%O`y*jOP!|n9d4gJC%;X|}*ax7qz3Eyyf>G&8k;(XAU)Js_!OVYA! z_JUcQM}?uRpW5Dlv6+vbbI#?$BDCNmv7IZS3OhCsgir9*5v;9LNg?T!F-9m9GBE|a zyuiQMxCX*S-Et-+@qR7<0sTFm>ToXTJa%dR(UAfo0%kL}Cs?d4-g?V|8F#h@+6l}nJ4)_! zzI_i%_1@jz5cIJk8;$2#b9-se{Y^oRw#MueIOoe+i2L00;Q8S3+qs6M?tZB1Znf>C zp|>yMMf5AtLBUGaWm$0BTqEW$F9^ALP8@hhnN1tS8E6ta8|v$1_BZ0lQ6XN(h<4;+I9Q7H)hxW zks59>W}3{MZ;5{m$Z={re}uI(r(8~G{6xqefSlBaJ^OV@>*k^sQ>M}2uTV1spw@UX zka4mV8FCFQ_fem3z~c2A)-;LSEc<`Z;nSk-H)af#P!n<%eDBE4R3IWt*vyq0Y4dPJ zu8-Vhr9Qi?xdxj3>wK`~tDEcNbidML1^^eybKr@Qo9s1^A%5A*GEblh^YhuOGP8j4 zwDjYAc+6gALTc?wlq}I;2!F0UWRNDI|6nn3iv>Fa$D(4Yn^1(-O!<8~gU{AnVvg44 z-4<*q|Hvh$ZqDNe<$V16BtL7-H>|Bg`1gDN^}U0fk`d18y*qrN4Xm z&9livvNiIIGzUByazz+5=~oo}Ajb6vH^<#9TaskZ&THU<++|VZ@anW17L}+&q~#9J z{WPu>*zf~{+BYp&`*HJ?v%$I^QDS|c%-*o1xT|a@f#D&CBd1#Q>ErkKPtYX1#;U#w z_P?v0%Wi(giib&?d@eB|G2<+>jgm7~729hXdldygE^%rn6VscLgkhO#3TtuBdTB^v zYKo#DX{KhVsAIjMHHmgCel$rzAVQ^)lcf)ttU-$(U%3X{T}x`jMky(@W)lb>c5u&A z7DnVQnuID2a7$d&NNjiztDj6OhBEC_t(w>(8NH(k1$L^)t3!K=8Bd4O-e!y-)Nsqi zZQlp?bCUGKGK+n95vOY8$(np$ABifAReh%M9BK0&pcui168`+Wrkbjk6*2@N9q8ro@7}tfVBc3;m!?+ncV*|#(IMLi zqKqlG<|EwLV=(q#b5&}54M13>ui!UtY~4fyaH|5I0rJ&c30`(J|AVQpD+pHa1Or2X zI*73{aNq~#2vkL0Ub5f&vkEqBxVfj`Di1tt5SfG+e9yj+KSjJ6@@-yJhgB8B))!&g zkSgou^+j{gif3E{=Th)%K>ixwsyRv9ze344E-404b>@~JnORJaKjCb0PN}ftUr^(8cR{%-tv7__U`06(s z(bqtcL1vzY@KcBL!tiq_wuRC zOhZ2v3i7i;Py79`zWxxn`!W22EdUZiTfGg@4(=N=15EN~AXxc=(gaHSxFl3mJ~exF z7lRoCRQ&eEc%6HzpPp;(W!*_YAVZ);t>( zI=ubO)I8f-gY{}Mq(mlTpJ={x!w!E@c17@S&(y-Lc=k_YpF3ChE3S24VIi{rkgL+T zu9SRCd!)GcHY~eme(v2^8r!|^bXP7ol0U#h!+-TlQSOF@dWFEVxMZeP)u?y3srQ?& zzFXwid`!)%F->DIy$0+w!N3Z*)eew6*^NA%NBn$z#xRj#fw%fb*ykA!VxhAbM$nm( zZ;aS7J1pYdzH8+~U%Y>4FDy1xcFY>z*c@Zh*XmbyM4Ur=R`sah@v@2aPi;udl7W3z zJxka3BVqNJFwYKIb-1z8+>6aDI4bBgi)N~uR=uCx25+qH@>8_aUabgcU$RQ2G7I~c z#p*jz$T6f3KehaxA1nCgW$jak5$fDq6L>l;$!L24%cS?~uq%O43n3I>gh9x%mNLJ!#v}n7=OiT z;0?*jIFbuV=$_{32eBx0pKZ^F&W=kegV|MfwevDID zwkC?)WRWj4?#P#X13Y1C$MaKIHh4 zMRw43tS2J8thr(Qpm5+R?Gu71!c0P^u?ikJDN-5Hw6o0#MRcOX81t!j39}RVPyIRL zk9bDE6l!l7zEF;TYrEd}bpDQsma^HpqQbYtM@}y+zIspW_;J5H#}6Vui5Lw6S@;q z)^&AUWgAHy3NI~GQgbz8RITBk0^*eOdJ6SUMtmaTtzPcaTO{em=+z&B!=p)BRxfU| zCDr3)afFAwid$?07W0Sa7-%EZu0-k9u){&f{(J2^4kMj9)*N&GiM^2sPsXbwma3J4 z6&sCbny*^12uBi*Xp}@UP+NjDB1hNGWZK0<6E%nnKmL zg_E{pVw260iB=?ks8A9VV9KhKU&sn&LgCgMuzo6*$CGxclUVp(Y- z-9XJ>F#eD|C+%rUJT>d(a=^yie7p~V+P<}o3%PoAW8j0pk1`+o>7snA`gQQhl8=RO z@C=`FSO3^Wh=+o{DE?FC5`U>l@@!;Wfl%OZGTX{4IPCji8Fjp?YX$aO%@5RHGc({X ze@2XVHs5)5(8K*Rv}|!3J}7P79)Fg&IahDCFDkW^x2Ni0I{P1^qsS3e@i`7c2j{XG zBV)Oy7M~yF<}+Tr9A~#%R`InvFdaeMDplzD>jYsSYKc!c)C%&q71n>ZbW3_C?@T%P z2a9*}{qBX}{zE2n*a1G{*fT4ceDk6jnUM1pM3rw5Iy^Wyi`eaA((~pt?ZIymT0)?6 z0Sox@gQE5H5nf{*LQPC=D0k#_Aie6XR|%xOVlbzZqDck>p?$Ncp6Oeg6FGLi@BN3> zUS`(-T&J^EtYB*^*g;@-Dl$Oqt+eEw{RtMG^+0!`J1r8i6JG9#YuU>L`-C`v-; z0E4Hmn|)=k^R0jR-dqIf#};wAr!OhYUQK1VIr*$Btfb_c9md-AfYG_#SG%FWCLC^5 z8J7{# z;$0?oCCH2z*N=3o&~Z53y}qHBtbQ}DB@5#`OGQW?cG$K|1a*d+`x+RgW@`G3g2t?c z;$(F(Jc)6_X;#HSORV`piv~Z z`$6$H4EMxi(jkUfPON3{kmFo~Ys#nh%qx?@Gyrc;`xiqw~GSWGBsb;F}(QSTz!o-!fs>{zl&`UtPs**3ehqejXc5tS24bgA6F z)3?~|b;S}tmT2cfHWha@|J}rU^88#8L#RMk$3UA@F`9Cowg#F}IY$bruYqoP`5s5<`=-KGi&3%T}3)$H(AF8(sW^aFg%= zy08MuZ-!m16s{C%f;KXG3|(h7?C<%Rnmr*7TSECLMOj5!22)$N&#Eif-p*5MOhk-= zSEpsPnUI)q+0kF&fkuD&%BI_!VQ z?`C{VKN`8yuzz-xh&U_qrK&zWzJH&Zjn3ixq@<;~KqG#V;wb;HsNyxE`x7`3rD6NY zkcx-R>q7xjUli7{5@Qj( ztp$Cy=vsBTx$^4MhjtaXT}5`vZZ>RqbG6HGD|P33_R8{##CPbiy-cNnvtf6Bh5{wY z3z0hoT+ke;(?>3yY}`>z4*PPT1OEC9+1T)r0b@TzVC8{BdXrD#mw{dBGkvITwvEOz z3xIKeoGT#yKDcXY`spilzKmKtSZC%fw!Pl&7m?WF^c=)-AB9BdqIWDu#VH#dL7cAaxMCNHpTT~(!r~sl+ zFevfI9ry0aWxXbZK9W z*Z~_sgBlKOoKF+w zxZM^dGmqfRZF_5Kd0oY_xmqdHKbPrN43ZH34djd9)tc=njLUM{3^COsLHsf;bcZ*& zXDJh|#05&~x7SVLub|9N*pC&=Sw=c0!P@;pC2StQxRucbw zY*!{_-NlFM{J-}pH+z+vgr1!39WuZLnKkt1)c7Gqr#M~K4+lI_e5&Ua>hA%-;4VQ%?%Zk!z%kTS6lJtpa38#gdZk(ZpNA&;j3*KuzXL-KnoDo6JW5ZTPY!&t21BL7qXfy0(!{WBzklMAkPsZ_ zWRpCdpg?)GD}p=dEmbkYrMEYnVs804ud zp0wfUjG6gfx792IY`ta(XPqhlmbcZjnCUHld^9nPH=N6XE>HRKPs4@a>lbpV;b>h) z(U7;3!45hCyp<0R?d-EyM@UUDf~n^W>}*GgTVg&f)%8A`TahXM{EZ>JhAyJe9Hlv{ zP6wZa1ua<{zoriCw6i4$FB0!01J0qG|wF;)>H z9O0|W-Iqf5Hdw9nJ{`QjU^82f@}BFy2F8owv|r~9SfVd-&N4PPb%u3|l2WU5;^GJf zH`HO!;n8hpd+b%e$eee`z=OI zjR>Wm(u3IQLd7)^cS!uAGgTsA$M0M9fe*KeaEb+ub!&M48ey^MY?v8c9xJ%T^663DEoU=)C?Or)?~P*k^k@^f-NVu8F7Ck3^8U zkj_oU-V7B_(MNW+lsE*@9F8;c^Y16e2(p@+5K3aPB1_RY_i;rjfrt5(?MMdcE_Yq_`iFe#?4Ko3X1SIR6T>Bt>>ad`D3Cl>q)b&x?`swuJiE z^hYp)sD837iRSnvM7yP^(yIC4Rb{Q^CU}x2t8RQ(5nrnPprD}4uZ)HgIn>2X zRGXRNz|98qht>bQ(&jW(UAkslU2PYeU5j{VxGT@;==!|Rl4U1YbL7(~V>H247nQZIAWw3r3UudHmZ6y-G<2e5SdqhQho8P04)i zchkWX*`8!Wsb^Z@mfqWPJ!$up4wvr^)$FT!gE8UT;I?t>n}f0>PgjSGOR%Lf@|i}Z7g@>n1nI`!EX6PbzGhI(`uJ6CSwulg@9mcbE!Tx%-=aEF3PCWP*PX4_Zw1xQU4K6ZCFR z7KtehWsclgJ7YjujlzRbE9u7X27Y^;Vk(b6>o71b-ax623UMOU1mZ-mwi+WJceu=271OcAcxEW6 zW3k)URml#)^-W#=*E7r?Vm;wa@~LbdAC9ZTM*f_ja^tY&PK;tdm_T-E$$N_GNZU2> z8Dfb!u@gu*pUzw5(5}(OWlkJaKc0^>4PmQRkcyqpn3WrGuK%vJ#;oD?$HaGJZt_Z4-Kd zrGSY*n5ILu=&7y?^_AsVn!FxW8?pJJWevCUtRaU;=)&v&ubnH6W;^S{Y2_Vh$GmEk z)>@NRi>RWuh!8DBrxZoiHdI1vQAAovO{%8RT5AhMO*CyWsFtZzRcnu}Bx)&9YOhGu z79=6&|9*JSd6zSDX1>p-d(OT0+x^|&_B_uopN7l_ARv!{*0J}!emWgF5}WS$U;wJ> z3co$qoxX0-V$t?%Hex|m!!2l~o2yZBe6i@I{Zc!??r%NsZh$X-@8J=qgWc7CAyP9) z%2{7GC|UQ_8o!v0Qn=`L#k0I8s{?rWZ>t}Pe>%|haaI~SXffNScU8xlE$x~MgM7*)3s5s?h zTeZHdV_I#ihf;vig5^_Q4)TvkY%2R3x`{55^rn5z`2Sob97wA0n6G*^3KixKS(KKK zt9@wS*A_@H!wK$G_}kTAN?x$WKG(-J`|R%d@dlyd5QM36Uua1dm-hI6!}c7jd9XA! zOrv7HDMTsrgaa_3UCx|wo(YqQxW!K&W4pgr=^t5PHNpXeB%X3?Gr`}}^_w4Jmq16i8>z1Kg-z&An+CYnImp+u&>QgONV_`De?1rr}AL*|<-y6&Rl4hk~SQ$dUBUEH)o?;2btbL{Qqxo;@?UCAFYsC3gUKh zBn^+Wl(7YnNEI z7OzYU`$mU7KRg+pytsyBPPym!9OMpGlN-=LARQk$^@B|JybI+SrrnSPUji2?u{X=& z;-yN#B*keRgE~&AfV${H{&uT*?Uyd?r;LunMe9fY^#lowj6T~%jVG3dA!`i>q)`S@nN3?2owJpl; zrb+o*2e`aF!ZC5)vH{^mtR(VW<4Z7bFxoXJ6ngKvR$9=n>$}% z)mN6Kb}&a9z*D}v$&CPqGN5u9UUwIZD7`tQqhAqs6IqgW=T`k?A&fNLCm-vV7reNQ zWVx4tpD{iVkEvPpJEK>pSU{bW@|uPl#L^2!)ULw4g!kplBC2(Dzg2 z8NFKK9T4oN$j93FV+iuOS;i;OgFiV(<#E;-QD-q%v)@s|EceY^9(f#^cJzc`_UDau zz(cyDKnEob0j-<=t4;sNOn>+60d-^#MV(^21B$UM#nO&PA=m6pPiKbGxBF~XN<5qM zNUHMILS%@OYp>3<>6KWixQRMY%+uP+}@7xD_%!q+RYgMciXolBivI6K~!L8t1GZ@Ip zjD%T*Hk(Q_*B}E<()}~5__*U3>>Z^@Pb`lVsrB8&(5hS^PfsGmsP`V_V}*$Gf=N&mlv6dUunXE%2XY1BdRZkt zG4?+N@*gRpdzI}XuGU|U){@g}x@mDT50ohiV1^jyp&TKd>91tt7(<07WmnFtbi=gK z+2(Yx>c>Q8Qgf5Wxy!Z={gC{k9u!BqV)(7Oj?<$vI}C+H^yk{a4hA Of8YJH%FbOo!@mJSP?)&@ diff --git a/docs/specs/command-class-specification/assets/img-91ca87aebd.png b/docs/specs/command-class-specification/assets/img-91ca87aebd.png deleted file mode 100644 index ac6336573e9b41155be877f853dbfa576bef2a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2480 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 K9KPfmFzzn}U@IR0 diff --git a/docs/specs/command-class-specification/assets/img-9c7dfcaef5.png b/docs/specs/command-class-specification/assets/img-9c7dfcaef5.png deleted file mode 100644 index 2eeace5c4ec40df3bf00a2a67491bdf51e016baa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37976 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 diff --git a/docs/specs/command-class-specification/assets/img-9fde74cbd0.jpeg b/docs/specs/command-class-specification/assets/img-9fde74cbd0.jpeg deleted file mode 100644 index ad5356912c546a7b9c9aeada3bccc463c36b7c87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73045 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 w_5+?82|tP diff --git a/docs/specs/command-class-specification/assets/img-ac16ca2e4f.png b/docs/specs/command-class-specification/assets/img-ac16ca2e4f.png deleted file mode 100644 index 610b32ec7e48b1d020a733b923dee7c2c71c4c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22399 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

    D#5h9%i*PeviE{XSn8&Na(i|)CQerp`Q_hIqj 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 DR@pVj diff --git a/docs/specs/command-class-specification/assets/img-bda7a771b4.jpeg b/docs/specs/command-class-specification/assets/img-bda7a771b4.jpeg deleted file mode 100644 index a31d5c93afa5157a25dc2b78f1963b08170858c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65012 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

    IN7TtLx*EM_uTBRYn%ge<3H> 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 XUJ;yO)O8lh(Cgaj=hSjkEd&1n^`2Lb diff --git a/docs/specs/command-class-specification/assets/img-ec65ec745a.png b/docs/specs/command-class-specification/assets/img-ec65ec745a.png deleted file mode 100644 index 5384344c408cbe290f1b351abbb709efcd511433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2233 zcmcJRc~q0x8OB4$4k!(a#G5r`Ae+c0 z35zB$L=crlGJrspu?_*mz=vssfG8oDC{ZNPAWP$T`bW=c&uM$6f4uiOcln)rpZDB* z-kTp1go5tczY79^K>huYp$fgH2%gH9iZ(h;<8KPtneG=!fI!rK{uD|TmTEc>h|0JA zNYAh{HE*Zh28WCG{rS7?@;-jcrJsqWSliWyXuHS&bhItcye<1~#JxDRYd$OC;t5V@ z`eAuom{QJ2P_+k@74|hjL)!#LGjnS4eGlJjXJIo!CbWup?eT&OQ*$n&9%}diLVgiB z8{IwTIDaO4cDT|CYkKa`!WWR|Bg&A@YIVq|Lk5tiiANyUN68Qmx*T%O;e!$+<$qlO zyY{k~5{Yr$U2~Pz5qdw)jK-yuhD3N3xwI#V((Ra=e^LrO)-E{!3~DoSU6D{?-u@*G z`)PR6Pu^hq53D&gU{LR0P6QOZ22iI$=s;c@- zdI_7mM44$22!sqFXAgq{fZSkM z?i4#s%O3dX1%Ab-tF5iTvQy!PTt_>=1};9Oc``9EonIh-DJq@PiA=9}0@*PiJQOqfp8~)1FKKD3yCh^{g4i-TxQ)jv3QUY9+rOj`ckMjNBX6j+1I-MgdjQV5;o zJ3Amjyzi!@l%8>2vKHFk3*~eTR8-V2Neq(;SjtDX=$%kpsrM!|_iFBJ(9qJ4TFcL; z+(LPEW&JlkTy@=UE5!AfzQRyPx1(3)>J#JBH;m-yRIlfx+=kn8dE_)g1-bQf$1M`U zX|GA|6WDRkO(dFMT+}lgq8v1;UMQ2R+&90*DyiwU;!p5yG^C`v7|41?t|vRC`^J3h zgqWgj8@l7^S1u2hZ5yw5EJ`^#D50{nrV^U1+|Vh$M($vsj#HPXzB1+_{N5Mec*jhY z&riJakQ$dKv^$5-g7sR7p!+)C^JeN{xG-DI2tFllAD=#S6vX@VC7kTIWz}+}!Y0MT zD~2S@gyq5Ld0yEa)M7!jdpfDHw+w)sBijjM}kru3|e z&%FUseOgirizz6HQyA+j#fFTpK4|JSK&I@q{|NS|QM-cCU@l;wzg1udJ?cH0kkulC z0aza#F+OZHe#|2hJt56=dCOu?cKOMdj?3SVsl(ye)y@EnR7G)NWD6XkaFP?t;fxpg z{X(Qfm_zk8k+o6aq^_HA@n#3hnMB**Vi*pEG%Gh;WY!L?@+3y(~ZQ9$fCQN_CT*U zxE%*_w@!6NsKl zyj%7S__)NNYIXH{r>E1?M?oA8H!cuBQMT11+K%F!oE&P+?=IL_9=~-^oo}3EX!T!I zp?_PR)POku%j~t`X2-D|jSac1wjGa-ZOYGit+a|KxP_|)7a#6^nI^s;ObtZ6(cT&I jo7LO@tYSA0e3AZ*|HNSb1y99a1mf=#guLzb_4&U8qo7bv diff --git a/docs/specs/command-class-specification/assets/img-f5af822b72.png b/docs/specs/command-class-specification/assets/img-f5af822b72.png deleted file mode 100644 index 61b59acf71f5d8e7b59235a2f1936e9c5716e08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2068 zcmcIldo zHCsdy!)Nc>9&Udg&=uA$bFv1s-u3hA$=q~{saq$w4{J)TD+c+sLF^>AQ%PO-5BfWl zaVq$x+A)_acvaRj99O^JkCqn27{tw+8+WR#8=~!un~jY>O6xDoot{ToXH6{RZJF^! zr#@K-u^a|r`RYS}DjXyzI0@3yx(d0Nz9`>`e+gKOez6M&Bh*M`|j%dU(Jr4OG)R$9nRh^Hk8>)HFxeA;x8l z55X>+^J3`W5?KHPTK&`>xueXcXGkdEN((ReBAIK?pjJ!(Cf+c-)pR<$=&^zS-;-&L zxwB!+l36K`h~jZ4P6=Aa;s;_Eir&O-Zp)iqoy|>b6w*MVF;C)HND%a2;5bNPITktv zIYC1&Qzn09Iks}K_KDgU17aRHt-E&2UPf}`;KuH!!Tw+E`6`rpa-aUL8-w3e{MBvM zFLZ={LG!#p^U8C1pND52*L*d=da7=IsKuv3tpQgG%DhhpqIzT?HxEm=ck|E84bM#49i))i4D-A{ragW$kvrLS)O5fu@14( zt2%g2bt)zE{KgZP_lCq?$KV7x(iV~?eP5Bmm1@|h(;}|qhy_cPvZ@}WQ&{M>S6mb$ER_lM<|`6)L)$B&g~H2A?qR$DvTyX-w1%qq|Dg_kNYzAukS zevFw53&68XQb>VA{QAyO>S4DK7T`sKSC~~W)_t@;UD|ug%oko5BMy@u zd39frI3(GO7IqK4bVts(Mn8Nr}tk0FE1c3b6!YBgsd>E4>j1ItDb!^*br| zh4p*H*IJyPN8|#%bu$%~Z_L_i3cl?p1+a!b9D!CNU!e;_*InlvC5n2>UwTyss_tcc z??d$CI20K7kaaV^QCaWB?dQVJa6_^t^}uKoVi;|-)`m%r9MXQ$SSnwQQ6H(b$qJ`U zEsM61(Q1@ETFmD5dx9q)4~-a3(5CSOR^?8L`A>{{9)*Z2>}9!m4YK{m?HGstE3z=T zUiEPhygbv7o~ShTxUDjtLB=I4bc)Y{i|fbz{gK3ujkTpQ(P)QfNOJOR;I1~=shBMv z6&8jO?KtQ-VYS~q#ctoeUl`ouHvhfpeZp0fG-$|w_T~TO`~N{8 z1;T5t2No~tT`~mmx7B6%D5qBxXRIg4Bhy8(C1Adx4?DI8_FxsNc82u7mb8B>iY;yu ZX+C)y`Y~dax+U`vg0nmRp;OT1e*hzpt@8i? diff --git a/docs/specs/command-class-specification/assets/img-f87775eaf2.png b/docs/specs/command-class-specification/assets/img-f87775eaf2.png deleted file mode 100644 index 0a0030c9c6e0bca9fe66d4897e5b98fe883785e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33507 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 TXH&s%3B(2Cfv$1-*R|gOGptcQ diff --git a/docs/specs/command-class-specification/assets/img-f94675db5a.png b/docs/specs/command-class-specification/assets/img-f94675db5a.png deleted file mode 100644 index ac735835bed3445bbf260e555a18b2f2057f9f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13860 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 Cd?2j= diff --git a/docs/specs/command-class-specification/assets/img-fbc9bfea32.png b/docs/specs/command-class-specification/assets/img-fbc9bfea32.png deleted file mode 100644 index 12d5a69dbffdc71c4b1c6eb537122a5288d4ba56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1902 zcmeHI`7_%I6i+8r%1U<~Teq~@rRzwkQWYW2Vo+D>3Pt0nc2%4aqQ|jKvz@f0k|YcU zleWKP?IyAekvx$&BGRhuHxG-<(c722qhT;a&tG!rp*BJp1`|ixTVp*EN|wijj-K%< zy=#JBE4cR#XzDK;zVFcj>Nqrgqut4B-EPki{EhHu&bkBrI=%%y0{vm7ZzfTHti>9ZcjYHRoMB!c{e;}%C7gjXv z0hlJ2e5~v=VTu4T#f>v)u;Ur#PSO#=pa`@4?s)Vf91KNnmF&WJilCVY{yz#`*45Ck z^6~MJq187A2)5{TZ%*)a*Sy@^WWZiZKxdM7T6((di&9Mv4yy8P9j5pAve|5dh!Gti zR|BQ3O*M^Q0oUgSWvjnbE9>!QH?g8>4|jK}4z5)WqEZ6d;+$;l>`qf&bezZO@jj@( z=D1JKF3!&b-QAXeo#o`{sAh0*FlUuICk4r(<_<*tR6uU({$vN~C|ng12E?yU#&WFy zk~LWgOkRQlZSUaD5mCbNel9-Q!ZDVME(mGBnZG5 z0&=y$7#f~}!{Je*IiI`Qz!U`TDpzKyr2Z9F%?4s-afXI8CMG7LJQx2kI=<78hT!Wq zyeFD(Q_(O8hr_Le{=U4t9OdrNCx4u1A6v6q;Kkx{g`7P&PwQl4L!;YdwnrcG&S=?eV|R_!dWs7UFIo?cE?0iM+Y8n4z|=E}q{>5C*139F_JF&K=z zf`T99<>jmE`kzNrR&}bcaAmH~%*=e`a3pzN8UamVlVEP8GYNI zmg6rW^a%;4URSvwE7+-7#&{^Ny-)TJ^z3P*PZUR2`WwyV+Z-^Q7f73q;o)b%W?-G|RNRf|f(?qe#J5 zykD`GXhFWN3Qx;Py%g~^Kfom#5{oq>K+}Lq=h^M)rS&XXzy(wMO*K?VHsKJi@@@#o z(w{w6ljVs`X_R6&aIpguXjn}&MCsOz~4Su^X-GO56ouXH-KTxP5tk!@}4@6rEhJ1fn z#FJc?vzUxqedZc{OK~=6Umh+|VR+MOfOc>Vx1Gd#2@lLBuc+Fo^+aPaP88JGKDCzX z`J-~2YSD-OI^uVOBbD;~?QgX4135BmfVkbfp8C!`iCereVC(&rm1a>UMZiM~3kx!m zsX;yqeTjYb682H7$SFh_ncd0D%5x`s6Z(rzmUqqQG`56vv)fiwQ9?-G9#tEY5@1-q z)MRe14*7t}%F6h#u#6x8t^(=XPEJhd4wjicRhYFnLd*tCQCfve{?{ohK>R^cOpM1~ za@pqSP?ZZ-O^(-_s~*wS&Deg&spBjc@T0VFY zrS>L;$$e~rv4QB3+=8+)HHQidj2OhUOBInr{++wyaGqnKo;?nydipkt#X{!(+)ksp zIXF0g7Gh#z$nxy{PYuCt{{GHs4vvoSorLD*=Bbn!+m}UVBqK09aRX(wrpPvHY&8=- PP?)`qv-JzhYxn*H +# 1 Abbreviations + +| Abbreviation | Explanation | +| --- | --- | +| AGI | Association Group Information | +| API | Application Programming Interface | +| ASCII | American Standard Code for Information Interchange. An ASCII code is the numerical representation of a character. | +| CRC | Cyclic Redundancy Check | +| DHCP | Dynamic Host Configuration Protocol. | +| DNS | Dynamic Host Service | +| ID | Identifier | +| IP | Internet Protocol | +| IPV4 | Internet Protocol version 4 | +| IPV6 | Internet Protocol version 6 | +| LF | Linefeed character. | +| LSB | Less Significant Bit | +| MSB | Most Significant Bit | +| NIF | Node Information Frame | +| PIR | Pyroelectric Infrared | +| SUC | Static Update Controller | +| Unicode | Unicode is a standard for encoding of characters. (http://www.unicode.org/) | +| Z/IP | Z-Wave for IP | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 1 of 220 diff --git a/docs/specs/management-command-class-specification/02-introduction/02.01-precedence-of-definitions.md b/docs/specs/management-command-class-specification/02-introduction/02.01-precedence-of-definitions.md new file mode 100644 index 0000000..1995dac --- /dev/null +++ b/docs/specs/management-command-class-specification/02-introduction/02.01-precedence-of-definitions.md @@ -0,0 +1,10 @@ + +# 2.1 Precedence of definitions + +Device Class, Device Type and Command Class Specifications approved as final version during the Device Class, Device Type and Command Class Open Review process have precedence over this document until integrated into this document. diff --git a/docs/specs/management-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md b/docs/specs/management-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md new file mode 100644 index 0000000..c66fe48 --- /dev/null +++ b/docs/specs/management-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md @@ -0,0 +1,26 @@ + +# 2.2 Terms used in this document + +The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", ["MAY", and "OPTIONAL" in this document MUST be interpreted as described in IETF RFC 2119 [6].](../04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[Statements containing the IETF RFC 2119 [6] key words are at times marked with unique requirement](../04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) numbers in the margin. The requirements numbers have the following syntax: CC:xxxx.xx.xx.xx.xxx with each x being an hexadecimal digit. + +This document defines functionality as deprecated or obsoleted. + +The term "obsolete" means that the functionality MUST NOT be supported in new implementations applying for certification. + +A controller SHOULD provide controlling capabilities of the actual functionality for backwards compatibility with legacy devices. + +The term "deprecated" also indicates an obsolete definition, but it permits new implementations applying for certification. + +Thus, the term “deprecated” means that the functionality SHOULD NOT be supported in new implementations applying for certification. Often, another substitute functionality is REQUIRED if the deprecated functionality is implemented. + +A controller SHOULD provide controlling capabilities of the actual functionality for backwards compatibility with legacy devices. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 2 of 220 diff --git a/docs/specs/management-command-class-specification/02-introduction/index.md b/docs/specs/management-command-class-specification/02-introduction/index.md new file mode 100644 index 0000000..7dfb84c --- /dev/null +++ b/docs/specs/management-command-class-specification/02-introduction/index.md @@ -0,0 +1,21 @@ + +# 2 Introduction + +Commands classes are divided in four categories: + + [Application Command Classes [16]](../04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command)  Management Command Classes  [Transport-Encapsulation Command Classes [15]](../04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command)  [Network-Protocol Command Classes [17]](../04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[The list of defined Command Classes with their associated category is available in [14].](../04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +This document describes the Command Classes designed for node management specific purposes. Management command classes are used for service and capabilities discovery, as well as battery management or node associations. + +## Contents + +- [2.1 Precedence of definitions](02.01-precedence-of-definitions.md) +- [2.2 Terms used in this document](02.02-terms-used-in-this-document.md) diff --git a/docs/specs/management-command-class-specification/03-command-class-overview.md b/docs/specs/management-command-class-specification/03-command-class-overview.md new file mode 100644 index 0000000..272ab81 --- /dev/null +++ b/docs/specs/management-command-class-specification/03-command-class-overview.md @@ -0,0 +1,14 @@ + +# 3 Command Class Overview + +General command class overview and rules are described in the Z-Wave Application Command Class [Specification [16] and are valid for the Command Classes presented in this document.](04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +No additional considerations apply for the Management Command Classes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 3 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.01-application-capability-command-class-version-1-obsoleted.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.01-application-capability-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..f3e2c44 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.01-application-capability-command-class-version-1-obsoleted.md @@ -0,0 +1,72 @@ + +# 4.1 Application Capability Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST NOT support this Command Class. + +New implementations MUST use the Supervision Command Class to report support or no support of a [given Command Class. Refer to [15].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +The Application Capability Command Class comprises commands for handling issues related to dynamic support for command classes. Examples include nodes, which only support certain command classes when included securely, and controllers that only support command classes for primary controllers when they are actually operating as primary controllers. + +The intention of the Application Capability Command Class is to provide tools for handling exceptions. Controlling nodes SHOULD maintain a local representation of supported command classes by destination nodes rather than relying on destination nodes returning Application Capability messages. + +Destination nodes capable of returning Application Capability messages MUST list Application Capability Command Class as supported only. + +## 4.1.1 Not Supported Command Class Command + +The Not Supported Command Class Command is used by a node to indicate to a requesting node that the requested command class is not supported. The offending command and command class are encapsulated. + +A node SHOULD use this command to indicate to other nodes that a command is not supported. + +A node receiving this command SHOULD use the information to clean up internal states by requesting up-to-date information on command class support from the sending node using Node Information frame. This includes adjusting user interface details accordingly. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS APPLICATION CAPABILITY _ _ _ | | | | | | | | +| Command = COMMAND COMMAND CLASS NOT SUPPORTED _ _ _ _ | | | | | | | | +| Dyna- mic | Reserved | | | | | | | +| Offending Command Class (0x20 – 0xEE) | | | | | | | | +| Offending Command | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 5 of 220 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS APPLICATION CAPABILITY _ _ _ | | | | | | | | +| Command = COMMAND COMMAND CLASS NOT SUPPORTED _ _ _ _ | | | | | | | | +| Dyna- mic | Reserved | | | | | | | +| Offending Command Class MSB (0xF1 – 0xFF) | | | | | | | | +| Offending Command Class LSB (0x00 – 0xFF) | | | | | | | | +| Offending Command | | | | | | | | + +Payload data following the offending command is omitted. + +Dynamic (1 bit) + +If the “Dynamic” flag is set (‘1’), the sending node has been designed to support this command class but the current operational conditions prevent the node from supporting this command class. One example is the AddNode command used for network management. This command is only supported when a controller is operating as primary controller. + +| Value | Meaning | +| --- | --- | +| ‘0’ | Command not supported (Permanently) | +| ‘1’ | Dynamic support. (Currently no support) | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Offending Command Class (1 or 2 bytes) + +This field indicates the offending command class received by the destination node. The size of the command class field depends on the value of the first byte. + +Offending Command (1 byte) + +This field indicates the offending command received by the destination node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 6 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.02-application-status-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.02-application-status-command-class-version-1.md new file mode 100644 index 0000000..51fa9ab --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.02-application-status-command-class-version-1.md @@ -0,0 +1,59 @@ + +# 4.2 Application Status Command Class, version 1 + +This command class contains commands that are not directly related to a specific functionality in the application, but are useful for maintaining an optimal Z-Wave system. + +## 4.2.1 Compatibility Considerations + +### 4.2.1.1 Node Information Frame (NIF) + +A supporting node MUST always advertise the Application Status Command Class in its NIF, regardless of the inclusion status and security bootstrapping outcome. + +## 4.2.2 Application Busy Command + +The Application Busy Command used to instruct a node that the node that it is trying to communicate with is busy and is unable to service the request right now. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS APPLICATION STATUS _ _ _ | | | | | | | | +| Command = APPLICATION BUSY _ | | | | | | | | +| Status | | | | | | | | +| Wait Time | | | | | | | | + +Status (8 bits) + +The status field can have the following values + +| Status | Description | +| --- | --- | +| 0 | Try again later | +| 1 | Try again in Wait Time seconds | +| 2 | Request queued, executed later | + +Wait Time (8 bits) + +The wait time field indicates the number of seconds a node should wait before retrying the request. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 7 of 220 + +## 4.2.3 Application Rejected Request Command + +All supported commands are typically executed unconditionally and the only handshake is acknowledgement on the protocol level. Some applications can however be in a state where the application rejects to execute a supported command. The Application Rejected Request Command used to instruct a node that the command was rejected by the application in the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS APPLICATION STATUS _ _ _ | | | | | | | | +| Command = APPLICATION REJECTED REQUEST _ _ | | | | | | | | +| Status | | | | | | | | + +Status (8 bits) + +This field MUST be set to 0. The value 0 MUST indicate that the received (supported) command has been rejected by the application at the receiving node + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 8 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.03-association-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.03-association-command-class-version-1.md new file mode 100644 index 0000000..989d3c2 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.03-association-command-class-version-1.md @@ -0,0 +1,204 @@ + +# 4.3 Association Command Class, version 1 + +The Association Command Class is used to manage associations to NodeID destinations. A NodeID destination may be a simple device or the Root Device of a Multi Channel device. + +An association group sends an unsolicited command to the configured destinations when triggered by an event. The parameters of the command may be dynamic, e.g. the temperature of a sensor reading or the light level for a dimmer. + +## 4.3.1 Compatibility considerations + +The Association Group Information (AGI) Command Class SHOULD be supported to enable automated discovery of association group properties. + +It is RECOMMENDED that a node which implements the Association Command Class also implements the Multi Channel Association Command Class for compatibility with End Point destinations. For instance, a wall switch may be configured to control one specific outlet of a power strip if the wall switch supports Multi Channel Association. + +## 4.3.2 Z-Wave Plus considerations + +The Z-Wave Plus certification program mandates that association group 1 is reserved for the Lifeline association group. Association group 1 MUST NOT be assigned to any other use than the Lifeline group. The actual Device Type of a given product specifies mandatory commands which the device must be able to send to a lifeline group destination. A manufacturer MAY add additional commands to the Lifeline group. + +The Z-Wave Plus certification program mandates support for the Association Group Information (AGI) Command Class if a device supports the Association Command Class. + +The Z-Wave Plus certification program recommends that a composite device is designed as a Multi Channel device. + +## 4.3.3 Security considerations + +A node that has been S0/S2 bootstrapped MUST NOT accept Association commands unless the commands are received via the highest security key granted to the node during bootstrapping. + +A supporting node issuing commands via association groups MUST send those commands with its highest granted Security Class. + +A supporting node issuing Set or Report type commands via association groups SHOULD use Supervision encapsulation only if sending commands with S2 (or higher security) encapsulation. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 9 of 220 + +## 4.3.4 Association Set Command + +This command is used to add destinations to a given association group. + +The receiving node SHOULD add the specified NodeID destinations to the specified association group. CC:0085.01.01.13.001 This command MAY be ignored if the association group is already full. + +Routing slaves MUST have return routes assigned to all association destinations. + +Unless the association destination is a gateway, a controlling node MUST NOT create an association if the association destination node does not support the controlling commands (Set/Get types) that the actual association group will be sending. The AGI Command Class MUST be used to probe the CC:0085.01.01.51.002 commands that a given association group will be sending. + +A controlling node SHOULD NOT create an association if the source and destination nodes are bootstrapped with different security levels. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION SET _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| NodeID 1 | | | | | | | | +| .. | | | | | | | | +| NodeID N | | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +A receiving node MUST ignore an unsupported Grouping Identifier. + +NodeID (N bytes) + +This field specifies a list of NodeIDs that are to be added to the specified association group. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 10 of 220 + +## 4.3.5 Association Get Command + +This command is used to request the current destinations of a given association group. + +The Association Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION GET _ | | | | | | | | +| Grouping Identifier | | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +A node that receives an unsupported Grouping Identifier SHOULD return information relating to Grouping Identifier 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 11 of 220 + +## 4.3.6 Association Report Command + +This command is used to advertise the current destinations of a given association group. + +If the node supports the Multi Channel Association Command Class, + + the node MUST advertise the same Node ID destinations in this report as in the Multi Channel Association Report Command + + the node MUST NOT advertise the NodeID of End Point destinations in this report. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION REPORT _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| Max Nodes Supported | | | | | | | | +| Reports to Follow | | | | | | | | +| NodeID 1 | | | | | | | | +| … | | | | | | | | +| NodeID N | | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to advertise the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +Max Nodes Supported (8 bits) + +The maximum number of destinations supported by the advertised association group. Each destination MAY be a NodeID destination or an End Point destination (if the node supports the Multi Channel Association Command Class). + +Reports to Follow (8 bits) + +The entire list destinations of the advertised association group may be too long for one command. This field MUST advertise how many report frames will follow this report. + +NodeID (N bytes) + +This field advertises a list of NodeID destinations of the advertised association group. The list of NodeIDs MUST be empty if there are no NodeID destinations configured for the advertised CC:0085.01.03.11.005 association group. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 12 of 220 + +## 4.3.7 Association Remove Command + +This command is used to remove destinations from a given association group. + +If the node supports the Multi Channel Association Command Class the node MUST NOT remove End Point destinations in response to this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION REMOVE _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| NodeID 1 | | | | | | | | +| … | | | | | | | | +| NodeID N | | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to specify from which association group the specified NodeID destinations should be removed. + +Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +This field MUST be interpreted in combination with the NodeID field. + +A node that receives an unsupported Grouping Identifier MUST ignore this command. + +NodeID (N bytes) + +This field specifies a list of NodeID destinations that are to be removed from the specified association group. + +[The Grouping Identifier and NodeID fields MUST be interpreted as indicated in Table 1.](04.03-association-command-class-version-1.md#437-association-remove-command) + +Table 1, Association Remove, V1::Parameter interpretation + +| Grouping identifier | Number of NodeIDs | Interpretation | +| --- | --- | --- | +| > 0 | > 0 | Remove specified NodeIDs from the specified association group (MANDATORY V1) | +| > 0 | = 0 | Remove all NodeIDs from the specified association group (RECOMMENDED V1) | +| = 0 |  0 | (Reserved V1) | + +A sending node MUST NOT send reserved parameter combinations and a receiving node MUST ignore reserved parameter combinations. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 13 of 220 + +## 4.3.8 Association Supported Groupings Get Command + +This command is used to request the number of association groups that this node supports. + +The Association Supported Groupings Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION GROUPINGS GET _ _ | | | | | | | | + +## 4.3.9 Association Supported Groupings Report Command + +This command is used to advertise the maximum number of association groups implemented by this node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION GROUPINGS REPORT _ _ | | | | | | | | +| Supported Groupings | | | | | | | | + +Supported Groupings (8 bits) + +This field is used to advertise the number of association groups that this node supports. + +Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 14 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.04-association-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.04-association-command-class-version-2.md new file mode 100644 index 0000000..d2c5780 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.04-association-command-class-version-2.md @@ -0,0 +1,125 @@ + +# 4.4 Association Command Class, version 2 + +The Association Command Class is used to manage associations to NodeID destinations. A NodeID destination may be a simple device or the Root Device of a Multi Channel device. + +The following sections specify commands which were extended or added in version 2. + +## 4.4.1 Compatibility considerations + +A device supporting this command class version MUST also support the Association Command Class, version 1. + +This version introduces + + [New methods for the removal of associations via the Association Remove Command](04.04-association-command-class-version-2.md#444-association-remove-command)  New commands [Association Specific Group Get Command](04.04-association-command-class-version-2.md#445-association-specific-group-get-command) - [Association Specific Group Report Command](04.04-association-command-class-version-2.md#446-association-specific-group-report-command) - + +[The considerations of section 4.3.1 also apply to this version.](04.03-association-command-class-version-1.md#431-compatibility-considerations) + +## 4.4.2 Z-Wave Plus considerations + +[The considerations of section 4.3.2 also apply to this version.](04.03-association-command-class-version-1.md#432-z-wave-plus-considerations) + +## 4.4.3 Security considerations + +[The considerations of section 4.3.3 also apply to this version.](04.03-association-command-class-version-1.md#433-security-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 15 of 220 + +## 4.4.4 Association Remove Command + +The Association Remove Command is used to remove NodeID destinations from a given association group. + +If the node supports the Multi Channel Association Command Class the node MUST NOT remove End Point destinations in response to this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION REMOVE _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| NodeID 1 | | | | | | | | +| ... | | | | | | | | +| NodeID N | | | | | | | | + +Grouping identifier (8 bits) + +This field is used to specify from which association group the specified NodeID destinations are to be removed. + +This field MUST be interpreted in combination with the NodeID field. + +A node that receives an unsupported Grouping Identifier MUST ignore this command; with the [exception of Grouping Identifier 0, which MUST be accepted. Refer to Table 2.](04.04-association-command-class-version-2.md#444-association-remove-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 16 of 220 NodeID (N bytes) + +This field specifies a list of NodeID destinations that are to be removed. The Grouping Identifier and [NodeID fields MUST be interpreted as indicated in Table 2:](04.04-association-command-class-version-2.md#444-association-remove-command) + +Table 2, Association Remove, V2::Parameter interpretation + +| Grouping identifier | Number of NodeIDs | Interpretation | +| --- | --- | --- | +| > 0 | > 0 | Remove destination NodeIDs from association group (MANDATORY V1, MANDATORY V2) | +| > 0 | = 0 | Remove all destination NodeIDs from association group (RECOMMENDED V1, MANDATORY V2) | +| = 0 | > 0 | Remove destination NodeIDs from all association groups (Reserved V1, MANDATORY V2) | +| = 0 | = 0 | Remove all destination NodeIDs from all association groups (Reserved V1, MANDATORY V2) | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 17 of 220 + +## 4.4.5 Association Specific Group Get Command + +This command allows a portable controller to interactively create associations from a multi-button device to a destination that is out of direct range. + +It is OPTIONAL for a device to support this functionality. However, a receiving device MUST always return the Association Specific Group Report Command in response to this command. CC:0085.02.0B.12.002 If the device does not support this functionality, a Group parameter value of 0 SHOULD be advertised in the Association Specific Group Report Command that is returned in response to this command. + +This functionality allows a supporting multi-button device to detect a key press and subsequently advertise the identity of the key. The following sequence of events takes place: + +The user activates a special identification sequence and pushes the button to be identified o + +The device issues a Node Information frame (NIF) o + +The NIF allows the portable controller to determine the NodeID of the multi-button device o + +The portable controller issues an Association Specific Group Get Command to the multi- o button device + +The multi-button device returns an Association Specific Group Report Command that o advertises the association group that represents the most recently detected button + +The Association Group Information (AGI) Command Class provides a centralised alternative for the discovery of available association groups and the capabilities of these groups. A device supporting this functionality SHOULD also support the Association Group Information (AGI) Command Class. + +This command MUST NOT be issued via multicast addressing. CC:0085.02.0B.11.003 A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION SPECIFIC GROUP GET _ _ _ | | | | | | | | + +Clarification: Previous text revisions of this specification presented conflicting guidelines for the Association Specific Group Get Command when received by non-supporting devices. The values 0 and 1 were both suggested for the Group field of the Association Specific Group Report Command. It is RECOMMENDED that the value 0 is returned by non-supporting devices. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 18 of 220 + +## 4.4.6 Association Specific Group Report Command + +This command is used to advertise the association group that represents the most recently detected button. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION _ _ | | | | | | | | +| Command = ASSOCIATION SPECIFIC GROUP REPORT _ _ _ | | | | | | | | +| Group | | | | | | | | + +Group (8 bits) + +This field is used to advertise the association group that represents the most recently detected button. + +The value of this field MUST be in the range 0..255. + +If a supporting device implements a multi-button device, the Group field MUST advertise an association group which represents the most recently activated button. The actual association group SHOULD be able to control an actuator device, e.g. via the Basic Command Class. + +This field SHOULD be set to 0 if the functionality is not supported or if the most recent button event does not map to an association group. + +Clarification: Previous text revisions of this specification presented conflicting guidelines for the Association Specific Group Get Command when received by non-supporting devices. The values 0 and 1 were both suggested for the Group field of the Association Specific Group Report Command. It is RECOMMENDED that the value 0 is returned by non-supporting devices. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 19 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.05-association-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.05-association-command-class-version-3.md new file mode 100644 index 0000000..f3b19db --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.05-association-command-class-version-3.md @@ -0,0 +1,36 @@ + +# 4.5 Association Command Class, version 3 + +The Association Command Class version 3 introduces the capability to discover the highest security class of a target when issuing controlling commands via association groups. + +## 4.5.1 Compatibility Considerations + +If a node supports the version 3 of this Command Class and the Multi Channel Association Command Class, it MUST support the Multi Channel Association Command, version 4 or newer. + +## 4.5.2 Interoperability considerations + +Any supporting node MUST learn the granted security classes of a destination before sending controlling commands to a destination via association groups. + +[Commands are marked as controlling or supporting in [14].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +The following discovery is RECOMMENDED: + +1. Request the NIF and read its contents, look for S2/Supervision and S0 2. If S2 is supported, for every granted S2 key starting from the highest: a. Issue the S2 encrypted controlling command using Supervision Get encapsulation (and Multi Channel encapsulation if End Point source or destination) b. If receiving a Supervision Report, stop the discovery and use the current S2 Security Class for controlling the target NodeID. c. Else if no answer is returned (or S2 Nonce Reports), proceed with a lower granted S2 key. 3. If S0 is supported, try using S0: a. If S2 was in the NIF : i. Issue the S0 encrypted controlling command using Supervision Get encapsulation ii. If receiving a Supervision Report, stop the discovery and use S0 as the Security Class to control the target NodeID b. If S2 was not in the NIF: i. Issue a S0 encrypted S0 Security Command Supported Get command ii. If receiving S0 encrypted S0 Security Command Supported Report command, stop the discovery and use S0 for controlling the target NodeID 4. Settle for non-secure level if no Security Class was found. Supervision encapsulation MAY be used non-securely only if it was in the NIF. + +A supporting node MAY use another algorithm using the following assumptions: + + A controlling node MUST NOT associate Node A to a Node B destination that does not support the Command Class that the Node A will be controlling.  A controlling node MUST NOT associate Node A to a Node B destination if Node A was not granted Node B’s highest Security Class. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 20 of 220 [The Role Type specification [9] provides recommended timeouts when waiting for responses to Get](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) type commands. + +Further, when issuing (supporting or controlling) commands via an association group: + + A supporting node MUST NOT use Supervision encapsulation if the destination does not supports the Supervision Command Class.  A supporting node MUST use Supervision encapsulation if the destination supports the Supervision Command Class  A supporting node MUST NOT use Multi Command encapsulation if the destination does not supports the Multi Command Command Class. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 21 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.06-association-command-configuration-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.06-association-command-configuration-command-class-version-1.md new file mode 100644 index 0000000..161e236 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.06-association-command-configuration-command-class-version-1.md @@ -0,0 +1,239 @@ + +# 4.6 Association Command Configuration Command Class, version 1 + +The Association Command Configuration Command Class defines the commands necessary for a 2 nd node to add and delete commands to NodeIDs in a group as defined in the Association Command Class in a 1 node. st + +The device MUST implement the Association Command Class as ‘supported’ + +The Association Command Class and the Command Configuration Command Class MUST be linked through the following dependencies: + + Nodes added to an association through an Association Set or Association Composite Set MUST be reported in Command Configuration Reports with the Command Class and command identifiers transmitted to the nodes. + + Nodes added to an association through a Command Configuration Set MUST also be reported in an Association Report and Association Composite Report + + All commands associated to a grouping identifier/NodeID pair will be removed as a result of an Association Remove. The related command records will be released + + Command(s) associated to a grouping identifier/NodeID/endpoint pair will be removed as a result of an Association Composite remove. The related command(s) record will be released. + +The memory consumption of supporting full command sizes in all combinations of groupings identifiers and Node IDs is very extensive; hence the command class supports a memory flexible implementation. + +The Command Class allows a device to support a number of command records. A command record consists of the grouping identifier, the Node ID and the command. The size of the command MAY be restricted by the device through the Max command length field. The command MUST be the complete command needed (I.e. All relevant encapsulations MUST be included in the command). + +When no command records are free (all has been used), new commands MUST NOT be allocated to Node IDs before one or more command records have been freed up (through the Association Remove Command) + +If the 2 nd node runs out of free command records before it has finalized its command configurations, it MUST accept that the application on the device has full control of the remaining Node IDs. Alternatively the 2 nd node can abort the command configuration process. In this case it is RECOMMENDED that the 2 node free up the used command records in the aborted command configuration attempt. nd + +A device can report the maximum number of command records, the number of free command records, and the max command length supported through the Command Records Supported Report. + +In order to support sharing knowledge of how a device controls nodes without using extensive memory resources a Configurable Cmd field is supported. When configurable Cmd= 0x0 then a 2 nd node can only monitor the commands. It cannot control them. + +The V/C field allows a device to decrease the memory utilization to a minimum. When a device reports V/C=0x01, then the Command Configuration Set and Command Configuration Report MUST always use command class identifier and command identifier equal to a Basic Set Command Records Supported Get. This allows the device to only store the value field and thereby save memory resources. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 22 of 220 + +## 4.6.1 Command Records Supported Get Command + +The Command Records Supported Get Command is used to request the number of free command records available (grouping Identifier, Node ID, command), the maximum command records supported in the device and information regarding the maximum command length supported in the device. + +The maximum number of groupings the given node supports is available through the Association Command Class. + +The Command Records Supported Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION COMMAND CONFIGURATION _ _ _ _ | | | | | | | | +| Command = COMMAND RECORDS SUPPORTED GET _ _ _ | | | | | | | | + +## 4.6.2 Command Records Supported Report Command + +The Command Records Supported Report Command used to report information regarding the Command records. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION COMMAND CONFIGURATION _ _ _ _ | | | | | | | | +| Command = COMMAND RECORDS SUPPORTED REPORT _ _ _ | | | | | | | | +| Max command length | | | | | | V/C | Conf. Cmd | +| Free Command records 1 | | | | | | | | +| Free Command records 2 | | | | | | | | +| Max Command records 1 | | | | | | | | +| Max Command records 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 23 of 220 Configurable Cmd (1 bit) + +| Configurable Cmd | Functionality | +| --- | --- | +| 0 | The local application has full control of the commands associated with the grouping. The commands can be monitored from a 2nd network node. | +| 1 | The specific commands associated with the grouping can be controlled and monitored from a 2nd network node. This option includes also the level field used by the command Transfer Scene in the Controller Replication Command Class. In this case the level value is transferred via the command Basic Set in the Basic Command Class. | + +V/C (1 bit) + +| V/C | Functionality | +| --- | --- | +| 0 | Command type. A Z-Wave command can be added to the node | +| 1 | Value type. A Value field is specified for a Node ID using the command Basic Set in the Basic Command Class. Level field originates from the command Transfer Scene in the Controller Replication Command Class. | + +Max command length (6 bits) + +If Configurable Cmd is equal to 0x0, the field SHOULD return 0x0. + +If Configurable Cmd is equal to 0x1 the field SHOULD return the maximum length of a command which can be associated to a node in a grouping. The minimum max command length allowed is 0x03. + +Example: + +A product reports a Max command length = 0x03. In this case the product can be programmed with a Multilevel Switch Set, but not a Switch Multilevel Start Level Change. + +Multilevel Switch Set has a command length of 3 + +Multilevel Switch Start Level Change has a command length of 4 + +Free Command Records (16 bits) + +The field specifies the current number of free Command Records which can be configured in the device through the Command Configuration Set Command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 24 of 220 Max Command records (16 bits) + +The field specifies the maximum number of Command Records which can be configured in the device through the Command Configuration Set Command. + +## 4.6.3 Command Configuration Set Command + +The Command Configuration Set Command used to specify which commands SHOULD be sent to nodes within a given Grouping identifier. + +Every Command Configuration Set will utilize one Command record from the pool of free Command records. + +If the device has no free command records when receiving the Command Configuration Set, the command will be ignored. + +The Application on the node may alter the commands when needed. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION COMMAND CONFIGURATION _ _ _ _ | | | | | | | | +| Command = COMMAND CONFIGURATION SET _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Node ID | | | | | | | | +| Command length | | | | | | | | +| Command Class identifier | | | | | | | | +| Command identifier | | | | | | | | +| Command byte 1 | | | | | | | | +| .. | | | | | | | | +| Command byte n | | | | | | | | + +Grouping identifier (8 bits) + +This grouping identifier used to specify how nodes are grouped together. The grouping identifier values MUST be a sequence starting from 1. This field MAY be ignored in case the node only supports one group. + +Node ID (8 bits) + +This field contains the node ID within the grouping specified, that should receive the command. + +Command length (8 bits) + +This field specifies the complete command length (including command class and command identifiers). + +Example: Switch Multilevel Set 0x20. The command length field MUST be equal to 0x03. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 25 of 220 Command Class Identifier (8 bits) + +This field contains the identifier of the command class which should be sent to the Node ID. In case the Configurable Cmd field is equal to 0x0 is this field and the following ignored and can therefore be omitted. + +In case the device has reported V/C=0x1, the Command Class and Command Identifiers MUST be equal to Basic Set command. + +Command identifier (8 bits) + +This field contains the identifier of the Command, which should be sent to the specified Node ID. In case the Configurable Cmd field is equal to 0x0 is this field ignored and can therefore be omitted. + +In case the device has reported V/C=0x1, the Command Class and Command Identifiers MUST be equal to Basic Set Command. + +Command byte (N bytes) + +These fields contain the command parameters, which should be sent to the Node ID. In case the Configurable Cmd field is equal to 0x0 is these fields ignored and can therefore be omitted. + +## 4.6.4 Command Configuration Get Command + +The Command Configuration Get Command is used to request the commands specified for to a Node ID within a given Grouping identifier. + +The Command Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION COMMAND CONFIGURATION _ _ _ _ | | | | | | | | +| Command = COMMAND CONFIGURATION GET _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Node ID | | | | | | | | + +Grouping identifier (8 bits) + +This group identifier used to specify how nodes are grouped together. The group identifier values MUST be a sequence starting from 1. This field MUST be ignored in case the node only supports one group. + +Node ID (8 bits) + +This field specifies the node ID within the grouping. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 26 of 220 + +## 4.6.5 Command Configuration Report Command + +The Command Configuration Report Command used to report the commands specified for a Node ID within a given Grouping identifier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION COMMAND CONFIGURATION _ _ _ _ | | | | | | | | +| Command = COMMAND CONFIGURATION REPORT _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Node ID | | | | | | | | +| First | Reserved | | | Reports to follow | | | | +| Command length | | | | | | | | +| Command Class identifier | | | | | | | | +| Command identifier | | | | | | | | +| Command byte 1 | | | | | | | | +| ... | | | | | | | | +| Command byte N | | | | | | | | + +Grouping identifier (8 bits) + +This group identifier identifies the group. The group identifier values MUST be a sequence starting from 1. + +Node ID (8 bits) + +This field contains the node ID as requested in the Association Command Get. + +Reports to follow (4 bits) + +This value indicates how many report frames left before transferring the entire list of commands. + +First (1 bit) + +This field indicates that this report is the first report relating to a Grouping identifier/Node ID pair + +Command length (8 bits) + +This field specifies the complete command length (including command class and command identifiers). + +Example: Multilevel Switch Set 0x20. The command length field MUST be equal to 0x03. + +Command Class Identifier (8 bits) + +This field contains the identifier of the command class which is sent to the Node ID. + +In case the device has reported V/C=0x1, the Command Class and Command Identifiers MUST be equal to Basic Set command + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 27 of 220 Command identifier (8 bits) + +This field contains the identifier of the Command which is sent to the specified Node ID. + +In case the device has reported V/C=0x1, the Command Class and Command Identifiers MUST be equal to Basic Set Command + +Command byte (N bytes) + +These fields contain the command parameter which is sent to the Node ID. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 28 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.01-compatibility-considerations.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.01-compatibility-considerations.md new file mode 100644 index 0000000..d1d8dc5 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.01-compatibility-considerations.md @@ -0,0 +1,16 @@ + +# 4.7.1 Compatibility considerations + +A node supporting the AGI Command Class MUST support the Association Command Class. + +## 4.7.1.1 Multi Channel considerations + +The Association Group Information (AGI) Command Class also applies to Multi Channel devices. + +If a node implements Multi Channel End Points and supports the AGI Command Class, each individual End Point MUST support the AGI Command Class. diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.02-association-principles.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.02-association-principles.md new file mode 100644 index 0000000..f3ae54b --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.02-association-principles.md @@ -0,0 +1,18 @@ + +# 4.7.2 Association Principles + +A light control transmitter may have one or more keys. A key is mapped to one or more association groups. + +![Figure 1, Light control transmitter (example) Figure 2, Lamp module (example)](assets/img-671e4cdb38.png) + +![Figure 1, Light control transmitter (example) Figure 2, Lamp module (example)](assets/img-cc66c4e9cc.png) + +A light control transmitter key can be configured to control a lamp by adding the NodeID of the lamp to an association group that represents the key. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 29 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.03-the-association-group-information.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.03-the-association-group-information.md new file mode 100644 index 0000000..bf8d739 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.03-the-association-group-information.md @@ -0,0 +1,178 @@ + +# 4.7.3 The Association Group Information + +A node may implement one or more association groups. If the device implements association groups, CC:0059.01.00.12.002 [the device SHOULD provide an Association Group Information (AGI) table as described in Table 3.](04.07.03-the-association-group-information.md#473-the-association-group-information) + +Table 3, Layout of one line of the Association Group Information table + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | + +An AGI table entry carries a number of fields. The information is typically static and can be defined at compile time. Thus, the AGI table does not need to occupy any RAM or non-volatile storage. + +## 4.7.3.1 Group identifier + +The Group identifier indicates which association group the actual table entry relates to. As association groups are always numbered in a sequence starting from 1, an actual implementation does not have to store the group identifier in its memory. The number of association groups may be requested via the Association Groupings Get or Multi Channel Association Groupings Get commands. + +Association group 1 is reserved for the Z-Wave Plus Lifeline association group. Group 1 MUST NOT be assigned to any other use than the Lifeline group. The actual Device Type specifies a mandatory list of commands which the device MUST send to all targets associated to the Lifeline group. A manufacturer [MAY add additional commands to the Lifeline group. Refer to [10], [20].](../04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +The Lifeline group MUST be advertised for the Root Device of a Multi Channel device. A Multi Channel CC:0059.01.00.12.003 End Point SHOULD advertise commands for association group 1 which End Points can send via the Root Device Lifeline group if a Multi Channel Association is created from the Root Device Lifeline group. + +## 4.7.3.2 Profile + +A device MAY implement one or several AGI profiles. The profile defines the scope of events which triggers the transmission of commands to the actual association group. As an example a temperature sensor may issue different Basic Set Command parameters when the temperature exceeds a threshold and when the temperature drops below a threshold. The actual behavior is application dependent and out of scope of the AGI Command Class. + +[The profile identifiers are referenced in Table 8. Profiles are divided into categories in the following](../04.09-association-group-information-agi-command-class-version-3.md#4921-profile) sections. + +4.7.3.2.1 General profiles + +The “General” category comprises the “Not Applicable” and “Lifeline” profiles. The “Not Applicable” profile identifier MUST be advertised if the actual association group does not match any of the defined profiles. + +The “Lifeline” profile identifier MUST be advertised for association group 1 of the Root Device. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 30 of 220 4.7.3.2.2 Control profiles + +“Control” profiles are intended for association groups of which commands are triggered by a user control mechanism, such as keys or buttons. As an example, a light control transmitter may comprise two control keys that can each control a group of lamps. + +A control key may control up and down dimming as well as on/off state. Thus, a control key may send more than one command with one specific parameter. A control key may be implemented as a physical key, a group of icons, touch screen gestures or other means. The actual implementation is out of scope of this command class. + +In case of multiple logical functions in a device, the device MAY implement one Multi Channel End Point for each logical function; e.g. each push button is implemented as a separate End Point. + +[Table 4 gives an example of a Multi Channel a battery-powered two-button light control device.](04.07.03-the-association-group-information.md#4732-profile) + +![figure p42](assets/img-8d4107a922.png) + +Root Device: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | General:Lifeline | Central Scene Notification Notification Report Battery Report Device Reset Locally Notification | Lifeline | +| 2 | Control:Key1 | Basic Set | On/Off control (Button 1) | +| 3 | Control:Key1 | Multilevel Switch Set | Dimmer control (Button 1) | +| 4 | Control:Key2 | Basic Set | On/Off control (Button 2) | +| 5 | Control:Key2 | Multilevel Switch Set | Dimmer control (Button 2) | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 31 of 220 + +![figure p43](assets/img-4af5a8dd67.png) + +End Point 1: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | General:Lifeline | - | Lifeline | +| 2 | Control:Key1 | Basic Set | On/Off control (Button 1) | +| 3 | Control:Key1 | Multilevel Switch Set | Dimmer control (Button 1) | + +![figure p43](assets/img-4af5a8dd67.png) + +End Point 2: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | General:Lifeline | - | Lifeline | +| 2 | Control:Key2 | Basic Set | On/Off control (Button 2) | +| 3 | Control:Key2 | Multilevel Switch Set | Dimmer control (Button 2) | + +Table 4, Example: AGI tables for two-button light control transmitter The Profile identifiers Control:Key 1 and Control:Key 2 allows an installer tool to determine which Multi Channel End Point and which association group to use in order to configure buttons to control a light dimmer. The Group Name allows a human user to make a qualified decision even if the installer tool is not, e.g. because it is running an older version not updated with newer profile identifiers. + +End Points 1 and 2 in the above example do not support any Command Class that must be sent via the Z-Wave Plus Lifeline. Therefore End Points 1 and 2 advertise an empty Command Class list for the Lifeline association group. + +The Root Device in the above example advertises the Basic Set Command in association group 2. This is CC:0059.01.00.12.004 a feature of End Point 1. A controlling node SHOULD NOT create associations from other Root Device association groups than the Lifeline group if it supports the Multi Channel Command Class. The purpose of the Root Device Association Groups (with the exception of the Lifeline group) is only to provide backwards compatibility for legacy devices without support for the Multi Channel Command Class. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 32 of 220 4.7.3.2.3 Sensor profiles + +“Sensor” profiles are intended for association groups of which commands are triggered by sensor readings. As an example, a sensor product could comprise two temperature sensors. + +Sensor profile identifiers are constructed by prepending the Multilevel Sensor Command Class identifier (referred to with AGI_PROFILE_SENSOR) to a multilevel sensor type defined in the Multilevel Sensor [Command Class. The values in Table 8 only serve as examples to illustrate the construction of AGI](../04.09-association-group-information-agi-command-class-version-3.md#4921-profile) Sensor Profile Identifiers. For the full list of available sensor types, refer to the “Multilevel Sensor Report Command”. + +In case of multiple logical functions in a device, the device SHOULD implement one Multi Channel End [Point for each logical function; e.g. each sensor instance is implemented as a separate End Point. Table 5 gives an example of a Multi Channel battery-powered sensor device with two multilevel sensor](04.07.03-the-association-group-information.md#4732-profile) functions: + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 33 of 220 + +![figure p45](assets/img-c30a527f05.png) + +Root Device: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | General:Lifeline | Multilevel Sensor Report Notification Report Battery Report Device Reset Locally Notification | Lifeline | +| 2 | Sensor:Temperature | Basic Set | On/Off control (Indoor temperature) | +| 3 | Sensor:Temperature | Basic Set | On/Off control (Outdoor temperature) | + +![figure p45](assets/img-9d7166209e.png) + +End Point 1: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | Sensor:Temperature | Multilevel Sensor Report | Indoor temperature via Lifeline | +| 2 | Sensor:Temperature | Basic Set | On/Off control (Indoor temperature) | + +![figure p45](assets/img-9d7166209e.png) + +End Point 2: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | Sensor:Temperature | Multilevel Sensor Report | Outdoor temperature via Lifeline | +| 2 | Sensor:Temperature | Basic Set | On/Off control (Outdoor temperature) | + +Table 5, Example: AGI tables for two-function sensor + +The Profile identifier is Sensor:Temperature for both End Points but the Group Name allows a user to determine which End Point and which association group to use in order to configure the indoor temperature sensor to control a heating element. + +The Root Device in the above example advertises the Multilevel Sensor Report command in the Lifeline group. Residing in a Multi Channel device, the Root Device does not actually implement any application + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 34 of 220 functionality. The Multilevel Sensor Report Command is a feature of the End Points which is advertised for backwards compatibility with legacy devices not supporting the Multi Channel Command Class. Likewise, the Root device advertises the Basic Set Command in association groups 2 and 3. This is also a feature of the End Points. Refer to the Multi Channel Command Class for details on backwards compatibility. + +End Point 1 in the above example advertises the Multilevel Sensor Report Command in association group 1. By advertising that zero NodeIDs are supported for association group 1, End Point 1 indicates that this command is sent via the Root Device Lifeline group if a Multi Channel association is created for the Root Device Lifeline group. The same principle applies to End Point 2. + +4.7.3.2.4 Notification profiles + +“Notification” profiles are intended for association groups of which commands are triggered by detected events or state changes. As an example, a detector product could comprise one smoke sensor and one CO2 detector. + +Notification profile identifiers are constructed by prepending the Notification Command Class identifier (referred to with AGI_PROFILE_NOTIFICATION) to a notification type defined in the Notification Command Class. The values below only serve as an example to illustrate the construction of AGI Notification Profile identifiers. For the full list of available notification types, refer to the Notification [Command Class [16].](../04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +In case of multiple logical functions in a device, the device SHOULD implement one Multi Channel End Point for each logical function. + +The following example outlines how a standalone smoke alarm is represented by an AGI table: + +![figure p46](assets/img-841ee8d357.png) + +Root Device: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | General:Lifeline | Notification Report Battery Report Device Reset Locally Notification | Lifeline | +| 2 | Notification:SmokeAlar m | Basic Set | On/Off control (Smoke) | + +Table 6, Example: AGI table for one-function alarm device + +The Profile identifier Notification:SmokeAlarm indicates to an installer that the Basic Set Command of association group 2 is issued in response to smoke alarm events. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 35 of 220 + +## 4.7.3.3 Command Class and Command + +This field contains the command class and the command that is sent to targets associated with this CC:0059.01.00.13.004 association group if an event occurs. This field MAY advertise a list of commands and MAY contain a [combination of extended and normal command classes. Refer to 4.7.9.](04.07.09-association-group-command-list-report.md#479-association-group-command-list-report) + +The command list is used by a controlling application to discover what functionality the node provides via a given association group. It also allows the controlling node to ensure that the associated node understands the received commands. + +A node MAY list only one command if the actual association group sends different commands which actually relate to the same overall functionality and belong to the same Command Class and Commands Class version (e.g. Multilevel Switch Set / Multilevel Switch Start Level Change / Multilevel Stop Level Change) + +In case Multi Channel End Points are implemented, the Lifeline association group (group 1) of End Points SHOULD be used to advertise commands that will be sent via the Root Device Lifeline group if a Multi Channel association is created from the Root Device Lifeline group. + +## 4.7.3.4 Association group name + +This field contains a name reflecting the purpose of the group, e.g. “On/Off control (Smoke)”. + +The Root Device Lifeline group MUST be named “Lifeline”. + +Group names MUST be encoded using UTF-8. The available capacity for characters depends on the actual characters encoded with UTF-8. Plain ASCII characters only occupy one byte while special characters may need two or more bytes for representation. diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.04-association-group-name-get.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.04-association-group-name-get.md new file mode 100644 index 0000000..e31d8fd --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.04-association-group-name-get.md @@ -0,0 +1,28 @@ + +# 4.7.4 Association Group Name Get + +This command is used to query the name of an association group. + +The Association Group Name Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION GRP INFO _ _ _ _ | | | | | | | | +| Command = ASSOCIATION GROUP NAME GET _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 36 of 220 Grouping Identifier (1 byte) + +This field is used to specify the requested association group identifier. + +A node receiving this command for an unsupported Grouping Identifier SHOULD return information relating to Grouping Identifier 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 37 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.05-association-group-name-report.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.05-association-group-name-report.md new file mode 100644 index 0000000..489e6db --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.05-association-group-name-report.md @@ -0,0 +1,36 @@ + +# 4.7.5 Association Group Name Report + +This command is used to advertise the assigned name of an association group. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION GRP INFO _ _ _ _ | | | | | | | | +| Command = ASSOCIATION GROUP NAME REPORT _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| Name Length | | | | | | | | +| Name 1 | | | | | | | | +| ... | | | | | | | | +| Name N | | | | | | | | + +Grouping Identifier (1 byte) + +This field is used to advertise the actual association group identifier. + +Name Length (1 byte) + +This field indicates the length in bytes of the Name field. The value MUST be in the range 0..42. + +Name (N bytes) + +This field is used to indicate the assigned name for the actual Group Identifier. + +The length of this field in bytes MUST comply with the advertised value in the Name Length field. The string MUST NOT contain any appended termination characters. CC:0059.01.02.11.003 The characters MUST be encoded in UTF-8 format. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 38 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.06-association-group-info-get.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.06-association-group-info-get.md new file mode 100644 index 0000000..caefb59 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.06-association-group-info-get.md @@ -0,0 +1,51 @@ + +# 4.7.6 Association Group Info Get + +This command is used to request the properties of one or more association group. + +The Association Group Info Report MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION GRP INFO _ _ _ _ | | | | | | | | +| Command = ASSOCIATION GROUP INFO GET _ _ _ | | | | | | | | +| Refresh cache | List Mode | Reserved | | | | | | +| Grouping Identifier | | | | | | | | + +List Mode (1 bit) + +This field is used to request the properties of the supported association groups of a node. + +If List Mode is set to 1, a receiving node MUST ignore the Grouping Identifier field and return the properties of all its supported associations groups. The receiving node MAY return the response in several Reports, (e.g. due to memory constraints or a high number of association groups). + +If List Mode is set to 0, a receiving node MUST advertise the properties of the association group identified by the Grouping Identifier. + +The Association Group Info Report returned in response to this command MUST advertise the same List Mode value as specified by this field. + +Refresh Cache (1 bit) + +If AGI information is transferred via a gateway, the gateway MUST cache information for all nodes; also listening nodes. The AGI Get command flag "Refresh Cache" is used by a management application to instruct a gateway to update its cache on the first chance given. In case of a sleeping device, this may require a user operation to wake up the device. In case of a Wake Up device, the gateway may wait for the next Wake Up Notification from the actual device. + +The "Refresh Cache" value 0 MUST specify that the gateway is to return its cached information. The "Refresh Cache" value 1 MUST specify that the gateway is to return its cached information and update its cache on the first chance given. + +The "Refresh Cache" SHOULD be set to 0 by a sending node. A receiving node may have re-configurable AGI properties, e.g. if it is a configurable multi-purpose CC:0059.01.03.13.002 remote control. If the "Dynamic Info" flag of the AGI Report command is set to 1, a sending node MAY set the "Refresh Cache" flag in the AGI Get command to force the gateway to update its cache, e.g. after the sending node has re-configured the AGI properties of the receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 39 of 220 Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Grouping Identifier (1 byte) + +This field is used to specify the requested association group identifier. This value MUST be ignored if the List Mode field is set to 1. + +A node receiving this command for an unsupported Grouping Identifier SHOULD return information relating to Grouping Identifier 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 40 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.07-association-group-info-report.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.07-association-group-info-report.md new file mode 100644 index 0000000..53706a1 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.07-association-group-info-report.md @@ -0,0 +1,77 @@ + +# 4.7.7 Association Group Info Report + +This command is used to advertise the properties of one or more association groups. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION GRP INFO _ _ _ _ | | | | | | | | +| Command = ASSOCIATION GROUP INFO REPORT _ _ _ | | | | | | | | +| List mode | Dynamic Info | Group Count | | | | | | +| Grouping Identifier | | | | | | | | +| Mode = 0 | | | | | | | | +| Profile MSB | | | | | | | | +| Profile LSB | | | | | | | | +| Reserved = 0 | | | | | | | | +| Event Code MSB = 0 | | | | | | | | +| Event Code LSB = 0 | | | | | | | | +| ... | | | | | | | | +| Grouping Identifier | | | | | | | | +| Mode = 0 | | | | | | | | +| Profile MSB | | | | | | | | +| Profile LSB | | | | | | | | +| Reserved = 0 | | | | | | | | +| Event Code MSB = 0 | | | | | | | | +| Event Code LSB = 0 | | | | | | | | + +List Mode (1 bit) + +The List Mode field MUST advertise the same value as specified in the Association Group Info Get command which caused this command to be returned. + +If List Mode is 1, a sending node is advertising the properties of all association groups. The sending node MAY return several Reports. + +If List Mode is 0 a sending node MUST advertise the properties of one association group. + +Dynamic Info (1 bit) + +If the Dynamic Info field is set to 1, the information MAY change and a controlling node SHOULD perform periodic cache refresh for this node. Nodes MUST set this bit if they are able to change the CC:0059.01.04.11.003 Association Group Information on the fly. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 41 of 220 If this field is set to 0, a controlling node MUST NOT request this information more than one time. + +Group Count (6 bits) + +This field indicates the number of association groups advertised in the command. The Grouping Identifier, Mode, Profile, Reserved and Event Code fields MUST be repeated for each association group. + +If List Mode is set to 0, the Group Count field MUST be set to 1. + +If List Mode is set to 1, the Group Count field MUST advertise the number of association group property blocks following this field. + +A node receiving this report may determine the total number of association groups via the Association Supported Groupings Get or Multi Channel Association Supported Groupings Get commands. + +Grouping Identifier (1 byte) + +This field MUST advertise the association group identifier of the actual association group property block. + +Mode (1 byte) + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Profile (2 bytes) + +[This field is used to advertise the profile of the actual association group. Refer to section 4.7.3.2 and](04.07.03-the-association-group-information.md#4732-profile) CC:0059.01.04.11.009 [Table 8. This field MUST be encoded according to Table 8.](../04.09-association-group-information-agi-command-class-version-3.md#4921-profile) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Event Code (2 bytes) + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 42 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.08-association-group-command-list-get.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.08-association-group-command-list-get.md new file mode 100644 index 0000000..06e658a --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.08-association-group-command-list-get.md @@ -0,0 +1,41 @@ + +# 4.7.8 Association Group Command List Get + +This command is used to request the commands that are sent via a given association group. + +The Association Group Command List Report MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION GRP INFO _ _ _ _ | | | | | | | | +| Command = ASSOCIATION GROUP COMMAND LIST GET _ _ _ _ | | | | | | | | +| Allow cache | Reserved | | | | | | | +| Grouping Identifier | | | | | | | | + +Allow Cache (1 bit) + +This field indicates that a Z-Wave Gateway device is allowed to intercept the request and return a cached response on behalf of the specified target. If this bit is not set to 1, a Z-Wave Gateway device MUST forward the request to the specified target. + +A requesting node SHOULD allow caching to save network bandwidth. CC:0059.01.05.11.004 A Z-Wave Gateway device MUST cache information for all nodes; also listening nodes. This will save network bandwidth. + +A Z-Wave Gateway device MUST forward the request if it does not hold cached information for the specified target. The Z-Wave Gateway device MUST cache the data returned. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Grouping Identifier (1 byte) + +This field is used to specify the requested association group identifier. + +A node that receives an unsupported Grouping Identifier SHOULD return information relating to Grouping Identifier 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 43 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.09-association-group-command-list-report.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.09-association-group-command-list-report.md new file mode 100644 index 0000000..5944435 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/04.07.09-association-group-command-list-report.md @@ -0,0 +1,42 @@ + +# 4.7.9 Association Group Command List Report + +This command is used to advertise the commands that are sent via an actual association group. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ASSOCIATION GRP INFO _ _ _ _ | | | | | | | | +| Command = ASSOCIATION GROUP COMMAND LIST REPORT _ _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| List Length | | | | | | | | +| Command Class 1 (1 or 2 bytes) | | | | | | | | +| Command 1 | | | | | | | | +| … | | | | | | | | +| Command Class N (1 or 2 bytes) | | | | | | | | +| Command N | | | | | | | | + +Grouping Identifier (1 byte) + +This field is used to advertise the actual association group identifier. + +List Length (1 byte) + +This field advertises the length in bytes of the command list (Command Class and Command fields). + +Command Class and Command + +Command Classes MAY be normal or extended Command Classes. Normal Command Classes are represented as one byte while extended Command Classes are represented as two bytes. Thus, a command list entry (command class + command) is either 2 or 3 bytes long. + +The receiving node must parse individual command list entries to determine if the individual Command Class is a normal or an extended Command Class. The first byte of normal command classes is in the range 0x20 – 0xEE, while the first byte of extended command classes is in the range 0xF1 – 0xFF. + +A sending node MUST NOT add any command payload in this field. + +Command Classes already containing destination NodeID such as Wake Up Command Class MUST NOT be listed in the Association Group Command List Report. This also means that the Wake Up Command Class MUST NOT be covered by the Lifeline association group. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 44 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/index.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/index.md new file mode 100644 index 0000000..a50aa2d --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.07-association-group-information-agi-command-class-version-1/index.md @@ -0,0 +1,26 @@ + +# 4.7 Association Group Information (AGI) command class, version 1 + +The Association Group Information (AGI) Command Class allows a node to advertise the capabilities of each association group supported by a given application resource. + +Controllers and installer tools SHOULD use AGI information to support controller-assisted button-to- button association and GUI-based drag-and-drop association in a plug-and-play fashion. + +Centralized gateway-based deployments may create a single association from the lifeline association group to a central management application. + +## Contents + +- [4.7.1 Compatibility considerations](04.07.01-compatibility-considerations.md) +- [4.7.2 Association Principles](04.07.02-association-principles.md) +- [4.7.3 The Association Group Information](04.07.03-the-association-group-information.md) +- [4.7.4 Association Group Name Get](04.07.04-association-group-name-get.md) +- [4.7.5 Association Group Name Report](04.07.05-association-group-name-report.md) +- [4.7.6 Association Group Info Get](04.07.06-association-group-info-get.md) +- [4.7.7 Association Group Info Report](04.07.07-association-group-info-report.md) +- [4.7.8 Association Group Command List Get](04.07.08-association-group-command-list-get.md) +- [4.7.9 Association Group Command List Report](04.07.09-association-group-command-list-report.md) diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.08-association-group-information-agi-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.08-association-group-information-agi-command-class-version-2.md new file mode 100644 index 0000000..efc7ec2 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.08-association-group-information-agi-command-class-version-2.md @@ -0,0 +1,84 @@ + +# 4.8 Association Group Information (AGI) command class, version 2 + +The Association Group Information (AGI) Command Class allows a node to advertise the capabilities of each association group supported by a given application resource. + +## 4.8.1 Compatibility considerations + +The Association Group Information (AGI) Command Class, version 2 introduces the Profile category “Meter”. + +The Association Group Information (AGI) Command Class, version 2 defines no new command fields or changes to the interpretation of Association Group Information (AGI) Command Class, version 1. + +All sections and commands not described in this version remain unchanged from version 1. + +## 4.8.2 The Association Group Information + +A device MAY implement one or more association groups. If the device implements association groups, CC:0059.02.00.12.001 [the device SHOULD provide an Association Group Information (AGI) table as described in in Table 3](04.07-association-group-information-agi-command-class-version-1/04.07.03-the-association-group-information.md#473-the-association-group-information) + +### 4.8.2.1 Profile + +[The profile identifiers are referenced in Table 8. The profiles category “Meter” introduced in version 2 is](04.09-association-group-information-agi-command-class-version-3.md#4921-profile) [described in 4.8.2.1.1.](04.08-association-group-information-agi-command-class-version-2.md#4821-profile) + +4.8.2.1.1 Meter profiles + +“Meter” profiles are intended for association groups of which commands are triggered by meter readings. As an example, a two-phase meter product could comprise three electric meters: one for each phase and one for the total consumption. + +Meter profile identifiers are constructed by prepending the Meter Command Class identifier (referred [to with AGI_PROFILE_METER) to a meter type defined in the Meter Command Class. The values in Table 8 only serve as examples to illustrate the construction of AGI Meter Profile identifiers. For the full list of](04.09-association-group-information-agi-command-class-version-3.md#4921-profile) available meter types, refer to the Meter Command Class. + +In case of multiple logical functions in a device, the device SHOULD implement one Multi Channel End [Point for each logical function; e.g. each meter instance. Table 7 gives an example of a Multi Channel](04.08-association-group-information-agi-command-class-version-2.md#4821-profile) Meter device with two normal and one aggregated meter functions. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 45 of 220 + +![figure p57](assets/img-c40eec3abf.png) + +Root Device: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | General:Lifeline | Meter Report Device Reset Locally Notification | Lifeline | +| 2 | Meter:Electric | Basic Set | On/Off control (Phase 1) | +| 3 | Meter:Electric | Basic Set | On/Off control (Phase 2) | +| 4 | Meter:Electric | Basic Set | On/Off control (Total consumption) | + +![figure p57](assets/img-3049bc51b8.png) + +End Point 1: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | Meter:Electric | Meter Report | Phase 1 via Lifeline | +| 2 | Meter:Electric | Basic Set | On/Off control (Phase 1) | + +![figure p57](assets/img-3049bc51b8.png) + +End Point 2: + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | Meter:Electric | Meter Report | Phase 2 via Lifeline | +| 2 | Meter:Electric | Basic Set | On/Off control (Phase 2) | + +![figure p57](assets/img-3049bc51b8.png) + +End Point 3 (aggregated): + +| Group identifier | Profile 2 bytes | Command Class & Command (list) N bytes | Group Name (UTF-8) M bytes | +| --- | --- | --- | --- | +| 1 | Meter:Electric | Meter Report | Total consumption via Lifeline | +| 2 | Meter:Electric | Basic Set | On/Off control (Total consumption) | + +Table 7, Example: AGI tables for three-function meter + +The Profile identifier is Meter:Electric for all End Points but the Group Name allows a user to determine which End Point and which association group to use in order to configure the phase 2 meter to control an alarm lamp. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 46 of 220 The Root Device in the above example advertises the Meter Report Command in the Lifeline group. Residing in a Multi Channel device, the Root Device does not actually implement any application functionality. The Meter Report command is a feature of the End Points which is advertised for backwards compatibility with legacy devices not supporting the Multi Channel Command Class. Likewise, the Root device advertises the Basic Set Command in association groups 2..4. This is also a feature of the End Points. Refer to the Multi Channel Command Class for details on backwards compatibility. + +End Points 1..3 in the above example advertise the Meter Report Command in association group 1. By advertising that zero NodeIDs are supported for association group 1, End Points indicate that this command is sent via the Root Device Lifeline group if a Multi Channel association is created for the Root Device Lifeline group. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 47 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.09-association-group-information-agi-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.09-association-group-information-agi-command-class-version-3.md new file mode 100644 index 0000000..4b369b2 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.09-association-group-information-agi-command-class-version-3.md @@ -0,0 +1,67 @@ + +# 4.9 Association Group Information (AGI) command class, version 3 + +The Association Group Information (AGI) Command Class allows a node to advertise the capabilities of each association group supported by a given application resource. + +## 4.9.1 Compatibility considerations + +The Association Group Information (AGI) Command Class, version 3 introduces the Profile category “Irrigation”. + +The Association Group Information (AGI) Command Class, version 3 defines no new command fields or changes to the interpretation of Association Group Information (AGI) Command Class, version 1 and version 2. + +All sections and commands not described in this version remain unchanged from version 2. + +## 4.9.2 The Association Group Information + +A node may implement one or more association groups. If the device implements association groups, [the device SHOULD provide an Association Group Information (AGI) table as described in Table 3.](04.07-association-group-information-agi-command-class-version-1/04.07.03-the-association-group-information.md#473-the-association-group-information) + +### 4.9.2.1 Profile + +[The profile categories are referenced in Table 8. The profiles category “Irrigation” introduced in version 3 is described in 4.9.2.1.1.](04.09-association-group-information-agi-command-class-version-3.md#4921-profile) + +4.9.2.1.1 Irrigation Profiles + +“Irrigation” profiles are intended for association groups of which commands are triggered by irrigation events. As an example, an irrigation control device may provide 8 channels that can each control an external resource such as a valve or a pump. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 48 of 220 Table 8, AGI Profiles + +| Profile | Explanation | Profile identifier | | +| --- | --- | --- | --- | +| | | MSB | LSB | +| General:NA (v1) | “Not Applicable” There is no specific class of events for this association group | AGI PROFILE _ _ GENERAL = 0x00 | AGI _ GENERAL NA = 0x00 _ | +| General:Lifeline (v1) | “Lifeline” This association group is intended for all events relevant for the Lifeline group. | AGI PROFILE _ _ GENERAL = 0x00 | AGI _ GENERAL LIFELINE = 0x01 _ | +| | | | | +| Control:Key01 (v1) | “Control Key 1” Members of this association group are controlled or receive reports in response to user input for key 1 | AGI PROFILE _ _ CONTROL = 0x20 | AGI _ CONTROL KEY01 = 0x01 _ | +| Control:Key xx (v1) | … | | | +| Control:Key32 (v1) | “Control Key 32” Members of this association group are controlled or receive reports in response to user input for key 32 | AGI PROFILE _ _ CONTROL = 0x20 | AGI _ CONTROL KEY32 = 0x20 _ | +| | | | | +| Sensor: Air temperature (v1) | “Sensor, Air Temperature” Members of this association group are controlled or receive reports when the sensor value changes. | AGI PROFILE _ _ SENSOR = 0x31 | MULTILEVEL SENSOR TYPE _ _ _ TEMPERATURE = 0x01 | +| Sensor: Humidity (v1) | “Sensor, Humidity” Members of this association group are controlled or receive reports when the sensor value changes. | AGI PROFILE _ _ SENSOR = 0x31 | MULTILEVEL SENSOR TYPE _ _ _ HUMIDITY = 0x05 | +| … | (Only examples above. Sensor profiles are built based on the Sensor Type as described in 4.7.3.2.3) | AGI PROFILE _ _ SENSOR = 0x31 | … | +| | | | | +| Notification: Smoke Alarm (v1) | “Notification, Smoke Alarm” Members of this association group are controlled or receive reports when an event or state change is detected.for the given Notification Type | AGI PROFILE _ _ NOTIFICATION = 0x71 | NOTIFICATION TYPE _ _ SMOKE = 0x01 | +| Notification: CO Alarm 2 (v1) | “Notification, CO Alarm” 2 Members of this association group are controlled or receive reports when an event or state change is detected.for the given Notification Type | AGI PROFILE _ _ NOTIFICATION = 0x71 | NOTIFICATION TYPE _ _ CO2 = 0x03 | +| … | (Only examples above. Notification profiles are built based on the Notification Type as described in 4.7.3.2.4) | AGI PROFILE _ _ NOTIFICATION = 0x71 | … | +| | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 49 of 220 + +| Profile | Explanation | Profile identifier | | +| --- | --- | --- | --- | +| | | MSB | LSB | +| Meter: Electric, kWh (v2) | “Meter, Electric” Members of this association group receive meter reports or are controlled when a metering event is detected. | AGI PROFILE _ _ METER = 0x32 | METER TYPE ELECTRIC = 0x01 _ _ | +| Meter: Gas (v2) | “Meter, Gas” Members of this association group receive meter reports or are controlled when a metering event is detected. | AGI PROFILE _ _ METER = 0x32 | METER TYPE GAS = 0x02 _ _ | +| Meter: Water (v2) | “Meter, Water” Members of this association group receive meter reports or are controlled when a metering event is detected. | AGI PROFILE _ _ METER = 0x32 | METER TYPE WATER = 0x03 _ _ | +| … | (Only examples above. Meter Profiles are built based on the Meter Types as described in 4.8.2.1.1) | AGI PROFILE _ _ METER = 0x32 | … | +| | | | | +| Irrigation: Channel 01 (v3) | “Irrigation Channel 01” Member(s) of this association group are controlled by channel 1 of an irrigation control device | AGI PROFILE _ _ IRRIGATION = 0x6B | AGI _ IRRIGATION CHANNEL 01 = 0x01 _ _ | +| Irrigation: Channel xx (v3) | … | | | +| Irrigation: Channel 32 (v3) | “Irrigation Channel 32” Member(s) of this association group are controlled by channel 32 of an irrigation control device | AGI PROFILE _ _ IRRIGATION = 0x6B | AGI _ IRRIGATION CHANNEL 32 = 0x20 _ _ | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 50 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.10-battery-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.10-battery-command-class-version-1.md new file mode 100644 index 0000000..048d237 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.10-battery-command-class-version-1.md @@ -0,0 +1,43 @@ + +# 4.10 Battery Command Class, version 1 + +The Battery Command Class is used to request and report battery levels for a given device. + +## 4.10.1 Battery Level Get Command + +The Battery Level Get Command is used to request the level of a battery. + +The Battery Level Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY GET _ | | | | | | | | + +## 4.10.2 Battery Level Report Command + +This command is used to report the battery level of a battery operated device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY REPORT _ | | | | | | | | +| Battery Level | | | | | | | | + +Battery Level (8 bits) + +This field is used toreport the percentage indicating the battery level. + +This field MUST be in the range 0x00..0x64 or set to 0xFF. + +Values in the range 0x00..0x64 MUST indicate the battery percentage level from 0 to 100% The value 0xFF MUST indicate a low-battery warning. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 51 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.11-battery-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.11-battery-command-class-version-2.md new file mode 100644 index 0000000..a1b1bdd --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.11-battery-command-class-version-2.md @@ -0,0 +1,189 @@ + +# 4.11 Battery Command Class, version 2 + +This Command Class is used to request and report the battery types, status and levels of a given device. + +## 4.11.1 Compatibility considerations + +The following commands has been extended to query status and levels of a battery: + + [Battery Get Command](04.11-battery-command-class-version-2.md#4112-battery-get-command)  [Battery Report Command](04.11-battery-command-class-version-2.md#4113-battery-report-command) + +The following commands are added for requesting the current health of the battery. + + [Battery Health Get Command](04.11-battery-command-class-version-2.md#4114-battery-health-get-command)  [Battery Health Report Command](04.11-battery-command-class-version-2.md#4115-battery-health-report-command) + +## 4.11.2 Battery Get Command + +This command is used to request both the level of a battery and its status. + +[The Battery Report Command MUST be returned in response to this command](04.11-battery-command-class-version-2.md#4113-battery-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY GET _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 52 of 220 + +## 4.11.3 Battery Report Command + +This command is used to report the level and status of a battery-operated device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY REPORT _ | | | | | | | | +| Battery Level | | | | | | | | +| Battery Charging Status | | Rechar- geable | Back-up battery | Over- heating | Low fluid | Replace/recharge status bitmask | | +| Reserved | | | | | | | Discon- nected | + +Battery Level (8 bits) + +This field is used to report the percentage indicating the battery level. + +This field MUST be in the range 0x00..0x64 or set to 0xFF. + +The value 0xFF MUST indicate a low-battery warning and this notification SHOULD only be sent as an unsolicited Report to the Lifeline destinations. + +Values in the range 0x00..0x64 MUST indicate the battery percentage level from 0 to 100%. + +The percentage level of 0% represents the lowest operational voltage of the device. For example; if the device can no longer operate properly below a battery voltage of 2.2V, the device should report 0% level when the battery voltage reaches 2.2V. + +Battery Charging Status (2 bits) + +The field describes the charging status of a battery if the rechargeable flag field is 1. The field MUST be [encoded according to Table 9.](04.11-battery-command-class-version-2.md#4113-battery-report-command) + +If the Rechargeable flag field is set to 0, the battery charging status value MUST be 0x00. + +Table 9, Charging status notification values: Battery Command Class + +| Value | Description | +| --- | --- | +| 0x00 | Discharging | +| 0x01 | Charging | +| 0x02 | Maintaining | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 53 of 220 Rechargeable (1 bit) + +This field indicates if the battery is rechargeable or not. + +If the battery is rechargeable this field MUST be set to 1. If the battery is not rechargeable, the field value MUST set to 0. + +Back-up battery (1 bit) + +This field is used to illustrate if the battery is utilized for back-up purposes of a mains powered connected device. + +If the battery is used for back-up purposes the field MUST be set to 1. CC:0080.02.03.11.005 If battery is the primary means of power and is not for back-up, this field MUST set to 0. + +Overheating (1 bit) + +This field is used to indicate if overheating is detected at the battery. + +The value 1 MUST indicate that the battery is overheating The value 0 MUST indicate that the battery is operating within the normal temperature range. + +Low fluid (1 bit) + +This field is used to indicate if the battery fluid is low and should be refilled. + +The value 1 MUST indicate that the battery fluid is low. The value 0 MUST indicate that the battery fluid is within the normal range and no maintenance is required. + +Replace/recharge status bitmask (2 bits) + +This field is used to indicate if the battery needs to be recharged or replaced. + +Bit 0 set to 1 MUST indicate that the battery MUST be replaced/recharged soon. Bit 1 set to 1 MUST indicate that the battery MUST be replaced/recharged now. + +If bit 1 is set to 1, bit 0 MUST also be set to 1. + +Disconnected (1 bit) + +This field is used to indicate if the battery is currently disconnected or removed from the node. + +The value 1 MUST indicate that the battery is disconnected and the node is running on an alternative power source. The value 0 MUST indicate that the battery correctly connected to the node. + +If this field is set to 1, the Battery Level field MUST be set to 0x00. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 54 of 220 + +## 4.11.4 Battery Health Get Command + +This command is used to query the health of the battery, particularly the battery temperature and maximum capacity. + +[The Battery Health Report Command MUST be returned in response to this command](04.11-battery-command-class-version-2.md#4115-battery-health-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY HEALTH GET _ _ | | | | | | | | + +## 4.11.5 Battery Health Report Command + +This command is used to report the maximum capacity of the battery as well as the temperature of the battery. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY HEALTH REPORT _ _ | | | | | | | | +| Maximum Capacity | | | | | | | | +| Precision | | | Scale | | Size | | | +| Battery Temperature 1 | | | | | | | | +| … | | | | | | | | +| Battery Temperature N | | | | | | | | + +Maximum Capacity (8 bits) + +This field is used to report the percentage indicating the maximum capacity of the battery. + +This field MUST be in the range 0x00..0x64 or set to 0xFF. If the maximum capacity of the battery is unknown the value MUST set to 0xFF. + +Values in the range 0x00..0x64 MUST indicate the maximum capacity of the battery in the percentage level from 0 to 100%. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 55 of 220 For example, if the initial battery total capacity is 1500mAh, 100% represents this value. If subsequently the node detects that the total battery capacity when fully loaded is down to 1350, it must report 90%. + +Precision (3 bits) + +This field is used to indicate how many decimal places are included in the Battery Temperature field. For example, the Battery Temperature field set to 1025 with the Precision field set to 2 MUST be interpreted as 10.25. + +Scale (2 bits) + +The scale field indicates the scale used for the battery temperature value. This field MUST be encoded [according to Table 10](04.11-battery-command-class-version-2.md#4115-battery-health-report-command) + +Table 10, Battery Health Report: Scale field encoding + +| Value | Description | +| --- | --- | +| 0x00 | Celsius | +| 0x01..0x03 | Reserved | + +Size (3 bits) + +The size field indicates the number of bytes used for the battery temperature value. This field MUST be set to 0, 1, 2 or 4. + +The value 0 MUST indicate that the battery temperature is unknown. In this case, the Scale and Precision fields MUST be set to 0 and the Battery Temperature field MUST be omitted. + +Values 1, 2 and 4 MUST indicate the length in bytes of the Battery Temperature field. + +Battery Temperature (N bytes) + +This field advertises the temperature of the battery. + +The length of this field in bytes MUST be according to the Size field. + +The first byte MUST be the most significant byte. + +This field MUST be encoded using signed representation and comply with Signed field encoding [representation (Reference: Table 10 in [16]).](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 56 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.12-battery-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.12-battery-command-class-version-3.md new file mode 100644 index 0000000..f0695d3 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.12-battery-command-class-version-3.md @@ -0,0 +1,36 @@ + +# 4.12 Battery Command Class, version 3 + +This Command Class is used to request and report the battery types, status and levels of a given device. The Battery Command Class, version 3 is backwards compatible with the Battery Command Class, version 2. Fields and commands not described in this version MUST remain unchanged from version 2. + +The Battery Report Command has been extended to advertise if the device battery is stop charging due to low temperature. + +## 4.12.1 Battery Report Command + +This command is used to report the level and status of battery-operated device + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS BATTERY _ _ | | | | | | | | +| Command = BATTERY REPORT _ | | | | | | | | +| Battery Level | | | | | | | | +| Battery Charging Status | | Recharg eable | Back-up battery | Overhe ating | Low fluid | Replace/recharge status bitmask | | +| Reserved | | | | | | Low tempe- rature Status | Discon- nected | + +All fields not described below remain unchanged from version 2. + +Low Temperature Status (1 bit) + +This status is used to advertise if the battery of a device has stopped charging due to low temperature. + +The value 1 MUST indicate that the battery is not charging due to low temperature. The value 0 MUST indicate that the battery is operational. + +If the battery is not rechargeable, the field value MUST set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 57 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.13-device-reset-locally-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.13-device-reset-locally-command-class-version-1.md new file mode 100644 index 0000000..4b66e6b --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.13-device-reset-locally-command-class-version-1.md @@ -0,0 +1,29 @@ + +# 4.13 Device Reset Locally Command Class, version 1 + +The Device Reset Locally Command Class is used to notify central controllers that a Z-Wave device is resetting its network specific parameters. + +Any node SHOULD support this Command Class if it can be reset to factory default. + +## 4.13.1 Device Reset Locally Notification Command + +The Device Reset Locally Notification Command is used to advertise that the device will be reset to default. + +The reset operation MUST reset protocol data (HomeID, NodeID, etc.). For Z-Wave Plus nodes, [additional requirements upon node reset are provided in [9].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +In case a Lifeline destination is configured in Association Group #1, the device MUST send a Device Reset Locally Notification Command to the Lifeline destination. + +The Device Reset Locally Notification Command MUST be issued by the Root Device. If Multi Channel encapsulation is used, the source End Point MUST be set to 0. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS DEVICE RESET LOCALLY _ _ _ _ | | | | | | | | +| Command = DEVICE RESET LOCALLY NOTIFICATION _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 58 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.14-firmware-update-meta-data-command-class-version-1-deprecated.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.14-firmware-update-meta-data-command-class-version-1-deprecated.md new file mode 100644 index 0000000..beeb134 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.14-firmware-update-meta-data-command-class-version-1-deprecated.md @@ -0,0 +1,251 @@ + +# 4.14 Firmware Update Meta Data Command Class, version 1 [DEPRECATED] + +THIS VERSION HAS BEEN DEPRECATED + +A device MAY implement support for this version of the command class, but it is RECOMMENDED that new implementations implement the Firmware Update Meta Data Command Class, version 3. + +If implementing support for this version of the command class, it is RECOMMENDED that support for Firmware Update Meta Data Command Class, version 3 is also implemented. + +The Firmware Update Meta Data Command Class may be used to transfer a firmware image to a Z-Wave device. + +A device which supports the Firmware Update CC MUST support the Version CC and the Manufacturer Specific CC to enable other devices to select the correct firmware for a specific target. The Version Command Class may be used to verify that the intended firmware version is installed. + +Devices implementing the Firmware Update CC MUST support a data rate of 40kbit/s or more. + +A checksum SHOULD be appended to the firmware image to ensure the integrity of the image. A CC:007A.01.00.12.003 receiving device SHOULD verify the integrity of the received firmware image by matching the received firmware image checksum and the firmware image checksum that is indicated by the Firmware Meta Data Report when the firmware update is initiated. + +It is RECOMMENDED that firmware update is enabled by out-of-band authentication (e.g. physical activation of a pushbutton). If out-of-band authentication is implemented, the device to receive a firmware update must be armed for firmware update before the Firmware Update Meta Data Request Get Command is issued. + +## 4.14.1 Firmware Meta Data Get Command + +The Firmware Meta Data Get Command is used to request information on the current firmware in the device. + +The Firmware Meta Data Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. CC:007A.01.01.11.003 A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE MD GET _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 59 of 220 + +## 4.14.2 Firmware Meta Data Report Command + +The Firmware Meta Data Report Command is used to advertise the status of the current firmware in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE MD REPORT _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | + +Manufacturer ID (16 bits) + +The Manufacturer ID is a unique ID identifying the manufacturer of the device. + +[Manufacturer identifiers can be found in [12].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +The first byte MUST be the most significant byte. + +Firmware ID (16 bits) + +A manufacturer SHOULD assign a unique Firmware ID to each existing product variant. A product variant may be a particular hardware version for a particular world region. When combined with the Manufacturer ID, the Firmware ID is a unique identification of a firmware image that is guaranteed to work with a particular product among all Z-Wave enabled products in the world. If the product has no Firmware ID, the value 0x0000 MUST be returned. + +The first byte MUST be the most significant byte. + +A user may request Manufacturer Specific information to get more detailed information on the product. + +A controlling device SHOULD match the advertised firmware ID for the existing firmware image to the firmware ID provided for a new image. If the firmware IDs do not match, the controlling device SHOULD abort the firmware update operation. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 60 of 220 Checksum (16 bits) + +The checksum field is used to report a checksum value of the firmware image currently running in the CC:007A.01.02.13.001 Z-Wave chip. As an alternative, a value of zero MAY be returned. + +The first byte MUST be the most significant byte. + +It is RECOMMENDED to use a checksum algorithm that implements a CRC-CCITT polynomial using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +## 4.14.3 Firmware Update Meta Data Request Get Command + +The Firmware Update Meta Data Request Get Command is used to request that a firmware update is initiated. + +The Firmware Update Meta Data Request Report Command MUST be returned in response to this command. + +The firmware update MUST NOT be initiated if the Manufacturer ID and the Firmware ID do not match the actual firmware image values. The firmware update MUST be aborted if the checksum does not match the calculated checksum after the firmware image has been transferred. + +It is RECOMMENDED that firmware update is initiated by out-of-band authentication (e.g. physical activation of a pushbutton). + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST GET _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 61 of 220 Manufacturer ID (16 bits) + +The Manufacturer ID is a unique ID identifying the manufacturer of the device. + +[Manufacturer identifiers can be found in [12].The first byte MUST be the most significant byte.](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Firmware ID (16 bits) + +A manufacturer SHOULD assign a unique Firmware ID to each existing product variant. A product variant may be a particular hardware version for a particular world region. When combined with the Manufacturer ID, the Firmware ID is a unique identification of a firmware image that is guaranteed to work with a particular product among all Z-Wave enabled products in the world. + +A receiving application MUST check that the Manufacturer ID and Firmware ID fields match the Manufacturer ID and Firmware ID values of the current firmware. While it is NOT RECOMMENDED, one MAY design a the product that has no Firmware ID. A sending node MUST specify the Firmware ID value 0x0000 to indicate an absent Firmware ID. A receiving node MUST interpret the value 0x0000 as “No Firmware ID available”. + +The first byte MUST be the most significant byte. + +Checksum (16 bits) + +The checksum field MUST carry the checksum of the firmware image about to be transferred. A receiving node MUST match this value and the checksum calculated from the received firmware image. + +It is RECOMMENDED to use a checksum algorithm that implements a CRC-CCITT polynomium using [initialization value equal to 0x1D0F and 0x1021 (normal representation). Refer to appendices in [2].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +## 4.14.4 Firmware Update Meta Data Request Report Command + +This command is used to advertise if the firmware update will be initiated. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | + +Status (8 bits) + +[This field MUST comply with Table 15.](04.19-firmware-update-meta-data-command-class-version-6.md#4193-firmware-update-meta-data-request-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 62 of 220 + +## 4.14.5 Firmware Update Meta Data Get Command + +The Firmware Update Meta Data Get Command is used to request one or more Firmware Update Meta Data Report Commands. + +The Firmware Update Meta Data Report Command MUST be returned in response to this command. + +The transmission of the next Firmware Update Meta Data Get Command MAY be delayed if time is required to store the most recent firmware fragment in temporary non-volatile memory. A node MAY request multiple Firmware Update Meta Data Report Commands to improve throughput. + +This command MUST NOT be issued via multicast addressing. CC:007A.01.05.11.003 A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +Two exceptions may apply: A noise burst may interfere the transmission or the data source may stop returning Firmware Update Meta Data Report Commands. + +To accommodate for bursts of RF noise, a device receiving data SHOULD repeatedly retransmit the same Firmware Update Meta Data Get Command every 10 seconds in case no Firmware Update Meta Data Report Commands are received. A device receiving data SHOULD stop retransmitting Firmware Update Meta Data Get commands 2 minutes after the last successful reception of a Firmware Update Meta Data Report Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD GET _ _ _ | | | | | | | | +| Number of Reports | | | | | | | | +| Res | Report number 1 | | | | | | | +| Report number 2 | | | | | | | | + +Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Number of Reports (8 bits) + +Number of Firmware Update Meta Data Report Commands to be received in response to this Firmware Update Meta Data Get Command. + +Report number 1 .. 2 (15 bits) + +The Report number field indicates the Firmware Update Meta Data Report Command to be requested. The report number values MUST be a sequence starting from 1. The first byte (Report number 1) is the most significant byte. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 63 of 220 + +## 4.14.6 Firmware Update Meta Data Report Command + +The Firmware Update Meta Data Report Command is used to transfer a firmware image fragment. + +If sending more than a single Firmware Update Meta Data Report Command at a time, a node MUST apply a delay between each transmitted command. The minimum required time delay and number of frames before a delay must be inserted depends on the actual bit rate. + + 40 kbit/s: At least 35 ms if sending more than 1 frame back-to-back + + 100 kbit/s: At least 15 ms if sending more than 2 frames back-to-back + +If needed, a controlling node SHOULD abort an ongoing transfer by responding to a Firmware Update Meta Data Get Command with a Firmware Update Meta Data Report Command with the Last bit enabled and the Data fields intentionally corrupted. This will invalidate the calculated firmware checksum, which should eventually cause the receiving device to return a Firmware Update Meta Data Status Report Command with the status code . + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REPORT _ _ _ | | | | | | | | +| Last | Report number 1 | | | | | | | +| Report number 2 | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | + +Last (1 bit) + +The Last flag indicates if the requested Firmware Update Meta Data Report Command carries the last firmware image fragment. The flag MUST be set to ‘1’ if this is the last fragment. Otherwise the flag MUST be ‘0’. + +Report number (15 bits) + +The Report number field indicates the sequence number of the contained firmware fragment. The first firmware fragment MUST be identified by the Report number value 1. The sequence number of each following firmware fragment MUST be incremented. + +Report number 1 is the most significant byte. + +The report number may be used to calculate the offset of the data by the formula: + +Offset = (Report number – 1) x Number of Data fields (N) + +Except for the last frame, each Report MUST carry the same number of Data bytes as the first fragment. The last frame MAY carry a shorter Data field. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 64 of 220 Data (N bytes) + +The Data field is used to carry one firmware image fragment. Except for the last frame, each Firmware Update Meta Data Report Command MUST carry the same number of Data bytes as the first fragment. The last frame MAY carry a shorter Data field. + +A sending device MUST use a fragment size which matches the actual number of available Data bytes. The number of available Data bytes depends on the actual bit rate, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report. A receiving device MUST determine the number of Data bytes from the length of the first received frame. + +## 4.14.7 Firmware Update Meta Data Status Report Command + +This command is used to advertise the firmware update status. + +The command MUST be issued when the firmware update is completed or aborted by the device receiving the firmware. + +A supporting node SHOULD reboot and apply the new firmware image before issuing this command. + +A node MUST NOT issue Firmware Update Meta Data Get Command after receiving a Firmware Update Meta Data Status Report. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD STATUS REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | + +Status (8 bits) + +[This field MUST comply with Table 11.](04.18-firmware-update-meta-data-command-class-version-5.md#4186-firmware-update-meta-data-status-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 65 of 220 + +## 4.14.8 Examples + +[Figure 3 shows a controlling node requesting the Manufacturer ID and Firmware ID of another node by](04.14-firmware-update-meta-data-command-class-version-1-deprecated.md#4148-examples) issuing the Firmware Meta Data Get Command. + +![Figure 3, Requesting Manufacturer ID and Firmware ID of a node](assets/img-b3a995113e.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 66 of 220 [Figure 4 outlines the actual firmware update message flow. Prior to the firmware update, the](04.14-firmware-update-meta-data-command-class-version-1-deprecated.md#4148-examples) supporting node may receive an out-of-band authentication (e.g. physical activation of a pushbutton). The controller sends a Firmware Meta Data Request Get Command to initiate the downloading a new firmware image. The supporting node returns a Firmware Meta Data Request Report Command report to confirm the update request and the supporting node begins pulling firmware image fragments from the controller. Finally a Firmware Update Meta Data Status Report is returned to the controller to indicate the success (or failure) of the update process. + +![Figure 4, Transferring a firmware image to a device](assets/img-75c2215cbb.png) diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.15-firmware-update-meta-data-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.15-firmware-update-meta-data-command-class-version-2.md new file mode 100644 index 0000000..6ffc1a7 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.15-firmware-update-meta-data-command-class-version-2.md @@ -0,0 +1,74 @@ + +# 4.15 Firmware Update Meta Data Command Class, version 2 + +Firmware Update Meta Data Command Class, version 2 updates the Firmware Update Meta Data Report Command. + +While support for version 1 has been deprecated, a controlling device implementing Firmware Update Meta Data Command Class, version 2 MUST also be able to control Firmware Update Meta Data Command Class, version 1 based devices. + +## 4.15.1 Compatibility considerations + +A node supporting Firmware Update Meta Data Command Class, version 2 MUST also support Firmware Update Meta Data Command Class, version 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 67 of 220 All commands and fields not described in this version remain unchanged from version 1. + +## 4.15.2 Interoperability considerations + +### 4.15.2.1 Interoperability with v1 devices + +Version 2 of the Firmware Update Meta Data Report command introduces a 16-bit Checksum field to follow the variable-length Data field. No fields follow the variable-length Data field in Version 1 of the Firmware Update Meta Data Report command. + +At the same time, the specified method for determining the length of the variable-length Data field is that the length must be calculated from the length of the received frame. + +The unintended consequence is that a version 1 implementation receiving a Firmware Update Meta Data Report v2 command will consider the 16-bit Checksum field to be the last two bytes of the Data field. Similarly, a version 2 implementation receiving a Firmware Update Meta Data Report v1 command will consider the last two bytes of the Data field to be the 16-bit Checksum field. In either case, the transfer will fail. + +Therefore, a controlling device implementing the Firmware Update Meta Data Command Class, version 2 MUST do the following when initiating the transfer of a firmware image: + +1. Request the version of the Firmware Update Meta Data Command Class from the target device 2. Use the version of the Firmware Update Meta Data Report implemented by the target device 3. Determine the number of Data bytes that can fit into the Firmware Update Meta Data Report command so that the complete command can still fit into the payload field of the transport frame. The number of available payload bytes in the frame depends on the actual bit rate, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report. + +The controller SHOULD accept any binary image format and transfer that without any modifications. The image may be encrypted or carry checksums. + +### 4.15.2.2 Checksum calculation + +Version 1 of the Firmware Update Meta Data Command Class introduced a 16-bit Checksum field used to verify firmware image integrity. It has been a recommendation to use the CRC-CCITT polynomial for calculating checksums. Nodes having implemented another method for calculating the checksum will find a non-matching checksum. + +From Version 5 onwards, the checksum calculation method is mandatory. For more details about the [checksum calculation, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 68 of 220 + +## 4.15.3 Firmware Update Meta Data Report Command + +The Firmware Update Meta Data Report command is used to transfer a firmware image fragment. + +If sending more than a single Firmware Update Meta Data Report Command at a time, a node MUST apply a delay between each transmitted command. The minimum required time delay and number of frames before a delay must be inserted depends on the actual bit rate. + + 40 kbit/s: At least 35 ms if sending more than 1 frame back-to-back  100 kbit/s: At least 15 ms if sending more than 2 frames back-to-back + +If needed, a controlling node SHOULD abort an ongoing transfer by responding to a Firmware Update Meta Data Get Command with a Firmware Update Meta Data Report Command with the Last bit enabled and the Data fields intentionally corrupted while the Checksum field of the Firmware Update Meta Data Report Command is valid, i.e. calculated over the corrupted Data fields. This will invalidate the calculated firmware checksum, which should eventually cause the receiving device to return a Firmware Update Meta Data Status Report Command with the status code . + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REPORT _ _ _ | | | | | | | | +| Last | Report number 1 | | | | | | | +| Report number 2 | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | + +All fields not described below remain unchanged from version 1. + +Checksum (16 bits) + +The checksum field MUST be used to ensure the consistency of the entire command; including the command class and command identifiers. It is RECOMMENDED to use a checksum algorithm that implements the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +[The Checksum field is known to cause compatibility issues with version 1 devices. Refer to 4.15.1.](04.15-firmware-update-meta-data-command-class-version-2.md#4151-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 69 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.16-firmware-update-meta-data-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.16-firmware-update-meta-data-command-class-version-3.md new file mode 100644 index 0000000..5817e8f --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.16-firmware-update-meta-data-command-class-version-3.md @@ -0,0 +1,333 @@ + +# 4.16 Firmware Update Meta Data Command Class, version 3 + +The Firmware Update Meta Data Command Class, version 3 allows a Z-Wave enabled device to receive one out of several firmware images. + +As an example, one may construct a product comprising a Z-Wave chip and a secondary host processor that maintains a security certificate. With the capability to handle multiple firmware images enables the Z-Wave chip, the host processor and the security certificate may all be updated via individual firmware IDs. + +## 4.16.1 Compatibility considerations + +A device implementing Firmware Update Meta Data Command Class, version 3 MUST also implement Firmware Update Meta Data Command Class, version 2. While support for version 1 has been deprecated, a controlling device implementing Firmware Update Meta Data Command Class, version 2 MUST also be able to control Firmware Update Meta Data Command Class, version 1 based devices. + +All commands and fields not described in this version remain unchanged from version 2. + +Note that the minimum granted firmware size that can be transferred using Firmware Update Meta Data Report command is around 900 kB. + +### 4.16.1.1 New fields and values + +The Firmware Update Command Class, Version 3, introduces WaitTime parameter and a new Status code 0xFE for the Firmware Update Meta Data Status Report Command. + +The status code 0xFE is intended for confirming the successful transfer of images which do not necessitate a restart, e.g. security certificates. If this code was returned to a controller implementing a previous version, the controller would report that an error had occurred. Therefore, a supporting node MUST NOT return this code after having updated the firmware image for the Z-Wave chip image, i.e. the Firmware ID 0 target. + +## 4.16.2 Interoperability considerations + +Unintended modification of a firmware image SHOULD be prevented. It is RECOMMENDED that firmware update is enabled by out-of-band authentication (e.g. physical activation of a pushbutton). + +A checksum MUST be appended to the Firmware 0 image to ensure the integrity of the image. A CC:007A.03.00.32.002 receiving device SHOULD verify the integrity of the received Firmware 0 image by matching the received Firmware 0 image checksum and the Firmware 0 image checksum that is indicated by the Firmware Meta Data Report when the firmware update is initiated. + +Any image transferred via the Firmware Update Meta Data Command Class SHOULD include a fingerprint value for validation of the integrity of the entire image after the transfer. The image and the fingerprint value MUST be packed in one entity which can be stored in one file and transferred as one entity. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 70 of 220 A manufacturer MUST assign a unique Firmware ID to each existing product variant. A product variant may be a particular hardware version for a particular world region. The combination of Manufacturer ID and Firmware ID provides unique identification of a firmware image that is guaranteed to work with a particular component of a particular product. + +### 4.16.2.1 Interoperability with v1 devices + +Version 2 of the Firmware Update Meta Data Report command introduces a 16-bit Checksum field to follow the variable-length Data field. No fields follow the variable-length Data field in Version 1 of the Firmware Update Meta Data Report command. Version 3 of the Firmware Update Meta Data Report command uses the v2 format. + +At the same time, the specified method for determining the length of the variable-length Data field is that the length must be calculated from the length of the received frame. + +The unintended consequence is that a version 1 implementation receiving a Firmware Update Meta Data Report v2 command will consider the 16-bit Checksum field to be the last two bytes of the Data field. Similarly, a version 2 implementation receiving a Firmware Update Meta Data Report v1 command will consider the last two bytes of the Data field to be the 16-bit Checksum field. In either case, the transfer will fail. + +Therefore, a node controlling the Firmware Update Meta Data Command Class, version 3 MUST do the following when initiating the transfer of a firmware image: + +1. Request the version of the Firmware Update Meta Data Command Class from the target device 2. Use the version of the Firmware Update Meta Data Report implemented by the target device 3. Determine the number of Data bytes that can fit into the Firmware Update Meta Data Report command so that the complete command can still fit into the payload field of the transport frame. The number of available payload bytes in the frame depends on the actual bit rate, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report + +### 4.16.2.2 Checksum calculation + +Version 1 of the Firmware Update Meta Data Command Class introduced a 16-bit Checksum field used to verify firmware image integrity. It has been a recommendation to use the CRC-CCITT polynomial for calculating checksums. Nodes having implemented another method for calculating the checksum will find a non-matching checksum. + +From Version 5 onwards, the checksum calculation method is mandatory. + +[For more details about the checksum calculation, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 71 of 220 + +## 4.16.3 Firmware Meta Data Report Command + +This command is used to advertise the status of the current firmware in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE MD REPORT _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware 0 ID 1 | | | | | | | | +| Firmware 0 ID 2 | | | | | | | | +| Firmware 0 Checksum 1 | | | | | | | | +| Firmware 0 Checksum 2 | | | | | | | | +| Firmware Upgradable | | | | | | | | +| Number of Firmware Targets | | | | | | | | +| Max Fragment Size 1 | | | | | | | | +| Max Fragment Size 2 | | | | | | | | +| Firmware 1 ID 1 | | | | | | | | +| Firmware 1 ID 2 | | | | | | | | +| … | | | | | | | | +| Firmware N ID 1 | | | | | | | | +| Firmware N ID 2 | | | | | | | | + +Fields not described below remain unchanged from version 2 + +Firmware 0 ID (16 bits) + +The Firmware 0 ID field is dedicated to target 0, i.e. the Z-Wave chip. + +A manufacturer MUST assign a unique Firmware ID to each existing product variant. A product variant may be a particular hardware version for a particular world region. The combination of Manufacturer ID and Firmware ID provides unique identification of a firmware image that is guaranteed to work with a particular component of a particular product. + +The first byte MUST be the most significant byte. + +A user may request Manufacturer Specific information to get more detailed information on the product. + +A controlling node SHOULD match the advertised firmware ID for the existing firmware image to the firmware ID provided for a new image. If the firmware IDs do not match, the controlling device SHOULD abort the firmware update operation. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 72 of 220 Firmware 0 Checksum (16 bits) + +The checksum field is used to ensure consistency of the Firmware 0 image currently in the device. + +Supporting nodes MAY set this field to 0x00. In this case the field is unused. Values in the range 0x0001..0xFFFF indicate that the supporting node advertises the checksum of its firmware image. + +The first byte MUST be the most significant byte. + +It is RECOMMENDED to use a checksum algorithm that implements a CRC-CCITT polynomial using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +Firmware Upgradable (8 bits) + +This field defines whether the Z-Wave chip is firmware upgradable. + +The value 0x00 MUST indicate that the firmware 0 image is not upgradable. The value 0xFF MUST indicate that the firmware 0 image is upgradable. + +Number of Firmware Targets (8 bits) + +The Number of Firmware Targets field MUST report the number of firmware IDs following this field. + +The Firmware 0 ID field is not included. The field MUST be zero if the device only implements a Firmware 0 target, i.e. the Z-Wave chip. + +Max Fragment Size (16 bits) + +The Max Fragment Size field MUST report the maximum number of Data bytes that a device is able to receive at a time. A sending node MAY send shorter fragments. The fragment size actually used is indicated in the Firmware Update Meta Data Request Get Command and confirmed in the Firmware Update Meta Data Request Report Command. + +The Max Fragment Size may be longer than the supported frame length of Z-Wave if the image is to be transferred over e.g. IP. If the image is to be transferred over Z-Wave, the sending node MUST use a fragment size which matches the actual number of available Data bytes. The number of available Data bytes depends on the actual bit rate, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report. + +Firmware n ID (16 bits) + +The Firmware 1 ID field indicates the Firmware ID that MUST be used for target 1. The Firmware 2 ID field represents target 2. And so on. + +The first byte MUST be the most significant byte. + +A controlling device SHOULD match the advertised firmware ID for the existing firmware image to the firmware ID provided for a new image. If the firmware IDs do not match, the controlling device SHOULD abort the firmware update operation. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 73 of 220 + +## 4.16.4 Firmware Update Meta Data Request Get Command + +The Firmware Update Meta Data Request Get Command is used to request that a firmware update is initiated by the node receiving this command. + +The Firmware Update Meta Data Request Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +The firmware update MUST NOT be initiated if the Manufacturer ID and the Firmware ID do not match the actual firmware image values for the specified Firmware Target. The firmware update MUST be aborted if the checksum does not match the calculated checksum after the firmware image has been transferred. + +It is RECOMMENDED that firmware update is enabled by out-of-band authentication (e.g. physical activation of a pushbutton) prior to the transmission of this command. + +Any image transferred via the Firmware Update Meta Data Command Class SHOULD include a fingerprint value to enable the validation of the integrity of the entire image after the transfer. The image and the fingerprint value MUST be packed in one entity which can be stored in one file and transferred as one entity. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST GET _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Fragment Size 1 | | | | | | | | +| Fragment Size 2 | | | | | | | | + +All fields not described below remain unchanged from version 2. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 74 of 220 Firmware ID (16 bits) + +The Firmware ID MUST match the specified target of the actual device. + +The firmware update MUST NOT be initiated if the Firmware ID does not match the specified target of the actual device. + +The first byte MUST be the most significant byte. + +Firmware Target (8 bits) + +This field MUST be used to identify the firmware image to be updated. The firmware images MUST be identified as follows: + +| Firmware Target | Description | +| --- | --- | +| 0x00 | Firmware image targeted for the Z-Wave chip. | +| 0x01 | Firmware image intended for target 1 defined by the manufacturer. | +| … | | +| 0xFF | Firmware image intended for target 255 defined by the manufacturer. | + +Fragment Size (16 bits) + +The Fragment Size field MUST report the fragment size that is to be used for firmware fragments. A receiving device MUST use this fragment size for the firmware update. The fragment size is not exchanged during the actual firmware update. The Fragment Size MUST NOT exceed the Max Fragment Size value of the Firmware Meta Data Report. + +A version 1 Firmware Update Meta Data Request Get Command does not carry a Fragment Size field. A CC:007A.03.03.11.00D receiving node MUST determine the number of Data bytes from the length of the first received frame, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report. + +## 4.16.5 Firmware Update Meta Data Request Report Command + +This command is used to advertise if the firmware update will be initiated. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | + +Status (8 bits) + +[This field MUST comply with Table 15.](04.19-firmware-update-meta-data-command-class-version-6.md#4193-firmware-update-meta-data-request-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 75 of 220 + +## 4.16.6 Firmware Update Meta Data Get Command + +The Firmware Update Meta Data Get Command is used to request one or more Firmware Update Meta Data Report Commands. + +One or more Firmware Update Meta Data Report Commands MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +A node MUST verify the Manufacturer ID and Firmware ID fields received in a Firmware Update Meta Data Request Get Command before sending any Firmware Update Meta Data Get Commands. A controlling node receiving a Firmware Update Meta Data Get Command MUST return fragments of the firmware image that was previously identified by the Manufacturer ID and Firmware ID fields received in a Firmware Update Meta Data Request Get Command. + +The transmission of the next Firmware Update Meta Data Get Command MAY be delayed if time is required to store the most recent firmware fragment in temporary non-volatile memory. A node MAY CC:007A.03.05.13.001 CC:007A.03.05.13.002 request multiple Firmware Update Meta Data Report Commands to improve throughput. + +RAM may be a limited resource. A node MAY adjust the size of incoming Firmware Update Meta Data Report Commands to the available first level RAM receive buffer by reporting the desired Max Fragment Size when returning a Firmware Meta Data Report Command in response to a Firmware Update Meta Data Get Command. + +Two exceptions may apply: A noise burst may interfere the transmission or the data source may stop returning Firmware Update Meta Data Report Commands. + +To accommodate for bursts of RF noise, a device receiving data SHOULD repeatedly retransmit the same Firmware Update Meta Data Get Command every 10 seconds in case no Firmware Update Meta Data Report Commands are received. A device receiving data SHOULD stop retransmitting Firmware Update Meta Data Get commands 2 minutes after the last successful reception of a Firmware Update Meta Data Report Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD GET _ _ _ | | | | | | | | +| Number of Reports | | | | | | | | +| Res | Report Number 1 | | | | | | | +| Report Number 2 | | | | | | | | + +Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 76 of 220 Number of Reports (8 bits) + +Number of Firmware Update Meta Data Report Commands to be received in response to a single Firmware Update Meta Data Get Command. + +The requesting node MUST keep track of missing Firmware Update Meta Data Report Commands. + +Report Number (15 bits) + +The Report number field indicates the sequence number of the requested firmware fragment. The first CC:007A.03.05.11.008 firmware fragment MUST be identified by the Report Number value 1. + +Report number 1 MUST be the most significant byte. + +If the Number of Reports field is larger than 1, the Report Number MUST identify the first firmware fragment in the requested sequence of firmware fragments. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 77 of 220 + +## 4.16.7 Firmware Update Meta Data Report Command + +The Firmware Update Meta Data Report command is used to transfer a firmware image fragment. + +If sending more than a single Firmware Update Meta Data Report Command at a time, a node MUST apply a delay between each transmitted command. The minimum required time delay and number of frames before a delay must be inserted depends on the actual bit rate. + + 40 kbit/s: At least 35 ms if sending more than 1 frame back-to-back + + 100 kbit/s: At least 15 ms if sending more than 2 frames back-to-back + +After receiving all Firmware Update Meta Data Report Commands required for a complete firmware image, a receiving node MUST store the firmware image in the Firmware Target specified in a previously received Firmware Update Meta Data Request Get Command. + +If needed, a controlling node SHOULD abort an ongoing transfer by responding to a Firmware Update Meta Data Get Command with a Firmware Update Meta Data Report Command with the Last bit enabled and the Data fields intentionally corrupted while the Checksum field of the Firmware Update Meta Data Report Command is valid, i.e. calculated over the corrupted Data fields. This will invalidate the calculated firmware checksum, which should eventually cause the receiving device to return a Firmware Update Meta Data Status Report Command with the status code . + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REPORT _ _ _ | | | | | | | | +| Last | Report number 1 | | | | | | | +| Report number 2 | | | | | | | | +| Data 1 | | | | | | | | +| … | | | | | | | | +| Data N | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | + +All fields not described below remain unchanged from version 2. + +Last (1 bit) + +This field indicates if the Firmware Update Meta Data Report Command is the last one. + +The value 1 MUST indicate that this is the last report. Otherwise the field MUST be set to 0. + +On the reception of the last image fragment, the receiving node MUST verify that the transferred image does match the indicated Manufacturer ID, Firmware ID and Firmware Target values. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 78 of 220 Checksum (16 bits) + +The checksum field MUST be used to ensure the consistency of the entire command; including the command class and command identifiers. It is RECOMMENDED to use a checksum algorithm that implements the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +The checksum algorithm used for the Firmware Update Meta Data Command Class, version 3 MUST be the same as the algorithm used for the Firmware Update Meta Data Command Class, version 2 in the actual product. + +[The Checksum field is known to cause compatibility issues with version 1 devices. Refer to 4.15.1.](04.15-firmware-update-meta-data-command-class-version-2.md#4151-compatibility-considerations) + +## 4.16.8 Firmware Update Meta Data Status Report Command + +This command is used to advertise the firmware update status. + +The command MUST be issued when the firmware update is completed or aborted by the device receiving the firmware. + +A node MUST NOT issue the Firmware Update Meta Data Get Command after receiving a Firmware Update Meta Data Status Report. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD STATUS REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | +| WaitTime MSB | | | | | | | | +| WaitTime LSB | | | | | | | | + +Status (8 bits) + +[This field MUST comply with Table 11.](04.18-firmware-update-meta-data-command-class-version-5.md#4186-firmware-update-meta-data-status-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 79 of 220 The status code 0xFE MAY be used for confirming the successful transfer of images which do not necessitate a restart, e.g. security certificates. + +The status code 0xFE MUST NOT be advertised after the transfer of an image for the Firmware ID 0 target (the “Z-Wave chip” image). + +Controlling nodes implementing earlier versions of the Firmware Update Meta Data CC do not support status codes defined for newer versions. Therefore, a node returning the Firmware Update Meta Data Status Report Command MUST comply with the version implemented on the controlling device (device sending the image). The device returning the Firmware Update Meta Data Status Report can identify the version of the controlling device based on the Firmware Update Meta Data Request Get. This may be done as follows: + +If the Firmware Update Meta Data Request Get does not include Firmware Target and - Fragment Size (8 bytes), the controller is version 1 or 2 - If the Firmware Update Meta Data Request Get includes Firmware Target and Fragment Size but not Activation (11 bytes), the controller is version 3 + +WaitTime (16 bits) + +The WaitTime field MUST report the time that is needed before the receiving node again becomes available for communication after the transfer of an image. The unit is the second. + +The value 0 (zero) MUST indicate that the node is ready (it SHOULD have rebooted if needed and applied the Firmware Image). The value 0xFFFF is reserved and MUST NOT be returned. + +A controlling node receiving this command SHOULD wait for the number of seconds specified in this field before trying to resume communication. When resuming communication, the controlling application SHOULD issue a NOP command and wait for acknowledgement. The controlling application MAY attempt resuming communication repeatedly. In that case, the NOP interval SHOULD be five seconds and MUST be at least one second. CC:007A.03.07.11.008 + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 80 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.17-firmware-update-meta-data-command-class-version-4.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.17-firmware-update-meta-data-command-class-version-4.md new file mode 100644 index 0000000..cb2912c --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.17-firmware-update-meta-data-command-class-version-4.md @@ -0,0 +1,162 @@ + +# 4.17 Firmware Update Meta Data Command Class, version 4 + +The Firmware Update Meta Data Command Class may be used to transfer a firmware image to a Z-Wave device. + +## 4.17.1 Compatibility considerations + +All commands and fields not described in this version remain unchanged from version 3. + +A device implementing Firmware Update Meta Data Command Class, version 4 MUST also implement Firmware Update Meta Data Command Class, versions 3. While support for version 1 has been deprecated, a controlling device implementing Firmware Update Meta Data Command Class, version 2 MUST also be able to control Firmware Update Meta Data Command Class, version 1 based devices. + +### 4.17.1.1 New commands, fields and values + +The Firmware Update Meta Data Command Class version 4 supports delaying and scheduling a firmware update after downloading the image. + +Version 4 updates the Firmware Update Meta Data Request Get Command and introduces the following commands: + + New Firmware Update Activation Set Command  New Firmware Update Activation Status Report + +After downloading an image, a device may use the Firmware Update Meta Data Status Report Command to indicate to the controlling device that the device is waiting for an activation command. + +## 4.17.2 Interoperability considerations + +### 4.17.2.1 Interoperability with v1 devices + +Version 2 of the Firmware Update Meta Data Report command introduces a 16-bit Checksum field to follow the variable-length Data field. No fields follow the variable-length Data field in Version 1 of the Firmware Update Meta Data Report command. Version 4 of the Firmware Update Meta Data Report command uses the v2 format. + +At the same time, the specified method for determining the length of the variable-length Data field is that the length must be calculated from the length of the received frame. + +The unintended consequence is that a version 1 implementation receiving a Firmware Update Meta Data Report v2 command will consider the 16-bit Checksum field to be the last two bytes of the Data field. Similarly, a version 2 implementation receiving a Firmware Update Meta Data Report v1 command will consider the last two bytes of the Data field to be the 16-bit Checksum field. In either case, the transfer will fail. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 81 of 220 Therefore, a controlling device implementing the Firmware Update Meta Data Command Class, version 2 MUST do the following when initiating the transfer of a firmware image: + +1. Request the version of the Firmware Update Meta Data Command Class from the target device 2. Use the version of the Firmware Update Meta Data Report implemented by the target device 3. Determine the number of Data bytes that can fit into the Firmware Update Meta Data Report command so that the complete command can still fit into the payload field of the transport frame. The number of available payload bytes in the frame depends on the actual bit rate, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report + +### 4.17.2.2 Checksum calculation + +Version 1 of the Firmware Update Meta Data Command Class introduced a 16-bit Checksum field used to verify firmware image integrity. It has been a recommendation to use the CRC-CCITT polynomial for calculating checksums. Nodes having implemented another method for calculating the checksum will find a non-matching checksum. + +From Version 5 onwards, the checksum calculation method is mandatory. + +[For more details about the checksum calculation, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 82 of 220 + +## 4.17.3 Firmware Update Meta Data Request Get Command + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST GET _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Fragment Size 1 | | | | | | | | +| Fragment Size 2 | | | | | | | | +| Reserved | | | | | | | Activation | + +All fields not described below remain unchanged from version 3. + +Activation (1 bit) + +The Activation field is used to advertise if the receiving node may delay the actual firmware update. + +The field MUST be interpreted as: + +’1’: The receiving device MAY delay the actual firmware update. - If the receiving node delays the firmware update, the delay MUST be advertised via the Status code 0xFD in the Firmware Update Meta data Status Report Command. - ’0’: The receiving device MUST NOT delay the firmware update. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 83 of 220 + +## 4.17.4 Firmware Update Meta Data Status Report Command + +This command is used to advertise the firmware update status. + +The command MUST be issued when the firmware update is completed or aborted by the device receiving the firmware. + +A node MUST NOT issue the Firmware Update Meta Data Get Command after receiving a Firmware Update Meta Data Status Report. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD STATUS REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | +| WaitTime MSB | | | | | | | | +| WaitTime LSB | | | | | | | | + +All fields not described below remain unchanged from version 3. + +Status (8 bits) + +[This field MUST comply with Table 11.](04.18-firmware-update-meta-data-command-class-version-5.md#4186-firmware-update-meta-data-status-report-command) + +The status code 0xFD MAY be used by a version 4 device for confirming that an image has been successfully transferred but that the actual firmware update will not be performed until a Firmware Update Activation Set Command is received. The Firmware Update Activation Set Command MAY be delayed for any period of time. The delay may be controlled via the Schedule Command Class. + +The status code 0xFE MAY be used for confirming the successful transfer of an image which does not necessitate a restart, e.g. security a certificate. The status code 0xFE MUST NOT be advertised after the transfer of an image for the Firmware ID 0 target (the “Z-Wave chip” image). + +Controlling nodes implementing earlier versions of the Firmware Update Meta Data CC do not support status codes defined for newer versions. Therefore, a node returning the Firmware Update Meta Data Status Report Command MUST comply with the version implemented on the controlling device (device sending the image). The device returning the Firmware Update Meta Data Status Report can identify the version of the controlling device based on the Firmware Update Meta Data Request Get. This may be done as follows: + +If the Firmware Update Meta Data Request Get does not include Firmware Target and - Fragment Size (8 bytes), the controller is version 1 or 2 - If the Firmware Update Meta Data Request Get includes Firmware Target and Fragment Size but not Activation (11 bytes), the controller is version 3 If the Firmware Update Meta Data Request Get includes Activation (12 bytes), the controller is - version 4 + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 84 of 220 + +## 4.17.5 Firmware Update Activation Set Command + +This command is used to initiate the programming of a previously transferred firmware image. Refer to the Firmware Update Meta Data Status Report Command Status code 0xFD. + +This command MAY be issued directly by a controlling node or MAY be scheduled for later execution via the Schedule Command Class. + +The Firmware Update Activation Status Report Command MUST be returned in response to this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE ACTIVATION SET _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | + +For fields’ description, refer to the Firmware Update Meta Data Request Get Command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 85 of 220 + +## 4.17.6 Firmware Update Activation Status Report + +This command is used to advertise the result of a firmware update operation initiated by the Firmware Update Activation Set Command. + +The Firmware Update Activation Status Report fields MUST reflect the values specified in the Firmware Update Activation Set Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE ACTIVATION STATUS REPORT _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Firmware Update Status | | | | | | | | + +For fields not described below, refer to the Firmware Update Meta Data Request Get Command. + +Firmware Update Status (8 bits) + +[This field MUST comply with Table 12.](04.18-firmware-update-meta-data-command-class-version-5.md#4188-firmware-update-activation-status-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 86 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.18-firmware-update-meta-data-command-class-version-5.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.18-firmware-update-meta-data-command-class-version-5.md new file mode 100644 index 0000000..8b6f16a --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.18-firmware-update-meta-data-command-class-version-5.md @@ -0,0 +1,405 @@ + +# 4.18 Firmware Update Meta Data Command Class, version 5 + +The Firmware Update Meta Data Command Class may be used to transfer a firmware image to or from a Z-Wave node. + +## 4.18.1 Compatibility considerations + +A device implementing Firmware Update Meta Data Command Class, version 5 MUST also implement Firmware Update Meta Data Command Class, version 4. + +Firmware Update Meta Data Command Class, version 5 is backwards compatible with Firmware Update Meta Data Command Class, version 4. + +All commands and fields not mentioned in this version remain unchanged from version 4. + +### 4.18.1.1 New commands, fields and values + +The Firmware Update Meta Data Command Class, version 5 introduces the support of a hardware identifier to uniquely identify firmware images that can be loaded on devices. This allows devices running identical software version on different hardware revisions to receive the correct firmware image. + +The following commands are extended from version 4: + + Firmware Meta Data Report Command  Firmware Update Meta Data Request Get Command  Firmware Update Meta Data Request Report Command  Firmware Update Meta Data Status Report Command  Firmware Update Activation Set Command  Firmware Update Activation Status Report Command + +The Firmware Update Meta Data Command Class, version 5 also introduces the support firmware download from the Z-Wave node to the controller. + +The following commands are introduced: + + Firmware Update Meta Data Prepare Get Command  Firmware Update Meta Data Prepare Report Command + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 87 of 220 + +## 4.18.2 Interoperability Considerations + +### 4.18.2.1 Interoperability with v1 devices + +Version 2 of the Firmware Update Meta Data Report command introduces a 16-bit Checksum field to follow the variable-length Data field. No fields follow the variable-length Data field in Version 1 of the Firmware Update Meta Data Report command. Version 5 of the Firmware Update Meta Data Report command uses the version 2 format. + +At the same time, the specified method for determining the length of the variable-length Data field is that the length must be calculated from the length of the received frame. + +The unintended consequence is that a version 1 implementation receiving a Firmware Update Meta Data Report version 2 Command will consider the 16-bit Checksum field to be the last two bytes of the Data field. Similarly, a version 2 implementation receiving a Firmware Update Meta Data Report version 1 Command will consider the last two bytes of the Data field to be the 16-bit Checksum field. In either case, the transfer will fail. + +Therefore, a controlling device implementing the Firmware Update Meta Data Command Class, version 2 MUST do the following when initiating the transfer of a firmware image: + +1. Request the version of the Firmware Update Meta Data Command Class from the target device 2. Use the version of the Firmware Update Meta Data Report implemented by the target device 3. Determine the number of Data bytes that can fit into the Firmware Update Meta Data Report command so that the complete command can still fit into the payload field of the transport frame. The number of available payload bytes in the frame depends on the actual bit rate, the use of security encapsulation as well as the presence of Checksum bytes in the Firmware Update Meta Data Report + +### 4.18.2.2 Checksum calculation + +Version 1 of the Firmware Update Meta Data Command Class introduced a 16-bit Checksum field used to verify firmware image integrity. It has been a recommendation to use the CRC-CCITT polynomial for calculating checksums. There is no way to identify what method has been used for calculating the checksum for nodes implementing version 1 to version 4. Nodes having implemented another method for calculating the checksum will find a non-matching checksum. + +From Version 5 onwards, the checksum calculation method is mandatory. + +[For more details about the checksum calculation, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 88 of 220 + +## 4.18.3 Firmware Meta Data Report Command + +This command is used to advertise the status of the current firmware in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE MD REPORT _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware 0 ID 1 | | | | | | | | +| Firmware 0 ID 2 | | | | | | | | +| Firmware 0 Checksum 1 | | | | | | | | +| Firmware 0 Checksum 2 | | | | | | | | +| Firmware Upgradable | | | | | | | | +| Number of Firmware Targets | | | | | | | | +| Max Fragment Size 1 | | | | | | | | +| Max Fragment Size 2 | | | | | | | | +| Firmware 1 ID 1 | | | | | | | | +| Firmware 1 ID 2 | | | | | | | | +| … | | | | | | | | +| Firmware N ID 1 | | | | | | | | +| Firmware N ID 2 | | | | | | | | +| Hardware Version | | | | | | | | + +All fields not described below remain unchanged from version 4. + +Firmware 0 Checksum (16 bits) + +The checksum field is used to carry the checksum of the Firmware 0 Image. + +Supporting nodes MAY set this field to 0x00. In this case the field is unused. Values in the range 0x0001..0xFFFF indicate that the supporting node MUST advertise the checksum of its firmware 0 image. + +The checksum MUST be calculated using the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +[For more details, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 89 of 220 Hardware Version (8 bits) + +This field MUST report a value which is unique to this particular version of the product. It MUST be possible to uniquely identify applicable firmware images via the Manufacturer ID, Firmware ID and the Hardware Version fields. This information allows selecting a firmware image that is guaranteed to work with this particular version of the product. + +The Hardware Version field MUST apply to the entire product and not only to the version of the Z-Wave radio chip. + +This field MUST report the same value as the Version CC Version Report Command: Hardware Version field. + +## 4.18.4 Firmware Update Meta Data Request Get Command + +This command is used to request that a firmware update is initiated by the node receiving this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST GET _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Firmware Checksum 1 | | | | | | | | +| Firmware Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Fragment Size 1 | | | | | | | | +| Fragment Size 2 | | | | | | | | +| Reserved | | | | | | | Activation | +| Hardware Version | | | | | | | | + +All fields not described below remain unchanged from version 4. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 90 of 220 Firmware Checksum (16 bits) + +The checksum field MUST carry the checksum of the firmware image about to be transferred. + +The checksum MUST be calculated using the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +[For more details, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Hardware Version (8 bits) + +[Refer to 4.18.3 Firmware Meta Data Report Command.](04.18-firmware-update-meta-data-command-class-version-5.md#4183-firmware-meta-data-report-command) + +## 4.18.5 Firmware Update Meta Data Request Report Command + +This command is used to advertise if the firmware update will be initiated. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | + +Status (8 bits) + +[This field MUST comply with Table 15.](04.19-firmware-update-meta-data-command-class-version-6.md#4193-firmware-update-meta-data-request-report-command) + +## 4.18.6 Firmware Update Meta Data Status Report Command + +This command is used to advertise the firmware update status. + +The command MUST be issued when the firmware update is completed or aborted by the device receiving the firmware. + +A device MUST NOT issue the Firmware Update Meta Data Get Command after receiving a Firmware Update Meta Data Status Report. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD STATUS REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | +| WaitTime MSB | | | | | | | | +| WaitTime LSB | | | | | | | | + +All fields not described below are the same as in version 4. + +Status (8 bits) + +[This field MUST comply with Table 11.](04.18-firmware-update-meta-data-command-class-version-5.md#4186-firmware-update-meta-data-status-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 91 of 220 The status code 0xFD MAY be used by a version 4 device for confirming that an image has been successfully transferred but that the actual firmware update will not be performed until a Firmware Update Activation Set Command is received. The Firmware Update Activation Set Command MAY be delayed for any period of time. The delay may be controlled via the Schedule Command Class. + +The status code 0xFE MAY be used for confirming the successful transfer of an image which does not necessitate a restart, e.g. security a certificate. The status code 0xFE MUST NOT be advertised after the transfer of an image for the Firmware ID 0 target (the “Z-Wave chip” image). + +Controlling nodes implementing earlier versions of the Firmware Update Meta Data CC do not support status codes defined for newer versions. Therefore, a device returning the Firmware Update Meta Data Status Report Command MUST comply with the version implemented on the controlling device (device sending the image). The device returning the Firmware Update Meta Data Status Report can identify the version of the controlling device based on the Firmware Update Meta Data Request Get. This may be done as follows: + +If the Firmware Update Meta Data Request Get does not include Firmware Target and - Fragment Size (8 bytes), the controller is version 1 or 2 If the Firmware Update Meta Data Request Get includes Firmware Target and Fragment Size - but not Activation (11 bytes), the controller is version 3 If the Firmware Update Meta Data Request Get includes Activation but not Hardware Version - (12 bytes), the controller is version 4 If the Firmware Update Meta Data Request Get includes Hardware Version (13 bytes), the - controller is version 5. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 92 of 220 Table 11, Firmware Update Meta Data Status Report::Status encoding + +| Status | Description | Version | +| --- | --- | --- | +| 0x00 | The device was unable to receive the requested firmware data without checksum error. Number of retries and request sequence of missing frames are implementation specific. The image is not stored. | 1 | +| 0x01 | The device was unable to receive the requested firmware data. Number of retries and request sequence of missing frames are implementation specific. The image is not stored. | 1 | +| 0x02 | The transferred image does not match the Manufacturer ID. The image is not stored. | 4 | +| 0x03 | The transferred image does not match the Firmware ID. The image is not stored. | 4 | +| 0x04 | The transferred image does not match the Firmware Target. The image is not stored. | 4 | +| 0x05 | Invalid file header information. The image is not stored. | 4 | +| 0x06 | Invalid file header format. The image is not stored. | 4 | +| 0x07 | Insufficient memory. The image is not stored. | 4 | +| 0x08 | The transferred image does not match the Hardware version The image is not stored | 5 | +| … | Reserved | - | +| 0xFD | Firmware image downloaded successfully, waiting for activation command. | 4 | +| 0xFE | New image was successfully stored in temporary non-volatile memory. The device does not restart itself. This Status code MUST NOT be used when updating the Z-Wave chip image | 3 | +| 0xFF | New image was successfully stored in temporary non-volatile memory and/or applied successfully. The supporting node MAY restart itself. In this case, version 3 or newer supporting nodes SHOULD use the WaitTime to indicate that reboot has not been performed yet. | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 93 of 220 + +## 4.18.7 Firmware Update Activation Set Command + +This command is used to initiate the programming of a previously transferred firmware image. Refer to the Firmware Update Meta Data Status Report Command Status code 0xFD. + +This command MAY be issued directly by a controlling node or MAY be scheduled for later execution via the Schedule Command Class. + +The Firmware Update Activation Status Report Command MUST be returned in response to this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE ACTIVATION SET _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Firmware Checksum 1 | | | | | | | | +| Firmware Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Hardware Version | | | | | | | | + +All fields not described below remain unchanged from version 4. + +Firmware Checksum (16 bits) + +The checksum field MUST carry the checksum of the firmware image about to be activated. + +The checksum MUST be calculated using the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +[For more details, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Hardware Version (8 bits) + +[Refer to 4.18.3 Firmware Meta Data Report Command.](04.18-firmware-update-meta-data-command-class-version-5.md#4183-firmware-meta-data-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 94 of 220 + +## 4.18.8 Firmware Update Activation Status Report Command + +This command is used to advertise the result of a firmware update operation initiated by the Firmware Update Activation Set Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE ACTIVATION STATUS REPORT _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Firmware Checksum 1 | | | | | | | | +| Firmware Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Firmware Update Status | | | | | | | | +| Hardware Version | | | | | | | | + +All fields not described below remain unchanged from version 4. + +Firmware Checksum (16 bits) + +The checksum field MUST carry the checksum of the firmware image activated by the Firmware Update Activation Set Command. + +The checksum MUST be calculated using the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +[For more details, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Hardware Version (8 bits) + +[Refer to 4.18.3 Firmware Meta Data Report Command.](04.18-firmware-update-meta-data-command-class-version-5.md#4183-firmware-meta-data-report-command) + +Firmware Update Status (8 bits) + +[The Firmware Update Status field MUST comply with Table 12.](04.18-firmware-update-meta-data-command-class-version-5.md#4188-firmware-update-activation-status-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 95 of 220 Table 12, Firmware Update Activation Status Report::Firmware Update Status encoding + +| Status | Description | Version | +| --- | --- | --- | +| 0x00 | Invalid combination of manufacturer ID, firmware ID and Hardware Version or Firmware Target. The received image will not be stored. | 4 | +| 0x01 | Error activating the firmware. Last known firmware image has been restored. | 4 | +| … | Reserved | - | +| 0xFF | Firmware update completed successfully. | 4 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 96 of 220 + +## 4.18.9 Firmware Update Meta Data Prepare Get Command + +This command is used to request that a firmware download is initiated by the node sending this command. + +The Firmware Update Meta Data Prepare Report Command MUST be returned in response to this command when the receiving node is ready to send the requested firmware image. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +Any image transferred via the Firmware Update Meta Data Command Class SHOULD include a fingerprint value to enable the validation of the integrity of the entire image after the transfer. The image and the fingerprint value MUST be packed in one entity which can be stored in one file and transferred as one entity. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD PREPARE GET _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Fragment Size 1 | | | | | | | | +| Fragment Size 2 | | | | | | | | +| Hardware Version | | | | | | | | + +[Refer to 4.18.4 Firmware Update Meta Data Request Get Command for field description.](04.18-firmware-update-meta-data-command-class-version-5.md#4184-firmware-update-meta-data-request-get-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 97 of 220 + +## 4.18.10 Firmware Update Meta Data Prepare Report Command + +This command is used to advertise if the firmware image has been prepared and is ready to be transferred. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD PREPARE REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | +| Firmware Checksum 1 | | | | | | | | +| Firmware Checksum 2 | | | | | | | | + +Status (8 bits) + +[The Status field MUST comply with Table 13.](04.18-firmware-update-meta-data-command-class-version-5.md#41810-firmware-update-meta-data-prepare-report-command) + +Table 13, Firmware Update Meta Data Prepare Report::Status encoding + +| Status | Description | Version | +| --- | --- | --- | +| 0x00 | ERROR. Invalid combination of Manufacturer ID and Firmware ID. The receiving node MUST NOT initiate the firmware download. | 5 | +| 0x01 | ERROR. Device expected an authentication event to enable firmware update. The receiving node MUST NOT initiate the firmware download. | 5 | +| 0x02 | ERROR. The requested Fragment Size exceeds the Max Fragment Size. The receiving node MUST NOT initiate the firmware download. | 5 | +| 0x03 | ERROR. This firmware target is not downloadable. The receiving node MUST NOT initiate the firmware download. | 5 | +| 0x04 | ERROR. Invalid Hardware Version. The receiving node MUST NOT initiate the firmware download. | 5 | +| 0xFF | OK. The receiving node can initiate the firmware download of the target specified in the Firmware Update Meta Data Prepare Get Command. | 5 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be CC:007A.05.0B.11.002 ignored by a receiving node. + +Firmware Checksum (16 bits) + +The checksum field MUST carry the checksum of the firmware image about to be transferred. + +The checksum field value SHOULD be 0x00 if the Status field is set to a different value than 0xFF. + +The checksum MUST be calculated using the CRC-CCITT polynomium using initialization value equal to 0x1D0F and 0x1021 (normal representation). + +[For more details, refer to Appendix B](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 98 of 220 + +## 4.18.11 Examples + +### 4.18.11.1 Identifying firmware revisions + +The different fields Manufacturer ID, Firmware ID and Hardware version are used to identify compatible firmware image with the product. + +The Version Command Class is also used for identifying the Firmware version/subversion + +[An example of the different fields’ usage for a wall outlet is shown in Table 14](04.18-firmware-update-meta-data-command-class-version-5.md#418111-identifying-firmware-revisions) + +Table 14, Labelling different Firmware revisions + +| Product | Firmware identification | | | | +| --- | --- | --- | --- | --- | +| | Manufacturer ID | Hardware Version | Firmware ID | Firmware version /sub-version | +| Initial Wall Outlet | 0x0001 | 0x01 | 0x0001 | 0x01 / 0x01 | +| New revision | | | | | +| Fixing previous bugs | 0x0001 | 0x01 | 0x0001 | 0x01 / 0x02 | +| New revision | | | | | +| Introducing new features (e.g. multiple press) | 0x0001 | 0x01 | 0x0001 | 0x02 / 0x01 | +| New revision | | | | | +| US version (initial version) | 0x0001 | 0x01 | 0x0001 | 0x02 / 0x01 | +| China version (matching local requirements) | 0x0001 | 0x01 | 0x0002 | 0x02 / 0x01 | +| New revision | | | | | +| Proximity Sensor added (US) | 0x0001 | 0x02 | 0x0001 | 0x02 / 0x01 | +| Proximity Sensor added (China) | 0x0001 | 0x02 | 0x0002 | 0x02 / 0x01 | +| New revision | | | | | +| Adding S2 Capability (without proximity sensor, US) | 0x0001 | 0x01 | 0x0001 | 0x03 / 0x01 | +| Adding S2 Capability (without proximity sensor, China) | 0x0001 | 0x01 | 0x0002 | 0x03 / 0x01 | +| Adding S2 Capability (with proximity sensor, US) | 0x0001 | 0x02 | 0x0001 | 0x03 / 0x01 | +| Adding S2 Capability (with proximity sensor, US) | 0x0001 | 0x02 | 0x0002 | 0x03 / 0x01 | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 99 of 220 [An illustration of a controller retrieving the firmware information is given in Figure 5](04.18-firmware-update-meta-data-command-class-version-5.md#418111-identifying-firmware-revisions) + +![Figure 5, Identifying compatible firmware images](assets/img-a1d7c27be6.png) + +### 4.18.11.2 Firmware download + +The use of the Firmware Update Meta Data Prepare Get and Firmware Update Meta Data Prepare [Report commands is illustrated in Figure 6.](04.18-firmware-update-meta-data-command-class-version-5.md#418112-firmware-download) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 100 of 220 + +![Figure 6, Firmware download flow diagram](assets/img-d93c722ca1.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 101 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.19-firmware-update-meta-data-command-class-version-6.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.19-firmware-update-meta-data-command-class-version-6.md new file mode 100644 index 0000000..b82841c --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.19-firmware-update-meta-data-command-class-version-6.md @@ -0,0 +1,91 @@ + +# 4.19 Firmware Update Meta Data Command Class, version 6 + +The Firmware Update Meta Data Command Class may be used to transfer a firmware image to or from a Z-Wave node. + +## 4.19.1 Compatibility considerations + +[This version introduces new status codes for firmware update request responses in the Firmware Meta Data Report Command and Firmware Update Meta Data Request Report Command. It also allows a](04.19-firmware-update-meta-data-command-class-version-6.md#4192-firmware-meta-data-report-command) supporting node to advertise whether the application functionalities will be available during a Firmware Update or not. + +Firmware Update Meta Data Command Class, version 6 is backwards compatible with Firmware Update Meta Data Command Class, version 5. + +All commands and fields not mentioned in this version MUST remain unchanged from version 5. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 102 of 220 + +## 4.19.2 Firmware Meta Data Report Command + +This command is used to advertise the status of the current firmware in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | | +| Command = FIRMWARE MD REPORT _ _ | | | | | | | | | +| Manufacturer ID 1 | | | | | | | | | +| Manufacturer ID 2 | | | | | | | | | +| Firmware 0 ID 1 | | | | | | | | | +| Firmware 0 ID 2 | | | | | | | | | +| Firmware 0 Checksum 1 | | | | | | | | | +| Firmware 0 Checksum 2 | | | | | | | | | +| Firmware Upgradable | | | | | | | | | +| Number of Firmware Targets | | | | | | | | | +| Max Fragment Size 1 | | | | | | | | | +| Max Fragment Size 2 | | | | | | | | | +| Firmware 1 ID 1 | | | | | | | | | +| Firmware 1 ID 2 | | | | | | | | | +| … | | | | | | | | | +| Firmware N ID 1 | | | | | | | | | +| Firmware N ID 2 | | | | | | | | | +| Hardware Version | | | | | | | | | +| Reserved | | | | | | | | CC | + +All fields not described below remain unchanged from version 5. + +CC (1 bits) + +This field is used to advertise if the supporting node’s Command Classes functionality will continue to function normally during Firmware Update transfer. + +If all other Command Classes functionalities will function normally during firmware update image transfer, this field MUST be set to 1. + +If any Command Class functionality will not function normally during firmware update image transfer, this field MUST be set to 0. + +For example, if a node is unable to issue Notification Reports during firmware update, this field MUST be set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 103 of 220 + +## 4.19.3 Firmware Update Meta Data Request Report Command + +This command is used to advertise if the firmware update will be initiated. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST REPORT _ _ _ _ | | | | | | | | +| Status | | | | | | | | + +Status (8 bits) + +[This field MUST comply with Table 15.](04.19-firmware-update-meta-data-command-class-version-6.md#4193-firmware-update-meta-data-request-report-command) + +Table 15, Firmware Update Meta Data Request Report::Status encoding + +| Status | Description | Version | +| --- | --- | --- | +| 0x00 | ERROR. Invalid combination of Manufacturer ID and Firmware ID. The device will not initiate the firmware update. | 1 | +| 0x01 | ERROR. Device expected an authentication event to enable firmware update. The device will not initiate the firmware update. | 1 | +| 0x02 | ERROR. The requested Fragment Size exceeds the Max Fragment Size. The device will not initiate the firmware update. | 3 | +| 0x03 | ERROR. This firmware target is not upgradable. The device will not initiate the firmware update. | 3 | +| 0x04 | ERROR. Invalid Hardware Version. The device will not initiate the firmware update. | 5 | +| 0x05 | ERROR: Another firmware image is current being transferred. The device will not initiate the firmware update. | 6 | +| 0x06 | ERROR: Insufficient battery level The device will not initiate the firmware update. | 6 | +| 0xFF | OK. The device will initiate the firmware update of the target specified in the Firmware Update Meta Data Request Get Command. | 1 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 104 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.20-firmware-update-meta-data-command-class-version-7.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.20-firmware-update-meta-data-command-class-version-7.md new file mode 100644 index 0000000..69b531b --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.20-firmware-update-meta-data-command-class-version-7.md @@ -0,0 +1,90 @@ + +# 4.20 Firmware Update Meta Data Command Class, version 7 + +The Firmware Update Meta Data Command Class may be used to transfer a firmware image to or from a Z-Wave node. + +## 4.20.1 Compatibility considerations + +This version introduces the ability to advertise if subsequent firmware activation is supported or not by a node. + +Firmware Update Meta Data Command Class, version 7 is backwards compatible with Firmware Update Meta Data Command Class, version 6. + +All commands and fields not mentioned in this version MUST remain unchanged from version 6. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 105 of 220 + +## 4.20.2 Firmware Meta Data Report Command + +This command is used to advertise the status of the current firmware in the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE MD REPORT _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware 0 ID 1 | | | | | | | | +| Firmware 0 ID 2 | | | | | | | | +| Firmware 0 Checksum 1 | | | | | | | | +| Firmware 0 Checksum 2 | | | | | | | | +| Firmware Upgradable | | | | | | | | +| Number of Firmware Targets | | | | | | | | +| Max Fragment Size 1 | | | | | | | | +| Max Fragment Size 2 | | | | | | | | +| Firmware 1 ID 1 | | | | | | | | +| Firmware 1 ID 2 | | | | | | | | +| … | | | | | | | | +| Firmware N ID 1 | | | | | | | | +| Firmware N ID 2 | | | | | | | | +| Hardware Version | | | | | | | | +| Reserved | | | | | | Activation | CC | + +All fields not described below remain unchanged from version 6. + +Activation (1 bits) + +This field is used to advertise if the supporting node supports subsequent activation after Firmware Update transfer. + +If the sending node supports the subsequent activation of firmware after downloading, this field MUST be set to 1. + +If the sending node does not support the subsequent activation of firmware after downloading, this field MUST be set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 106 of 220 + +## 4.20.3 Firmware Update Meta Data Request Get Command + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS FIRMWARE UPDATE MD _ _ _ _ | | | | | | | | +| Command = FIRMWARE UPDATE MD REQUEST GET _ _ _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Firmware ID 1 | | | | | | | | +| Firmware ID 2 | | | | | | | | +| Checksum 1 | | | | | | | | +| Checksum 2 | | | | | | | | +| Firmware Target | | | | | | | | +| Fragment Size 1 | | | | | | | | +| Fragment Size 2 | | | | | | | | +| Reserved | | | | | | | Activation | +| Hardware Version | | | | | | | | + +All fields not described below remain unchanged from version 3. + +Activation (1 bit) + +The Activation field is used to advertise if the receiving node must delay the actual firmware activation after the file transfer. + +[A node advertising no support for “activation” in the Firmware Meta Data Report Command MUST](04.20-firmware-update-meta-data-command-class-version-7.md#4202-firmware-meta-data-report-command) ignore this field and activate the Firmware immediately after download. + +[If the receiving node advertises support for Activation in the Firmware Meta Data Report Command:](04.20-firmware-update-meta-data-command-class-version-7.md#4202-firmware-meta-data-report-command) + +The value ’1’ MUST indicate to delay the actual firmware update. - When delaying the firmware activation, the supporting node MUST set the Status code field to 0xFD in the Firmware Update Meta data Status Report Command. The value ’0’ MUST indicate that the receiving device MUST NOT delay the firmware update - and activate the firmware immediately after download. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 107 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.21-grouping-name-command-class-version-1-deprecated.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.21-grouping-name-command-class-version-1-deprecated.md new file mode 100644 index 0000000..4ddd32c --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.21-grouping-name-command-class-version-1-deprecated.md @@ -0,0 +1,108 @@ + +# 4.21 Grouping Name Command Class, version 1 [DEPRECATED] + +THIS COMMAND CLASS HAS BEEN DEPRECATED + +A device MAY implement this command class, but it is RECOMMENDED that new implementations use the Association Group Information (AGI) Command Class for naming association groups. If implementing this command class, it is RECOMMENDED that the Association Group Information (AGI) Command Class is also implemented. + +The Grouping Name Command Class is used to transfer name of groupings (as defined by the grouping identifier in the Association Command Class). + +## 4.21.1 Grouping Name Set Command + +The Grouping Name Set Command used to set a grouping Identifier name. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GROUPING NAME _ _ _ | | | | | | | | +| Command = GROUPING NAME SET _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Reserved | | | | | Char. Presentation | | | +| Grouping Name 1 | | | | | | | | +| … | | | | | | | | +| Grouping Name N | | | | | | | | + +Grouping Identifier (8 bits) + +The field specifies the Grouping ID. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 108 of 220 Char. Presentation (3 bits) + +The char presentation identifier MAY be set to the following values: + +| Char. Presentation | Description | +| --- | --- | +| 0 | Using standard ASCII codes, see appendices in [2] (values 128-255 are ignored) | +| 1 | Using standard and OEM Extended ASCII codes, see appendices in [2] | +| 2 | Unicode UTF-16 | + +Note: Devices supporting Unicode UTF-16 characters can have strings of a maximum of 8 characters because each character is described by a 2 byte long decimal representation. The first byte is the most significant byte. I.e. if there is one Unicode character in the set frame the char 1 will be MSB and char 2 will be LSB of the Unicode character. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Grouping Name (N bytes) + +Grouping name using specified character representation. + +The Grouping name MAY have a maximum of 16 characters and a minimum of 0 characters. The number of character fields transmitted MUST be determined from the frame length. If a frame with more than 16 characters is received, the receiving node MUST ignore any characters following the 16 th character. + +## 4.21.2 Grouping Name Get Command + +The Grouping Name Get Command is used to request a grouping Identifier name. + +The Grouping Name Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GROUPING NAME _ _ _ | | | | | | | | +| Command = GROUPING NAME GET _ _ | | | | | | | | +| Grouping identifier | | | | | | | | + +Grouping Identifier (8 bits) + +The field specifies the grouping identifier. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 109 of 220 + +## 4.21.3 Group Name Report Command + +The Grouping Name Report Command is used to report the grouping Identifier name. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS GROUPING NAME _ _ _ | | | | | | | | +| Command = GROUPING NAME REPORT _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Reserved | | | | | Char. Presentation | | | +| Grouping Name 1 | | | | | | | | +| … | | | | | | | | +| Grouping Name N | | | | | | | | + +Grouping Identifier (8 bits) + +The field specifies the grouping identifier. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Char. Presentation (3 bits) + +Refer to description under the Grouping Name Set Command + +Grouping Name (N bytes) + +The Grouping Name fields contain the assigned group name. The Group Name can have a maximum of 16 characters and a minimum of 0 characters. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 110 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.22-hail-command-class-version-1-obsoleted.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.22-hail-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..37b7eb5 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.22-hail-command-class-version-1-obsoleted.md @@ -0,0 +1,25 @@ + +# 4.22 Hail Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST report local state updates via the Lifeline Association Group or use [dedicated Command Classes for application specific purposes. Refer to [10]](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +The Hail Command Class used by applications to hail other devices in the Z-Wave network. The usage of the Hail Command Class is application specific. + +## 4.22.1 Hail Command + +Application can send unsolicited Hail Command to other devices in a Z-Wave network. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS HAIL _ _ | | | | | | | | +| Command = HAIL | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 111 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.23-indicator-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.23-indicator-command-class-version-1.md new file mode 100644 index 0000000..4565557 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.23-indicator-command-class-version-1.md @@ -0,0 +1,77 @@ + +# 4.23 Indicator Command Class, version 1 + +The Indicator Command Class is used to help end users to monitor the operation or condition of the application provided by a supporting node. + +## 4.23.1 Interoperability considerations + +Version 1 supporting nodes implement a single indicator resource. The indicator resource can only be turned on or off. + +Nodes supporting the Wake-Up Command Class SHOULD keep the indicator in the same state (On/Off) as last instructed by an Indicator Set Command. + +## 4.23.2 Indicator Set Command + +This command is used to enable or disable the indicator resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR SET (0x01) _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +This field is used to enable or disable the indicator resource. + +This field MUST be in the range 0x00..0x63 or 0xFF. + +The value 0x00 MUST indicate that the indicator MUST be turned off/disabled. + +Values in the range 0x01..0x63 MUST indicate that the indicator MUST be turned on/enabled. + +The value 0xFF MUST indicate that the indicator MUST be turned on/enabled. + +## 4.23.3 Indicator Get Command + +This command is used to request the state of the indicator resource. + +[The Indicator Report Command MUST be returned in response to this command.](04.23-indicator-command-class-version-1.md#4234-indicator-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR GET (0x02) _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 112 of 220 + +## 4.23.4 Indicator Report Command + +This command is used to advertise the current state of the indicator resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR REPORT (0x03) _ | | | | | | | | +| Value | | | | | | | | + +Value (8 bits) + +This field is used to advertise the current state of the indicator resource. This field MUST be in the range 0x00..0x63 or set to 0xFF. + +The value 0x00 MUST indicate that the indicator is turned off/disabled. + +Values in the range 0x01..0x63 MUST indicate that the indicator is turned on/enabled. + +The value 0xFF MUST indicate that the indicator is turned on/enabled. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 113 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.24-indicator-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.24-indicator-command-class-version-2.md new file mode 100644 index 0000000..7a30a1b --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.24-indicator-command-class-version-2.md @@ -0,0 +1,263 @@ + +# 4.24 Indicator Command Class, version 2 + +The Indicator Command Class, version 2 is used to manipulate indicator resources in a supporting node. An indicator may be an LED, an LCD display or a buzzer. + +## 4.24.1 Compatibility Considerations + +The Indicator Command Class, version 1 provides a single unspecified indicator resource. Version 2 introduces support for multiple indicator resources. Each indicator resource may implement a number of properties (or capabilities) such as turning on/off, set on a specific level or toggling state. + +[A controlling node may discover the supported indicators ID and their property IDs via the Indicator Supported Report Command.](04.24-indicator-command-class-version-2.md#4247-indicator-supported-report-command) + +The Indicator Command Class, version 2 renames the Value field of version 1 to “Indicator 0 Value”. The Indicator 0 Value field properties are unspecified as in version 1. + +A version 2 supporting node MUST map the Indicator 0 to one of its supported Indicator ID and Property ID. The Indicator 0 SHOULD be mapped to an indicator 0x01 (Multilevel) or 0x02 (Binary) Property ID. + +A supporting node advertising no support for the “Low power” indication Property ID and supporting the Wake Up Command Class MUST keep awake as long as one of the property ID is not 0x00 (off) for the actual Indicator ID. Such a node MUST return to sleep after both the Wake Up No More Information Command is received and all Property IDs are back to 0x00 for the actual Indicator ID. + +A supporting node advertising support for the “Low power” indication Property ID and supporting the Wake Up Command Class MAY return to sleep even if an indication is ongoing for the actual Indicator ID. + +## 4.24.2 Interoperability considerations + +A supporting device MAY use its indicator resources for local status reporting. + +After receiving an Indicator Set Command, a supporting node MUST NOT use its indicator resources for local status reporting until it has completed the operation requested by the Set Command. + +An exception to this MAY be interface feedback functionality like a short beep on each button press. Likewise, transmission failure to a controlling node MAY be advertised via the use of local indications. + +As an example, an entry control keypad device may feature an LCD backlight. If the backlight is advertised as an indicator resource, a central control application also has to control the backlight of the keypad, e.g. in response to local user activity and to temporarily draw attention to all keypads when an alarm is enabled. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 114 of 220 + +## 4.24.3 Indicator Set Command + +This command is used to manipulate one or more indicator resources at a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR SET (0x01) _ | | | | | | | | +| Indicator 0 Value (Indicator ID 0 = 0x00, Property ID 0 = 0x01) | | | | | | | | +| Reserved | | | Indicator Object Count | | | | | +| Indicator ID 1 | | | | | | | | +| Property ID 1 | | | | | | | | +| Value 1 | | | | | | | | +| … | | | | | | | | +| Indicator ID N | | | | | | | | +| Property ID N | | | | | | | | +| Value N | | | | | | | | + +Indicator 0 Value (8 bits) + +This field provides backwards compatibility for version 1 supporting nodes. + +A receiving node MUST ignore this field if the Indicator Object Count field is not set to 0. + +A receiving node MUST map this value to a supported indicator resource if the Indicator Object Count field is set to 0 or not included in the command. + +[Refer to 4.24.1 Compatibility Considerations.](04.24-indicator-command-class-version-2.md#4241-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. + +Indicator Object Count (5 bits) + +This field is used to advertise the number of indicator objects carried in the actual command. An indicator object MUST comprise an Indicator ID, a Property ID and a Value field. + +Indicator ID (8 bits, N times) + +[This field is used to identify the actual indicator resource. Indicator IDs values are defined in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +A receiving node MUST ignore the entire indicator object if an unsupported Indicator ID is specified. + +A receiving node MUST NOT ignore other indicator objects included in the command if an unsupported Indicator ID is specified. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 115 of 220 Property ID (8 bits, N times) + +This field is used to identify the specific property of the indicator resource identified by the corresponding Indicator ID field. + +A receiving node MUST ignore the entire indicator object if an unsupported Property ID for the corresponding Indicator ID is specified. The receiving node MUST NOT ignore other indicator objects included in the command. + +If an indicator ID is specified in an object but not all Property ID s are included in the command, a supporting node MUST assume non-specified Property IDs values to be set to 0x00. + +[If several Property IDs not belonging to the same Property group defined in [21] are specified in the](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) command, the Property IDs from one Property group MUST be applied and all other Property IDs MUST be ignored. For example, if Multilevel and Binary property IDs are defined, only one Property ID value MUST be applied and the other MUST be ignored. + +Properties marked as “ADVERTISE ONLY:” MUST be ignored if received in a controlling command. + +Value (8 bits, N times) + +This field is used to specify the value to assign to the specific indicator property identified by the Indicator ID and the Property ID fields. + +[This field MUST be set according to the defined values and requirements for Property IDs in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +## 4.24.4 Indicator Get Command + +This command is used to request the state of an indicator. + +The Indicator Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR GET (0x02) _ | | | | | | | | +| Indicator ID | | | | | | | | + +Indicator ID (8 bits) + +This field is used to specify the actual indicator resource. + +If an unsupported Indicator ID is specified in this command, a receiving node MUST return an indicator object with the specified Indicator ID and the Property ID and Value fields set to 0x00. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 116 of 220 + +## 4.24.5 Indicator Report Command + +This command is used to advertise the state of an indicator resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR REPORT (0x03) _ | | | | | | | | +| Indicator 0 Value (Indicator ID 0 = 0x00, Property ID 0 = 0x01) | | | | | | | | +| Reserved | | | Indicator Object Count | | | | | +| Indicator ID 1 | | | | | | | | +| Property ID 1 | | | | | | | | +| Value 1 | | | | | | | | +| … | | | | | | | | +| Indicator ID N | | | | | | | | +| Property ID N | | | | | | | | +| Value N | | | | | | | | + +Indicator 0 Value (8 bits) + +This field provides backwards compatibility for version 1 controlling nodes. + +A sending node MUST advertise the current value of the mapped Indicator ID and Property ID. + +A version 2 controlling node MUST ignore the Indicator 0 Value field if other values are advertised. [Refer to 4.24.1 Compatibility Considerations..](04.24-indicator-command-class-version-2.md#4241-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending device and MUST be ignored by a receiving device. + +Indicator Object Count (5 bits) + +This field is used to advertise the number of indicator objects carried in this command. An indicator object MUST comprise an Indicator ID, a Property ID and a Value field. + +Indicator ID (N bytes) + +This field is used to identify the actual indicator resource. + +All indicator objects MUST carry the same Indicator ID. + +Property ID (N bytes) + +This field is used to identify the specific property of the indicator resource identified by the corresponding Indicator ID field. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 117 of 220 If not all Property IDs are included in the command for the actual Indicator ID, a controlling node MUST assume non-specified Property IDs values to be 0x00. + +Value (N bytes) + +This field is used to specify the current value of the specific indicator property identified by the Indicator ID and the Property ID fields. + +[This field MUST be set according to the defined values for Property IDs in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +## 4.24.6 Indicator Supported Get Command + +This command is used to request the supported properties of an indicator. + +[The Indicator Supported Report Command MUST be returned in response to this command.](04.24-indicator-command-class-version-2.md#4247-indicator-supported-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR SUPPORTED GET (0x04) _ _ | | | | | | | | +| Indicator ID | | | | | | | | + +Indicator ID (1 byte) + +This field is used to specify the actual indicator resource. + +A controlling node SHOULD set this field to zero to discover the supported Indicator IDs. A supporting node receiving this field set to 0x00 MUST advertise the first supported Indicator ID in response. + +A supporting node receiving a non-zero Indicator ID that is not supported MUST set all fields (Indicator ID, Next Indicator ID, Property Supported Bit Mask Length) to 0x00 in the returned response. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 118 of 220 + +## 4.24.7 Indicator Supported Report Command + +This command is used to advertise the supported properties for a given indicator. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR SUPPORTED REPORT (0x05) _ _ | | | | | | | | +| Indicator ID | | | | | | | | +| Next Indicator ID | | | | | | | | +| Reserved | | | Property Supported Bit Mask Length | | | | | +| Property Supported Bit Mask 1 | | | | | | | | +| ... | | | | | | | | +| Property Supported Bit Mask N | | | | | | | | + +Indicator ID (1 byte) + +This field is used to specify the actual indicator ID resource for the supported properties are being advertised. + +[The supported Indicator IDs MUST be according to the Indicator IDs values defined in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Next Indicator ID (8 bits) + +This field is used to advertise if more Indicator IDs are supported after the actual Indicator ID advertised by the Indicator ID field. + +If a sending node supports additional Indicator IDs, this field MUST advertise the next supported Indicator ID. + +If the sending node does not support additional Indicator IDs this field MUST be set to 0x00. + +[The supported Indicator IDs MUST be according to the Indicator IDs values defined in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Property Supported Bit Mask Length (5 bits) + +This field is used to advertise the length of the Property Supported Bit Mask field in bytes. + +The value MUST be in the range 0..32. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 119 of 220 Property Supported Bit Mask (N bytes) + +This field is used to advertise the properties supported by the actual Indicator ID. + +The length of this field in bytes MUST be according to the Property Supported Bit Mask Length field value. This field MUST be encoded as a bitmask as follow: + + Bit 0 in Bit Mask 1 is not allocated to any property and MUST be set to zero. + + Bit 1 in Bit Mask 1 MUST indicate if Property ID = 1 (Multilevel) is supported. + + Bit 2 in Bit Mask 1 MUST indicate if Property ID = 2 (On/Off) is supported. + + … + +If the Property ID is supported, the corresponding bit MUST be set to 1. + +If the Property ID is not supported the corresponding bit MUST be set to 0. + +[The supported Property IDs MUST be according to the Property IDs values defined in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 120 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.25-indicator-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.25-indicator-command-class-version-3.md new file mode 100644 index 0000000..1bd6b35 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.25-indicator-command-class-version-3.md @@ -0,0 +1,20 @@ + +# 4.25 Indicator Command Class, version 3 + +The Indicator Command Class, version 3 is used to manipulate indicator resources in a supporting node. An indicator may be an LED, an LCD display or a buzzer. + +## 4.25.1 Compatibility Considerations + +The Indicator Command Class, version 3 is backwards compatible with the Indicator Command Class, version 2. All commands and fields not mentioned in this version MUST remain unchanged from the Indicator Command Class, version 2. + +This version introduces new Indicator IDs and Property IDs. The list of supported Indicator IDs and [Property IDs is moved to [21]. Values not defined in [21] are reserved and MUST NOT be used by a](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) supporting node. + +[New values MAY be added to [21] and will be labelled under version 3.](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 121 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.26-indicator-command-class-version-4.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.26-indicator-command-class-version-4.md new file mode 100644 index 0000000..748f460 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.26-indicator-command-class-version-4.md @@ -0,0 +1,82 @@ + +# 4.26 Indicator Command Class, version 4 + +## 4.26.1 Compatibility Considerations + +The Indicator Command Class, version 4 is backwards compatible with the Indicator Command Class, version 3. All commands and fields not mentioned in this version MUST remain unchanged from the Indicator Command Class, version 3. + +This version introduces 2 new commands used to request the detailed information, appearance and use of manufacturer defined Indicator IDs. + + [Indicator Description Get Command](04.26-indicator-command-class-version-4.md#4262-indicator-description-get-command)  [Indicator Description Report Command](04.26-indicator-command-class-version-4.md#4263-indicator-description-report-command) + +Supporting nodes supporting Indicator IDs in the range 0x80..0x9F (manufacturer defined indicators) MUST have a description available that can be requested via the version 4 commands. + +Indicator IDs in the range 0x80..0x9F that are supported by a node MUST NOT replace or be achievable [by any combination of Indicator IDs defined in [21].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +## 4.26.2 Indicator Description Get Command + +This command is used to request a detailed description of the appearance and use of an Indicator ID + +[The Indicator Description Report Command MUST be returned in response to this command.](04.26-indicator-command-class-version-4.md#4263-indicator-description-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR DESCRIPTION GET (0x06) _ _ | | | | | | | | +| Indicator ID | | | | | | | | + +Indicator ID (8 bits) + +This field is used to specify the actual indicator resource. + +A supporting node MUST return a report for the Indicator ID value specified in this field. + +This field MUST be in the range 0x80..0x9F. + +A supporting node receiving this command for an Indicator ID outside the 0x80..0x9F range MUST return an Indicator Description Report with the Description Length set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 122 of 220 + +## 4.26.3 Indicator Description Report Command + +This command is used to advertise appearance and use of an indicator ID resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INDICATOR (0x87) _ _ | | | | | | | | +| Command = INDICATOR DESCRIPTION REPORT (0x07) _ _ | | | | | | | | +| Indicator ID | | | | | | | | +| Description Length | | | | | | | | +| Description 1 | | | | | | | | +| ... | | | | | | | | +| Description N | | | | | | | | + +Indicator ID (8 bits) + +This field is used to specify the actual indicator resource for which the description is being advertised. + +Description Length (1 byte) + +This field indicates the length in bytes of the Description field. + +The value 0 MUST indicate that no description is available for the Indicator ID. + +Description (N bytes) + +This field is used to advertise the appearance and use of the Indicator ID. + +[It MUST replace the “Appearance and use” column information from [21] for manufacturer defined](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) Indicator IDs. + +The length of this field in bytes MUST comply with the advertised value in the Description Length field. This field MUST be omitted if the Description Length field is set to 0. + +This field MUST be encoded in UTF-8 format. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 123 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.27-ip-association-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.27-ip-association-command-class-version-1.md new file mode 100644 index 0000000..3c3a196 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.27-ip-association-command-class-version-1.md @@ -0,0 +1,217 @@ + +# 4.27 IP Association Command Class, version 1 + +The IP Association Command Class is used to create and maintain Z-Wave application bindings between IPv6 hosts. An association group sends a predefined command to the configured destinations when triggered by an event. + +IP Association identifies nodes via IPv6 addresses. + +IP Association is natively Z-Wave Multi Channel End Point aware. + +IP Association groups are specific to a particular End Point or Root Device. + +## 4.27.1 Compatibility considerations + +The IP Association Command Class extends the functionality of the Z-Wave Multi Channel Association Command Class. Z-Wave nodes may be represented as Z/IP nodes in an IP subnet. IP Associations may be mapped to classic Z-Wave Multi Channel associations. + +The IP Association Remove Command extends the Multi Channel Association Remove Command by adding the ability to clear all groups in all End Points of a node. Only one IP association can be created or maintained with a single command. + +In order to respond quickly and to conserve battery, it is RECOMMENDED that a Z/IP Gateway caches IP associations and corresponding Z-Wave associations and only looks up all associations when explicitly instructed to do so. + +## 4.27.2 Terminology + +The IP Association Command Class operates on IP primitives but works for all generations of Z-Wave technology. In the following, the term “Classic Z-Wave” refers to operations that are possible with Z-Wave-only releases. + +The term “Z-Wave node” is used to identify a Z-Wave node as used in Classic Z-Wave while the term “Z/IP node” denotes an IP enabled Z-Wave node that implements the ICMP echo service and the Z-Wave UDP service. A Z/IP node may implement other IP services. Such IP services are out of scope of this document. + +An IP association is created by sending an IP Association Set command from a configuration tool to the association source, instructing the association source to add an association destination to an association group maintained in the association source. The association destination has no knowledge that an association is created. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 124 of 220 A Z/IP Gateway represents classic Z-Wave nodes as Z/IP nodes in an IP environment. The Z/IP Gateway therefore maps IP association commands from Z/IP clients to relevant Association and Multi Channel Association commands for Z-Wave nodes. + +![Figure 7, IP Association example](assets/img-02b3ab2b70.png) + +## 4.27.3 Z-Wave Multi Channel compatibility considerations + +IP Association is natively Multi Channel aware. The same message format is used to create an association to a logical End Point as to the Root Device. + +In the Z/IP framework, End Point 0 represents the physical entity. + +IP Associations are conceptually created between two Z/IP resources identified by an IPv6 address and an End Point. In case one or both parties are Z-Wave nodes represented as Z/IP nodes, the Z/IP Gateway MUST create Z-Wave associations in the following way, based on the Resource Directory information pertaining to the actual nodes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 125 of 220 [A Z/IP gateway MUST map IP associations to Z-Wave associations according to Table 16.](04.27-ip-association-command-class-version-1.md#4273-z-wave-multi-channel-compatibility-considerations) + +Table 16, IP association mapping to Z Wave association + +| Association source Multi Channel Capability | Association destination Multi Channel Capability | Association type | Creating the association | +| --- | --- | --- | --- | +| - | - | Root Device  Root Device | An Association Set Command MUST be sent un-encapsulated to the association source node | +|  |  | End Point m  End Point n m, n MAY be 0 | A Multi Channel Association Set Command MUST be sent Multi Channel encapsulated to the association source End Point. A Multi Channel Association from the Lifeline association group of a sensor Root Device enables the transmission of sensor reports with different Source End Points to the Lifeline destination. | +|  | - | End Point m  Root Device | An Association Set Command MUST be sent Multi Channel encapsulated to the association source End Point. | +| - |  | Root Device  End Point n | An Association Set Command MUST be sent un-encapsulated to the association source node. This first association MUST target a NodeID owned by the Z/IP Gateway. A second association MUST be created from the abovementioned Z/IP Gateway to the Multi Channel End Point specified in the IP Association Set Command. | + +## 4.27.4 Advertising the IP Association Command Class + +The Node Information Frame emitted by Classic Z-Wave nodes does not include IP Association. To allow IP clients to issue IP Association commands, the Z/IP Gateway MUST rewrite the list of supported command classes from the node, replacing the Association and Multi Channel Association Command Classes with the IP Association Command Class in the following situations: + + When a Node Info Cached Report is sent to an IP client. + + When a Node Add Status is being sent to an IP client. + +In both cases, rewriting MUST NOT be performed if the report is being sent to a native Z-Wave node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 126 of 220 Furthermore, mDNS responses to queries for nodes supporting the IP Association Command Class MUST also advertise nodes supporting the Association and Multi Channel Association Command Classes (but the command classes must be replaced with COMMAND_CLASS_IP_ASSOCIATION before advertised via mDNS). + +## 4.27.5 IP Association Set Command + +This command is used to add one resource to a given association group. + +The receiving IPv6 host SHOULD add the specified destination resource to the specified association group. This command MAY be ignored if the association group is already full. + +Unless the association destination is a gateway, a controlling node SHOULD NOT create an association if the association destination node does not support the controlling commands (Set/Get type) that the actual association group will be sending. The AGI Command Class SHOULD be used to probe the commands that a given association group will be sending. + +A controlling node SHOULD NOT create an association if the source and destination nodes are bootstrapped with different security levels. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP ASSOCIATION _ _ _ | | | | | | | | +| Command = IP ASSOCIATION SET _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| IPv6 Address 1 | | | | | | | | +| .. | | | | | | | | +| IPv6 Address 16 | | | | | | | | +| End Point | | | | | | | | + +Grouping identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +IPv6 Address (16 bytes) + +This field specifies the full IPv6 address for the association destination. The IPv6 address MUST NOT be compressed. The IPv6 address SHOULD be in the ULA IPv6 prefix or in a globally routable IPv6 prefix. The IPv6 address MAY be an IPv4-mapped IPv6 address. The field MUST NOT carry a link-local IPv6 address. + +End Point (8 bits) + +This field is used in combination with the IPv6 Address to identify the actual resource. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 127 of 220 The field represents the Z/IP Bit Address flag (bit 7) as well as the Z/IP 7-bit End Point identifier (bits 6..0). + +The receiving node MUST treat this field as one scalar value when adding or removing associations; i.e. any 8-bit End Point value causes one association to be added. + +## 4.27.6 IP Association Get Command + +This command is used to request active associations for a given association group.The IP Association Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP ASSOCIATION _ _ _ | | | | | | | | +| Command = IP ASSOCIATION GET _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Index | | | | | | | | + +Grouping identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +If an unsupported Grouping Identifier is specified, the IP Association Report Command returned in response to this command MUST carry IPv6 address and End Point fields which are set to all-zeros. + +Index (8 bits) + +This field is used to specify an entry in the association table for the group identified by the Grouping Identifier. + +A requesting host SHOULD start specifying the index value 1. The actual number of nodes in the association group may be determined from the Actual Nodes field of the IP Association Report. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 128 of 220 + +## 4.27.7 IP Association Report Command + +This command is used to advertise one association group entry. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP ASSOCIATION _ _ _ | | | | | | | | +| Command = IP ASSOCIATION REPORT _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| Index | | | | | | | | +| Actual Nodes | | | | | | | | +| IPv6 Address 1 | | | | | | | | +| .. | | | | | | | | +| IPv6 Address 16 | | | | | | | | +| End Point | | | | | | | | + +Grouping identifier (8 bits) + +This field is used to identify the actual group of nodes. + +Index (8 bits) + +This field is used to advertise the actual entry in the association group identified by the Grouping Identifier. + +Actual Nodes (8 bits) + +This value indicates the number of nodes in the association group advertised by the Grouping identifier field. + +IPv6 Address (16 bytes) + +This field carries a full IPv6 address with no compression. The address SHOULD be in the ULA IPv6 prefix or in a globally routable IPv6 prefix. The address MAY be an IPv4-mapped IPv6 address. The field MUST NOT carry a link-local IPv6 address. + +If the Actual Nodes value is zero, the IPv6 Address field MUST be all zeros. + +End Point (8 bits) + +This field is used in combination with the IPv6 Address to identify the actual resource + +If the Actual Nodes value is zero, the End Point field MUST be all zeros. + +The field represents the Z/IP Bit Address flag (bit 7) as well as the Z/IP 7-bit End Point identifier (bits 6..0). + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 129 of 220 + +## 4.27.8 IP Association Remove Command + +This command is used to remove one resource from a given association group. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP ASSOCIATION _ _ _ | | | | | | | | +| Command = IP ASSOCIATION REMOVE _ _ | | | | | | | | +| Grouping identifier | | | | | | | | +| IPv6 Address 1 | | | | | | | | +| .. | | | | | | | | +| IPv6 Address 16 | | | | | | | | +| End Point | | | | | | | | + +Grouping identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +A receiving node MUST ignore an unsupported Grouping Identifier. + +This field MUST be interpreted in combination with the IPv6 Address and End Point fields. + +IPv6 Address (16 bytes) End Point (1 byte) + +These fields specify the resources that are to be removed. The Grouping identifier and these fields MUST be interpreted as follows. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 130 of 220 Table 17, IP Association Remove, V1 :: Parameter interpretation + +| Command parameters | | | Removal operation | +| --- | --- | --- | --- | +| Grouping identifier | IPv6 Address | End Point ID | | +| > 0 | <> 0 | = 0 (Root Device) | Remove destination from association group in the association source Root Device | +| > 0 | <> 0 | > 0 (End Point) | Remove destination from association group in the specified association source End Point | +| > 0 | = 0 | = 0 (Root Device) | Remove all destinations from association group in the association source Root Device | +| > 0 | = 0 | > 0 (End Point) | Remove all destinations from association group in the specified association source End Point | +| = 0 | = 0 | = 0 (Root Device) | Remove all destinations from all association groups in the association source Root Device and in all association source End Points | +| = 0 | = 0 | > 0 (End Point) | Remove all destinations from all groups in the specified association source End Point | +| = 0 | <> 0 | >= 0 | Reserved | + +*) The End Point field represents the Z/IP Bit Address flag (bit 7) as well as the Z/IP 7-bit End Point identifier (bits 6..0). The receiving node MUST treat the End Point field as one scalar value when removing associations; i.e. any 8-bit End Point value causes one association to be removed. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 131 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.28-manufacturer-specific-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.28-manufacturer-specific-command-class-version-1.md new file mode 100644 index 0000000..158b080 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.28-manufacturer-specific-command-class-version-1.md @@ -0,0 +1,74 @@ + +# 4.28 Manufacturer Specific Command Class, version 1 + +The Manufacturer Specific Command Class is used to advertise manufacturer specific information. Version 2 of this command class further allows device specific information to be advertised. + +## 4.28.1 Security Considerations + +This Command Class provides information about the device implementation. This information can potentially be used by an attacker to find vulnerabilities. + +In order to increase interoperability with legacy controlling nodes, a node supporting the Security 0 [Command Class MUST reply to Manufacturer Specific Get Commands received non-securely if it was](04.28-manufacturer-specific-command-class-version-1.md#4282-manufacturer-specific-get-command) granted the S0 network key as its highest Security Class. + +In this case, it is OPTIONAL for the node to advertise the Manufacturer Specific Command Class in its NIF. + +## 4.28.2 Manufacturer Specific Get Command + +This command is used to request manufacturer specific information from another node. + +The Manufacturer Specific Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MANUFACTURER SPECIFIC _ _ _ | | | | | | | | +| Command = MANUFACTURER SPECIFIC GET _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 132 of 220 + +## 4.28.3 Manufacturer Specific Report Command + +This command is used to advertise manufacturer specific device information. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MANUFACTURER SPECIFIC _ _ _ | | | | | | | | +| Command = MANUFACTURER SPECIFIC REPORT _ _ | | | | | | | | +| Manufacturer ID 1 | | | | | | | | +| Manufacturer ID 2 | | | | | | | | +| Product Type ID 1 | | | | | | | | +| Product Type ID 2 | | | | | | | | +| Product ID 1 | | | | | | | | +| Product ID 2 | | | | | | | | + +Manufacturer ID (16 bits) + +The Manufacturer ID field MUST carry the unique ID identifying the manufacturer of the device. + +[Manufacturer identifiers can be found in [12].The first byte is the most significant byte.](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Product Type ID (16 bits) + +The Product Type ID field MUST carry a unique ID identifying the actual product type. + +The first byte is the most significant byte. + +A specific Product Type ID MUST be defined by the manufacturer for each type of product. + +Product ID (16 bits) + +The Product ID field MUST carry a unique ID identifying the actual product. + +The first byte is the most significant byte. + +A specific Product ID MUST be defined by the manufacturer for each product of a given product type. Thus, the same Product ID value may appear for different Product Type ID values. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 133 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.29-manufacturer-specific-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.29-manufacturer-specific-command-class-version-2.md new file mode 100644 index 0000000..b236042 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.29-manufacturer-specific-command-class-version-2.md @@ -0,0 +1,86 @@ + +# 4.29 Manufacturer Specific Command Class, version 2 + +Manufacturer Specific Command Class, version 2 adds a set of commands to communicate unique identification, e.g. the serial number, of the product. + +Commands not mentioned here remains unchanged as specified for Manufacturer Specific Command Class, Version 1. + +## 4.29.1 Security Considerations + +[A supporting node MUST comply with 4.28.1 Security Considerations](04.28-manufacturer-specific-command-class-version-1.md#4281-security-considerations) + +## 4.29.2 Device Specific Get Command + +This command is used to request device specific information. + +The Device Specific Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MANUFACTURER SPECIFIC _ _ _ | | | | | | | | +| Command = DEVICE SPECIFIC GET _ _ | | | | | | | | +| Reserved | | | | | Device ID Type | | | + +Device ID Type (3 bits) This field contains values for the Device ID Type. + +| Device ID Type | Value | +| --- | --- | +| Return OEM factory default Device ID Type | 0 | +| Serial Number | 1 | +| Pseudo Random | 2 | +| Reserved | 3-7 | + +A sending node SHOULD specify a value of zero when issuing the Device Specific Get command since the responding node may only be able to return one Device ID Type. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 134 of 220 + +## 4.29.3 Device Specific Report Command + +This command is used to advertise device specific information. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MANUFACTURER SPECIFIC _ _ _ | | | | | | | | +| Command = DEVICE SPECIFIC REPORT _ _ | | | | | | | | +| Reserved | | | | | Device ID Type | | | +| Device ID Data Format | | | Device ID Data Length | | | | | +| Device ID Data 1 | | | | | | | | +| ... | | | | | | | | +| Device ID Data N | | | | | | | | + +Device ID Data Format (3 bits) + +This command field defines the format used for Device ID Data. + +| Device ID Data Format | Value | Description | +| --- | --- | --- | +| UTF-8 | 0x00 | The Device ID Data MUST be in UTF-8 format. | +| Binary | 0x01 | The Device ID Data is in plain binary format and MUST be displayed as hexadecimal values e.g. 0x30, 0x31, 0x32, 0x33 MUST be displayed as h’30313233. | + +CC:0072.02.07.11.003 All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Device ID Type (3 bits) This field contains values for the Device ID Type. See Device Specific Get Command for details. + +In case the Device ID Type specified in a Device Specific Get command is not supported by the CC:0072.02.07.13.001 responding node, the responding node MAY return the factory default Device ID Type (as if receiving the value 0 in the Device Specific Get command). + +Device ID Data Length(5 bits) + +This field contains the length of the Device ID Data field. The field MUST NOT carry the value zero. + +Device ID Data (N bytes) + +Data fields for Device ID. “Device ID Data Format” defines data format and “Device ID Data Length Indicator” defines length. + +The Manufacturer ID and Device ID combination MUST be globally unique. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 135 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.30-multi-channel-association-command-class-version-1-obsoleted.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.30-multi-channel-association-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..4362829 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.30-multi-channel-association-command-class-version-1-obsoleted.md @@ -0,0 +1,14 @@ + +# 4.30 Multi Channel Association Command Class, version 1 [OBSOLETED] + +THIS VERSION HAS BEEN OBSOLETED + +New implementations MUST use the Multi Channel Association Command Class, version 2 or newer. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 136 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.01-compatibility-considerations.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.01-compatibility-considerations.md new file mode 100644 index 0000000..9068585 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.01-compatibility-considerations.md @@ -0,0 +1,46 @@ + +# 4.31.1 Compatibility considerations + +The Multi Channel Association Command Class extends the functionality of the Association command class. A device supporting this Command Class version MUST also support the (non-Multi Channel) CC:008E.02.00.21.001 Association Command Class, version 2. + +A controlling device SHOULD NOT create End Point associations to dynamic Multi Channel End Points. + +The Association Group Information (AGI) Command Class SHOULD be supported to enable automated discovery of association group properties. + +The Association and Multi Channel Association Command Classes MUST access the same collection of association groups. Further, the following applies: + +The two command classes MUST advertise the total number of association groups. + +The two command classes MUST advertise the total number of supported nodes for a given association group. + +Any advertised association group MUST support NodeID destinations as well as End Point destinations. + +NodeID associations maintained via the Multi Channel Association Command Class MUST be identical to NodeID associations maintained via the Association Command Class. + +The Multi Channel Command Class specifies that, for backwards compatibility with non-Multi Channel devices, the Root Device of a Multi Channel device MUST mirror the functionality of End Point 1 and it MAY mirror the functionality of more End Points. This principle also applies to association groups advertised by the Root Device. + +Each association group advertised by the Root Device, except for association group 1, SHOULD mirror an association group of an End Point. + +If a Root Device association group mirrors an End Point association group, the Root Device SHOULD map all Association commands for that group to the mirrored End Point association group. + +Except for association group 1 (the Z-Wave Plus Lifeline), a Multi Channel aware controlling device SHOULD ignore all Root Device association groups since they are just mirrored End Point association groups. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 137 of 220 [The use of encapsulation MUST comply with Table 18.](04.31.01-compatibility-considerations.md#4311-compatibility-considerations) + +Table 18, V2 Associations and the transmissions they may trigger + +| Source  Destination | Association type | Allowed transmissions | +| --- | --- | --- | +| NodeID  NodeID (V2) | NodeID | Non-encapsulated | +| End Point  NodeID (V2) | NodeID | Non-encapsulated | +| NodeID  End Point (V2) | End Point | Encapsulated *) (src≥0, dst>0) | +| End Point  End Point (V2) | End Point | Encapsulated (src>0, dst>0) | +| NodeID  Root Device | End Point | None **) | + +*) The source End Point MAY be different than 0 if the associated group is an End Point group mapped to the Root Device **) Version 2 of this command class does not allow the destination End Point to be zero. diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.02-z-wave-plus-considerations.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.02-z-wave-plus-considerations.md new file mode 100644 index 0000000..35e662c --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.02-z-wave-plus-considerations.md @@ -0,0 +1,14 @@ + +# 4.31.2 Z-Wave Plus considerations + +The Z-Wave Plus certification program mandates that Association group 1 is reserved for the Lifeline CC:008E.02.00.11.001 association group. Group 1 MUST NOT be assigned to any other use than the Lifeline group. The actual Device Type specifies a mandatory list of commands which the device must be able to send to all lifeline group destinations. A manufacturer MAY add additional commands to the lifeline group. + +End Points SHOULD NOT implement the Lifeline Association Group. End Points SHOULD report that zero NodeIDs are supported for association group 1. + +The Z-Wave Plus certification program mandates support for the Association Group Information (AGI) Command Class if a device supports the Multi Channel Association Command Class. diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.03-security-considerations.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.03-security-considerations.md new file mode 100644 index 0000000..1bd9b98 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.03-security-considerations.md @@ -0,0 +1,16 @@ + +# 4.31.3 Security considerations + +A node that is included securely MUST NOT accept Association commands unless the commands are received via the highest security key assigned to the device. + +A supporting node issuing commands via association groups MUST send those commands with its highest granted Security Class. + +A supporting node issuing Set or Report type commands via association groups SHOULD use Supervision encapsulation only if sending commands with S2 (or higher security) encapsulation. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 138 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.04-multi-channel-association-set-command.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.04-multi-channel-association-set-command.md new file mode 100644 index 0000000..bc5ba31 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.04-multi-channel-association-set-command.md @@ -0,0 +1,69 @@ + +# 4.31.4 Multi Channel Association Set Command + +This command is used to request that one or more destinations are added to a given association group. + +The destinations MAY be a mix of NodeID destinations and End Point destinations. + +The receiving node SHOULD add the specified destinations to the specified association group. + +This command MAY be ignored if the association group is already full. + +Routing slaves MUST have return routes assigned to all association destinations. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION SET _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| NodeID 1 | | | | | | | | +| ... | | | | | | | | +| NodeID M | | | | | | | | +| Marker = MULTI CHANNEL ASSOCIATION SET MARKER _ _ _ _ | | | | | | | | +| Multi Channel NodeID 1 | | | | | | | | +| Bit Address 1 | End Point 1 | | | | | | | +| … | | | | | | | | +| Multi Channel NodeID N | | | | | | | | +| Bit Address N | End Point N | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +A node that receives an unsupported Grouping Identifier MUST ignore this command + +NodeID (M bytes) + +This field specifies a list of NodeID destinations that are to be added to the specified association group as a NodeID association. + +A NodeID association created via this field MUST be identical to a NodeID association created with the (non-Multi Channel) Association Set command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 139 of 220 Marker (8 bits) + +This field is used to indicate the end of NodeID destinations and the start of End Point destinations. The CC:008E.02.01.11.005 Marker field MUST be set to the value MULTI_CHANNEL_ASSOCIATION_SET_MARKER. The field MAY be omitted if no End Point destinations are specified. + +Multi Channel NodeID (N bytes) + +The Multi Channel NodeID, Bit Address and End Point fields specify a list of End Points which are to be added to the specified association group as an End Point association. + +The complete identification of an End Point destination requires a NodeID as well as an End Point identifier. This command MAY carry multiple copies of the same Multi Channel NodeID in combination CC:008E.02.01.13.004 with different End Point identifiers. + +Bit Address + End Point (N bytes) + +These fields MUST be processed in combination with the Multi Channel NodeID field. + +The receiving node SHOULD treat the Bit Address flag and the End Point identifier as one scalar value; thus creating only one association group entry. Using a single scalar value enables: + + Better utilization of association group capacity  Simple transmission of command for a multi-End Point destination  Well-defined removal of bit addressed End Points + +Refer to the Multi Channel Command Class for the actual encoding of bit addressed End Points. + +The 7-bit End Point value MUST be in the range 1..127. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 140 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.05-multi-channel-association-get-command.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.05-multi-channel-association-get-command.md new file mode 100644 index 0000000..bb4ef40 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.05-multi-channel-association-get-command.md @@ -0,0 +1,28 @@ + +# 4.31.5 Multi Channel Association Get Command + +This command is used to request the current destinations of a given association group. + +The Multi Channel Association Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. CC:008E.02.02.11.003 A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION GET _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to specify the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +A node that receives an unsupported Grouping Identifier SHOULD return information relating to Grouping Identifier 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 141 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.06-multi-channel-association-report-command.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.06-multi-channel-association-report-command.md new file mode 100644 index 0000000..226cabc --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.06-multi-channel-association-report-command.md @@ -0,0 +1,61 @@ + +# 4.31.6 Multi Channel Association Report Command + +This command is used to advertise the current destinations for a given association group. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | | +| Grouping Identifier | | | | | | | | | +| Max Nodes Supported | | | | | | | | | +| Reports to Follow | | | | | | | | | +| NodeID 1 | | | | | | | | | +| … | | | | | | | | | +| NodeID M | | | | | | | | | +| Marker = MULTI CHANNEL ASSOCIATION REPORT MARKER _ _ _ _ | | | | | | | | | +| Multi Channel NodeID 1 | | | | | | | | | +| Bit address 1 | | End Point 1 | | | | | | | +| … | | | | | | | | | +| Multi Channel NodeID N | | | | | | | | | +| Bit address N | | End Point N | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to advertise the actual association group. Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +Max Nodes Supported (8 bits) + +The maximum number of destinations supported by the advertised association group. Each destination MAY be a NodeID destination or an End Point destination. + +Reports to Follow (8 bits) + +The entire list destinations of the advertised association group may be too long for one command. This field MUST advertise how many report frames will follow this report. + +NodeID (M bytes) + +This field advertises a list of NodeID destinations of the advertised association group. The list of NodeIDs MUST be empty if there are no NodeID destinations configured for the advertised association group. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 142 of 220 Marker (8 bits) + +Refer to description under the Multi Channel Association Set command. + +Multi Channel NodeID (N bytes) + +The Multi Channel NodeID, Bit Address and End Point fields specify a list of End Points which are currently in the advertised association group. + +The complete identification of an End Point requires a NodeID as well as an End Point identifier. The CC:008E.02.03.13.002 Multi Channel Association Report command MAY carry multiple copies of the same Multi Channel NodeID in combination with different End Point identifiers. + +The list of Multi Channel NodeID and End Point identifiers MUST be empty if there are no End Point destinations configured for the advertised association group. + +Bit address + End Point (N bytes) + +These fields MUST be processed in combination with the Multi Channel NodeID field. + +Refer to the Multi Channel Command Class for the actual encoding of bit addressed End Points. diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.07-multi-channel-association-remove-command.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.07-multi-channel-association-remove-command.md new file mode 100644 index 0000000..4173119 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.07-multi-channel-association-remove-command.md @@ -0,0 +1,321 @@ + +# 4.31.7 Multi Channel Association Remove Command + +This command is used to remove NodeID and End Point destinations from a given association group. + +This command MUST manipulate the same list of NodeID destinations as the Association Remove Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| NodeID 1 | | | | | | | | +| … | | | | | | | | +| NodeID M | | | | | | | | +| Marker = MULTI CHANNEL ASSOCIATION REMOVE MARKER _ _ _ _ | | | | | | | | +| Multi Channel NodeID 1 | | | | | | | | +| Bit address 1 | End Point 1 | | | | | | | +| … | | | | | | | | +| Multi Channel NodeID N | | | | | | | | +| Bit address N | End Point N | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 143 of 220 Grouping Identifier (8 bits) + +This field is used to specify from which association group the specified destinations should be removed. + +Grouping Identifiers MUST be assigned in a consecutive range starting from 1. A receiving node MUST ignore an unsupported Grouping Identifier; except for the value 0. + +This field MUST be interpreted in combination with the NodeID and End Point fields. + +(NodeID Destination) NodeID (M bytes) (End Point Destination) Multi Channel NodeID (N bytes) (End Point Destination) End Point (N bytes) + +These fields specify the destinations that are to be removed. CC:008E.02.04.11.005 The Grouping Identifier and these fields MUST be interpreted as follows. + +“NodeID Destinations” denote the NodeID fields. “End Point destinations” denote the combined Multi Channel NodeID and End Point fields found after the marker. + +A receiving node MAY interpret the empty command (only Command Class and Command fields) as an instruction to Remove all NodeID destinations and End Point destinations from all association groups. + +[This field MUST be interpreted according to Table 19](04.31.07-multi-channel-association-remove-command.md#4317-multi-channel-association-remove-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 144 of 220 Table 19, Multi Channel Association Remove, V2 :: Parameter interpretation + +| Grouping identifier | Number of NodeID Destinations | Number of End Point Destinations | Interpretation | +| --- | --- | --- | --- | +| > 0 | > 0 | (don’t care) | Remove NodeID destinations from association group. Then assess End Points (next line) – if any specified | +| > 0 | (don’t care) | > 0 *) | Remove End Point destinations from association group *). | +| > 0 | = 0 | = 0 | Remove all NodeID destinations and End Point destinations from association group. | +| = 0 | > 0 | (don’t care) | Remove NodeID destinations from all association groups. Then assess End Point destinations (next line) – if any specified | +| = 0 | (don’t care) | > 0 *) | Remove End Point destinations from all association groups *). | +| = 0 | = 0 | = 0 | Remove all NodeID destinations and End Point destinations from all association groups. | + +*) The receiving node MUST treat the Bit Address flag and the End Point identifier as one scalar value. CC:008E.02.04.11.008 The receiving node MUST remove End Points if an exact match can be found, while it MAY ignore the removal request if an exact match cannot be found; even though there may exist associations for individual End Point destinations which are covered by the End Point bitmap address. + +Marker (8 bits) + +[Refer to the description in 4.31.4 in the Multi Channel Association Set Command.](04.31.04-multi-channel-association-set-command.md#4314-multi-channel-association-set-command) + +## 4.31.7.1 Examples + +Remove specified NodeID from Group 3 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION GET _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 145 of 220 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| NodeID = 12 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 2 | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 146 of 220 Remove specified End Point from Group 3 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION GET _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 2 | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 2 | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 147 of 220 Remove bit addressable End Points from Group 3 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION GET _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 134 (b1000 0110) | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 134 (b1000 0110) | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 148 of 220 Remove specified NodeID and End Point from Group 3 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION GET _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 2 | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 2 | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 149 of 220 Remove all associations from Group 3 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION GET _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | +| NodeID = 11 | | | | | | | | +| NodeID = 12 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 2 | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | +| Multi Channel NodeID = 17 | | | | | | | | +| End Point = 2 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REPORT _ _ _ | | | | | | | | +| Grouping Identifier = 3 | | | | | | | | +| Max Nodes Supported = 5 | | | | | | | | +| Reports to Follow = 0 | | | | | | | | + +Remove specific NodeID from all Groups + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 0 | | | | | | | | +| NodeID = 12 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 150 of 220 Remove specific Multi Channel NodeID from all Groups + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 0 | | | | | | | | +| MULTI CHANNEL _ _ ASSOCIATION REPORT MARKER _ _ | | | | | | | | +| Multi Channel NodeID = 16 | | | | | | | | +| End Point = 3 | | | | | | | | + +Remove all associations from all Groups + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | + +or + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS _ _ MULTI CHANNEL ASSOCIATION _ _ | | | | | | | | +| MULTI CHANNEL ASSOCIATION REMOVE _ _ _ | | | | | | | | +| Grouping Identifier = 0 | | | | | | | | diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.08-multi-channel-association-supported-groupings-get-command.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.08-multi-channel-association-supported-groupings-get-command.md new file mode 100644 index 0000000..e358102 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.08-multi-channel-association-supported-groupings-get-command.md @@ -0,0 +1,21 @@ + +# 4.31.8 Multi Channel Association Supported Groupings Get Command + +This command is used to request the number of association groups that this node supports. + +The Multi Channel Association Supported Groupings Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION GROUPINGS GET _ _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 151 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.09-multi-channel-association-supported-groupings-report-command.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.09-multi-channel-association-supported-groupings-report-command.md new file mode 100644 index 0000000..6e2154b --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/04.31.09-multi-channel-association-supported-groupings-report-command.md @@ -0,0 +1,28 @@ + +# 4.31.9 Multi Channel Association Supported Groupings Report Command + +This command is used to advertise the maximum number of association groups implemented by this node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION GROUPINGS REPORT _ _ _ _ | | | | | | | | +| Supported Groupings | | | | | | | | + +Supported Groupings (8 bits) + +This field is used to advertise the number of association groups that this node supports. + +Grouping Identifiers MUST be assigned in a consecutive range starting from 1. + +The value advertised by this field MUST be the total number of supported association groups; whether associations are managed via the Association Command Class or the Multi Channel Association Command Class. + +Each of these association groups MUST support NodeID destinations as well as End Point destinations. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 152 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/index.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/index.md new file mode 100644 index 0000000..f144c34 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.31-multi-channel-association-command-class-version-2/index.md @@ -0,0 +1,28 @@ + +# 4.31 Multi Channel Association Command Class, version 2 + +The Multi Channel Association Command Class is used to manage associations to Multi Channel End Point destinations as well as to NodeID destinations. + +An association group sends an unsolicited command to the configured destinations when triggered by an event. The parameters of the command may be dynamic, e.g. the temperature of a sensor reading or the light level for a dimmer. + +A NodeID association identifies its destination by a NodeID. An End Point association identifies its destination by a combination of a NodeID and an End Point. + +[Refer to [15] for an introduction to the Multi Channel concept.](../04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +## Contents + +- [4.31.1 Compatibility considerations](04.31.01-compatibility-considerations.md) +- [4.31.2 Z-Wave Plus considerations](04.31.02-z-wave-plus-considerations.md) +- [4.31.3 Security considerations](04.31.03-security-considerations.md) +- [4.31.4 Multi Channel Association Set Command](04.31.04-multi-channel-association-set-command.md) +- [4.31.5 Multi Channel Association Get Command](04.31.05-multi-channel-association-get-command.md) +- [4.31.6 Multi Channel Association Report Command](04.31.06-multi-channel-association-report-command.md) +- [4.31.7 Multi Channel Association Remove Command](04.31.07-multi-channel-association-remove-command.md) +- [4.31.8 Multi Channel Association Supported Groupings Get Command](04.31.08-multi-channel-association-supported-groupings-get-command.md) +- [4.31.9 Multi Channel Association Supported Groupings Report Command](04.31.09-multi-channel-association-supported-groupings-report-command.md) diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.32-multi-channel-association-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.32-multi-channel-association-command-class-version-3.md new file mode 100644 index 0000000..ba1d746 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.32-multi-channel-association-command-class-version-3.md @@ -0,0 +1,134 @@ + +# 4.32 Multi Channel Association Command Class, version 3 + +The Multi Channel Association Command Class is used to manage associations to Multi Channel End Point destinations as well as to NodeID destinations. + +The following sections specify commands which were extended or added in version 3. + +## 4.32.1 Compatibility considerations + +[The considerations of section 4.31.1 also apply to this version the following additions:](04.31-multi-channel-association-command-class-version-2/04.31.01-compatibility-considerations.md#4311-compatibility-considerations) + +A device supporting this Command Class version MUST also + + support the Multi Channel Association Command Class, version 2 + + support the (non-Multi Channel) Association Command Class, version 2 + +This version introduces support for the creation of an End Point Association to the Root Device of another device, e.g. a gateway, by allowing the destination End Point 0 as a valid value. This allows a gateway to create a single Lifeline association from a Multi Channel device and subsequently receive status messages or sensor reports from the Root Device as well as the End Points [of that device. Refer to section 4.32.2.](04.32-multi-channel-association-command-class-version-3.md#4322-z-wave-plus-considerations) + +[The use of Multi Channel encapsulation MUST comply with Table 20.](04.32-multi-channel-association-command-class-version-3.md#4321-compatibility-considerations) + +Table 20, V3 Associations and the transmissions they may trigger + +| Source  Destination | Association type | Allowed transmissions | +| --- | --- | --- | +| NodeID  NodeID (V2) | NodeID | Non-encapsulated | +| End Point  NodeID (V2) | NodeID | Non-encapsulated | +| NodeID  End Point (V2) | End Point | Encapsulated *) (src≥0, dst>0) | +| End Point  End Point (V2) | End Point | Encapsulated (src>0, dst>0) | +| End Point  Root Device (V3) | End Point | Encapsulated (src>0, dst=0) | +| Root Device  Root Device (V3) | End Point | Non-encapsulated **) or Encapsulated (src>0, dst=0) | + +*) The source End Point MAY be different than 0 if the associated group is an End Point Group mapped to the Root Device **) Command must be sent non-encapsulated if both End Points are zero. However, the End Point association from a Root Device Lifeline group to a Root Device also allows a source End Point to send encapsulated commands to [the Root Device Lifeline destination. Refer to 4.32.2.](04.32-multi-channel-association-command-class-version-3.md#4322-z-wave-plus-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 153 of 220 + +## 4.32.2 Z-Wave Plus considerations + +The considerations of version 2 also apply to this version. + +Version 3 adds support for creation of an End Point Association to the Root Device of another device, e.g. a gateway. + +A controlling device MUST verify that a device supports Multi Channel Association Command Class, Version 3 before creating an End Point Association to the Root Device of another device. + +Multi Channel End Points may implement functionality relevant to a Lifeline destination, e.g. individual meter reports from a power strip. Multi Channel encapsulation allows the Lifeline destination to distinguish between apparently identical commands from different End Points. + +As specified by the Multi Channel Command Class, a Root Device must not use Multi Channel encapsulation when communicating to another Root Device, i.e. if both End Points are zero. It does however still make sense to create an End Point Association from one Root Device to another Root Device, e.g. a gateway. + +Consider, as an example, a two-channel temperature sensor. By creating an End Point association from the Lifeline Association Group to the Root Device of a gateway, the gateway may receive unsolicited Multi Channel encapsulated sensor reports from each of the sensor End Points as well as non- encapsulated battery status messages from the sensor Root Device. + +The Root Device of a Multi Channel device SHOULD implement support for the Multi Channel Association Command Class if any of the End Points provide association capabilities. If the Root Device implements such support, the Root Device MAY forward Multi Channel encapsulated commands to the association destination on behalf of End Points. + +A NodeID association MUST NOT be created in response to a request for an End Point association to the Root Device (destination End Point 0). If a NodeID Association is created from the Root Device Lifeline Association Group, End Point commands MUST NOT be transmitted via the Lifeline Association Group of the root device. All commands originating from the Root Device (Tamper Alarm, Device Reset Locally, etc.) MUST be sent non-encapsulated to the Lifeline destination. If a NodeID association is created, two End Points MUST NOT forward identical commands (e.g. Multilevel Sensor Report::Temperature) via the Lifeline group, as the lack of source End Point information will prevent a receiving application from distinguishing the individual commands from each other. + +If an End Point Association is created from the Lifeline group, End Points MUST send relevant Multi Channel encapsulated commands to the Lifeline group destination. + +A Multi Channel device MAY forward commands from multiple Multi Channel End Points to the Lifeline group destination. + +## 4.32.3 Security considerations + +[The considerations of section 4.31.3 also apply to this version.](04.31-multi-channel-association-command-class-version-2/04.31.03-security-considerations.md#4313-security-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 154 of 220 + +## 4.32.4 Multi Channel Association Set Command + +This command is used to request that one or more destinations are added to a given association group. + +The destinations MAY be a mix of NodeID destinations and End Point destinations. + +The receiving node SHOULD add the specified destinations to the specified association group. This command MAY be ignored if the association group is already full. + +Routing slaves MUST have return routes assigned to all association destinations. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MULTI CHANNEL ASSOCIATION _ _ _ _ | | | | | | | | +| Command = MULTI CHANNEL ASSOCIATION SET _ _ _ | | | | | | | | +| Grouping Identifier | | | | | | | | +| NodeID 1 | | | | | | | | +| ... | | | | | | | | +| NodeID M | | | | | | | | +| Marker = MULTI CHANNEL ASSOCIATION SET MARKER _ _ _ _ | | | | | | | | +| Multi Channel NodeID 1 | | | | | | | | +| Bit address 1 | End Point 1 | | | | | | | +| … | | | | | | | | +| Multi Channel NodeID N | | | | | | | | +| Bit address N | End Point N | | | | | | | + +Grouping Identifier (8 bits) + +This field is used to specify the actual association group. + +A node receiving an unsupported Grouping Identifier MUST ignore this command. + +NodeID (M bytes) + +The NodeID fields specify a list of NodeID destinations that are to be added to the specified association group as a NodeID association. + +A NodeID association created via this field MUST be identical to a NodeID association created with the (non-Multi Channel) Association Set command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 155 of 220 Marker (8 bits) + +This field is used to indicate the end of NodeID destinations and the start of End Point destinations. The CC:008E.03.01.11.004 Marker field MUST be set to the value MULTI_CHANNEL_ASSOCIATION_SET_MARKER. The field MAY be omitted if no End Point destinations are specified. + +Multi Channel NodeID (N bytes) + +The Multi Channel NodeID, Bit Address and End Point fields specify a list of End Point destinations which are to be added to the specified association group as an End Point association. + +The complete identification of an End Point destination requires a NodeID as well as an End Point identifier. This command MAY carry multiple copies of the same Multi Channel NodeID in combination with different End Point identifiers. + +Bit address + End Point (N bytes) + +These fields MUST be processed in combination with the Multi Channel NodeID field. + +The receiving node SHOULD treat the Bit Address flag and the End Point identifier as one scalar value; thus creating only one association group entry. Using a single scalar value enables: + + Better utilization of association group capacity + + Simple transmission of command for a multi-End Point destination + + Well-defined removal of bit addressed End Points + +Refer to the Multi Channel Command Class for the actual encoding of bit addressed End Points. + +The 7-bit End Point value MUST be in the range 0..127. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 156 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.33-multi-channel-association-command-class-version-4.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.33-multi-channel-association-command-class-version-4.md new file mode 100644 index 0000000..f3f6f0a --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.33-multi-channel-association-command-class-version-4.md @@ -0,0 +1,20 @@ + +# 4.33 Multi Channel Association Command Class, version 4 + +The Multi Channel Association Command Class version 4 introduces the capability to discover the highest security class of a target when issuing controlling commands via association groups. + +## 4.33.1 Compatibility Considerations + +If a node supports the version 4 of this Command Class and the Association Command Class, it MUST support the Association Command, version 3 or newer + +## 4.33.2 Interoperability considerations + +[A supporting node MUST respect the requirement defined in 4.5.2 Interoperability considerations](04.05-association-command-class-version-3.md#452-interoperability-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 157 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.34-node-naming-and-location-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.34-node-naming-and-location-command-class-version-1.md new file mode 100644 index 0000000..48d08b5 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.34-node-naming-and-location-command-class-version-1.md @@ -0,0 +1,162 @@ + +# 4.34 Node Naming and Location Command Class, version 1 + +The Node Naming and Location Command Class is used to assign a name and a location text string to a supporting node. + +## 4.34.1 Node Name Set Command + +This command is used to set the name of the receiving node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE NAMING _ _ _ | | | | | | | | +| Command = NODE NAMING NODE NAME SET _ _ _ _ | | | | | | | | +| Reserved | | | | | Char. Presentation | | | +| Node name char 1 | | | | | | | | +| … | | | | | | | | +| Node name char N | | | | | | | | + +Node name char (N bytes) + +This field is used to indicate the actual assigned name for the node. + +This field MUST be encoded using the specified character representation in the Char.Presentation field. + +The Node name string MUST NOT contain any appended termination characters. + +The length of this field MUST be in the range 1..16 bytes. The length of this field MUST be determined from the frame length. + +A node receiving this command with a Node name char longer than 16 bytes MUST ignore any byte/character following the 16 th byte. + +Devices using the Unicode UTF-16 characters representation can set Name strings using a maximum of 8 characters because each character is encoded with 2 bytes. In this case, the first byte MUST be the most significant byte. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 158 of 220 Char. Presentation (3 bits) + +This field is used to indicate the character encoding for the Node name char field. + +[This field MUST comply with Table 21:](04.34-node-naming-and-location-command-class-version-1.md#4341-node-name-set-command) + +Table 21, Node Name Set::Char. Presentation encoding + +| Value | Description | +| --- | --- | +| 0x00 | Using standard ASCII codes, see Appendix A (values 128-255 are ignored) | +| 0x01 | Using standard and OEM Extended ASCII codes, see Appendix A | +| 0x02 | Unicode UTF-16 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +## 4.34.2 Node Name Get Command + +This command is used to request the stored name from a node. + +[The Node Name Report Command MUST be returned in response to this command.](04.34-node-naming-and-location-command-class-version-1.md#4343-node-name-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE NAMING _ _ _ | | | | | | | | +| Command = NODE NAMING NODE NAME GET _ _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 159 of 220 + +## 4.34.3 Node Name Report Command + +This command is used to advertise the name assigned to the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE NAMING _ _ _ | | | | | | | | +| Command = NODE NAMING NODE NAME REPORT _ _ _ _ | | | | | | | | +| Reserved | | | | | Char. Presentation | | | +| Node name char 1 | | | | | | | | +| … | | | | | | | | +| Node name char N | | | | | | | | + +[For fields’ description, refer to 4.34.1 Node Name Set Command](04.34-node-naming-and-location-command-class-version-1.md#4341-node-name-set-command) + +[A sending node MUST comply with fields’ description from 4.34.1 Node Name Set Command](04.34-node-naming-and-location-command-class-version-1.md#4341-node-name-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 160 of 220 + +## 4.34.4 Node Location Set Command + +The Node Location Set Command is used to set a location name in a node in a Z-Wave network. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE NAMING _ _ _ | | | | | | | | +| Command = NODE NAMING NODE LOCATION SET _ _ _ _ | | | | | | | | +| Reserved | | | | | Char. Presentation | | | +| Node location char 1 | | | | | | | | +| … | | | | | | | | +| Node location char N | | | | | | | | + +Node location char (N bytes) + +This field is used to indicate the actual assigned location for the node. + +This field MUST be encoded using the specified character representation in the Char. Presentation field. + +The Node location string MUST NOT contain any appended termination characters. + +The length of this field MUST be in the range 1..16 bytes. The length of this field MUST be determined from the frame length. + +A node receiving this command with a Node location char longer than 16 bytes MUST ignore any byte/character following the 16 byte. th + +Devices using the Unicode UTF-16 characters representation can set Location strings using a maximum of 8 characters because each character is encoded with 2 bytes. In this case, the first byte MUST be the most significant byte. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Char. Presentation (3 bits) + +This field is used to indicate the character encoding for the Node location char field. + +[This field MUST comply with Table 21.](04.34-node-naming-and-location-command-class-version-1.md#4341-node-name-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 161 of 220 + +## 4.34.5 Node Location Get Command + +This command is used to request the stored node location from a node. + +[The Node Location Report Command MUST be returned in response to this command.](04.34-node-naming-and-location-command-class-version-1.md#4346-node-location-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE NAMING _ _ _ | | | | | | | | +| Command = NODE NAMING NODE LOCATION GET _ _ _ _ | | | | | | | | + +## 4.34.6 Node Location Report Command + +This command is used to advertise the node location. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE NAMING _ _ _ | | | | | | | | +| Command = NODE NAMING NODE LOCATION REPORT _ _ _ _ | | | | | | | | +| Reserved | | | | | Char. Presentation | | | +| Node location char 1 | | | | | | | | +| … | | | | | | | | +| Node location char N | | | | | | | | + +[For fields’ description, refer to 4.34.4 Node Location Set Command](04.34-node-naming-and-location-command-class-version-1.md#4344-node-location-set-command) + +[A sending node MUST comply with fields’ description from 4.34.4 Node Location Set Command.](04.34-node-naming-and-location-command-class-version-1.md#4344-node-location-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 162 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.35-remote-association-activation-command-class-version-1-obsoleted.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.35-remote-association-activation-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..1a35353 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.35-remote-association-activation-command-class-version-1-obsoleted.md @@ -0,0 +1,62 @@ + +# 4.35 Remote Association Activation Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS VERSION HAS BEEN OBSOLETED + +New implementations MUST NOT use this command class. + +The Remote Association Activation Command Class is used to remote activations of Association grouping identifiers in other nodes. + +Mandatory requirement: Both ‘local’ and ‘remote’ node MUST implement the Association Command Class as illustrated below. In addition the ‘local’ node MUST implement the Remote Association Configuration Command Class as ‘Supported’. + +The Remote Association Activation Command Class and the Remote Association Configuration Command Class are additions to the functionality to the existing Association Command Class. + +NodeID 17 (Remote Node) + +| Association C.class #1 44 40 9 #2 10 #3 102 3 212 Remote Association Activate Command Class NodeID 31 (Local node) Association C.class #1 22 41 17 3 Remote Association Configuration #2 10 12 0 Command Class A #3 10 12 0 Remote Association C.class | Association C.class #1 44 40 9 #2 10 #3 102 3 212 | +| --- | --- | +| Association C.class #1 22 41 17 3 #2 10 12 0 #3 10 12 0 Remote Association C.class | | + +| #1 | 44 40 9 | +| --- | --- | +| | | +| #2 | 10 | +| | | +| #3 | 102 3 212 | + +| #1 22 41 17 #2 10 12 #3 10 12 | | | | | +| --- | --- | --- | --- | --- | +| | #1 | 22 41 | 17 | 3 | +| | | | | | +| | #2 | 10 12 | | 0 | +| | | | | | +| | #3 | 10 12 | | 0 | +| | | | | | + +Figure 8, Remote Association Activation Command Class + +The Remote Association Configuration Command Class enables a 1 st node (any node) to configure a 2 nd node (local node) to issue a Remote Association Activate Command to a 3 rd node (remote node), which instruct the 3 node to activate one of its locally stored association group identifiers as defined by the rd Association Command Class. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 163 of 220 + +## 4.35.1 Remote Association Activate Command + +The Remote Association Activate Command is used to instruct a ’remote’ node to activate one of its locally stored association group identifiers as defined by the Association Command Class. This will subsequently generate a number of Commands being issued from the ‘remote node to the NodeIDs associated to the grouping identifier + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS REMOTE ASSOCIATION ACTIVATE _ _ _ _ | | | | | | | | +| Command = REMOTE ASSOCIATION ACTIVATE _ _ | | | | | | | | +| Grouping identifier | | | | | | | | + +Grouping identifier (8 bits) + +This group identifier used to specify the grouping identifier on the remote node + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 164 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.36-remote-association-configuration-command-class-version-1-obsoleted.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.36-remote-association-configuration-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..6f8de64 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.36-remote-association-configuration-command-class-version-1-obsoleted.md @@ -0,0 +1,120 @@ + +# 4.36 Remote Association Configuration Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS VERSION HAS BEEN OBSOLETED + +New implementations MUST NOT use this command class. + +The Remote Association Configuration Command Class is used to configuration of the Remote Association Activation Command Class. + +Mandatory requirement: Both ‘local’ and ‘remote’ node MUST implement the Association Command Class as ‘supported’. In addition the ‘local’ node MUST implement the Remote Association Configuration Command Class as ‘supported’ and the node used to make the configuration (‘any node’ in the description below) MUST implement it as ‘controlled’. + +The Remote Association Configuration Command Class is an addition to the functionality of the existing Association Command Class. + +NodeID 17 (Remote Node) + +| Association C.class #1 44 40 9 #2 10 #3 102 3 212 Remote Association Activate Command Class NodeID 31 (Local node) Association C.class #1 22 41 17 3 Remote Association Configuration #2 10 12 0 Command Class A #3 10 12 0 Remote Association C.class | Association C.class #1 44 40 9 #2 10 #3 102 3 212 | +| --- | --- | +| Association C.class #1 22 41 17 3 #2 10 12 0 #3 10 12 0 Remote Association C.class | | + +| #1 | 44 40 9 | +| --- | --- | +| | | +| #2 | 10 | +| | | +| #3 | 102 3 212 | + +| #1 22 41 17 #2 10 12 #3 10 12 | | | | | +| --- | --- | --- | --- | --- | +| | #1 | 22 41 | 17 | 3 | +| | | | | | +| | #2 | 10 12 | | 0 | +| | | | | | +| | #3 | 10 12 | | 0 | +| | | | | | + +Figure 9, Remote Association Configuration Command Class The Remote Association Configuration Command Class enables a 1 st node (Any node) to configure a 2 nd node (Local node) to issue a Remote Association Activate Command to a 3 node (Remote node), which rd instructs the 3 rd node to activate one of its locally stored association group identifiers as defined by its Association Command Class. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 165 of 220 + +## 4.36.1 Remote Association Configuration Set Command + +The Remote Association Configuration Set Command links two nodes’ ‘Association Command Class’ defined grouping identifiers together. It allows one node (local node) to use its grouping identifiers to control a second node’s (remote node) grouping identifiers, using the Remote Association Activation Command Class. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS REMOTE ASSOCIATION _ _ _ | | | | | | | | +| Command = REMOTE ASSOCIATION CONFIGURATION SET _ _ _ | | | | | | | | +| Local Grouping identifier | | | | | | | | +| Remote NodeID | | | | | | | | +| Remote Grouping identifier | | | | | | | | + +Local Grouping identifier (8 bits) + +Like in the Association Command Class, the Local Grouping identifier is used to specify the grouping identifier on the local node. + +A Local grouping identifier = 0x0 will erase all links between local and remote grouping identifiers. + +Remote NodeID (8 bits) + +This NodeID used to specify the Node, which should receive the Remote Association Activate Command. + +A NodeID = 0x0 will remove a link between the specified local grouping identifier and a remote grouping identifier. + +Remote Grouping identifier (8 bits) + +This group identifier used to specify the grouping identifier on the remote node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 166 of 220 + +## 4.36.2 Remote Association Configuration Get Command + +The Remote Association Configuration Get Command is used to request the link between a Local Grouping identifier and a Remote Grouping identifier on a node. + +The Remote Association Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS REMOTE ASSOCIATION _ _ _ | | | | | | | | +| Command = REMOTE ASSOCIATION CONFIGURATION GET _ _ _ | | | | | | | | +| Local Grouping identifier | | | | | | | | + +Local Grouping identifier (8 bits) + +Like in the Association Command Class, the Local Grouping identifier is used to specify the grouping identifier on the local node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 167 of 220 + +## 4.36.3 Remote Association Configuration Report Command + +The Remote Association Configuration Report Command returns the remote NodeID and the grouping identifier. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS REMOTE ASSOCIATION _ _ _ | | | | | | | | +| Command = REMOTE ASSOCIATION CONFIGURATION REPORT _ _ _ | | | | | | | | +| Local Grouping identifier | | | | | | | | +| Remote NodeID | | | | | | | | +| Remote Grouping identifier | | | | | | | | + +Local Grouping identifier (8 bits) + +This group identifier used to specify the grouping identifier on the local node + +Remote NodeID (8 bits) + +This NodeID used to specify the remote node that the Remote Association Activate Command is sent to. If no link is established between the Local Grouping Identifier and a Remote Grouping Identifier, the Remote NodeID will return zero (0x0) + +Remote Grouping identifier (8 bits) + +This Remote grouping identifier used to specify the grouping identifier on the remote node that should be activated. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 168 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.37-time-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.37-time-command-class-version-1.md new file mode 100644 index 0000000..de61d64 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.37-time-command-class-version-1.md @@ -0,0 +1,139 @@ + +# 4.37 Time Command Class, version 1 + +The Time Command Class, version1 is used to read date and time from a supporting node in a Z-Wave network. + +## 4.37.1 Compatibility considerations + +Notice that the former Time Command Class version 1 (Revision 4 of this document) is discontinued and replaced by a new one. + +### 4.37.1.1 Node Information Frame (NIF) + +A supporting node MUST always advertise the Time Command Class in its NIF, regardless of the security bootstrapping outcome. + +This allows other nodes bootstrapped on any security level to request the current time from a supporting node. + +## 4.37.2 Interoperability considerations + +Nodes supporting this Command Class are time servers for other nodes in a Z-Wave network. Other nodes can learn the current date and time by querying nodes supporting this Command Class. + +For nodes based on a slave Role Type, it is RECOMMENDED to support a dedicated Association Group which issues the Time Get Command and/or the Date Get Command. + +Controlling nodes SHOULD automatically associate such association groups to a node supporting the Time Command Class. + +## 4.37.3 Time Get Command + +This command is used to request the current time from a supporting node. + +[The Time Report Command MUST be returned in response to this command.](04.37-time-command-class-version-1.md#4374-time-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = TIME GET _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 169 of 220 + +## 4.37.4 Time Report Command + +This command is used to report the current time. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = TIME REPORT _ | | | | | | | | +| RTC failure | Reserved | | Hour Local Time | | | | | +| Minute Local Time | | | | | | | | +| Second Local Time | | | | | | | | + +RTC failure (1 bit) + +Many RTC chips have a stop bit indicating if the oscillator has been stopped. The RTC failure bit MUST be set to 1 in order to indicate to the receiving node that the RTC has been stopped and that the advertised time might be inaccurate. + +If the sending node does not support this feature or if the oscillator has not been stopped, it MUST set this field to 0. + +If the receiving node does not support this feature, it MUST ignore this field. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Hour Local Time (8 bits) + +This field is used to indicate the number of complete hours that have passed since midnight in local time. + +This field MUST be in the range 0..23. + +Minute Local Time (8 bits) + +This field is used to indicate the number of complete minutes that have passed since the start of the hour in local time. + +This field MUST be in the range 0..59. + +Second Local Time (8 bits) + +This field is used to indicate the number of complete seconds that have passed since the start of the minute in local time. + +This field MUST be in the range 0..59. + +Note: the time synchronization between nodes may vary by a few seconds due to delays introduced by the wireless communication. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 170 of 220 + +## 4.37.5 Date Get Command + +This command is used to request the current date adjusted according to the local time zone and Daylight Saving Time from a supporting node. + +[The Date Report Command MUST be returned in response to this command.](04.37-time-command-class-version-1.md#4376-date-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = DATE GET _ | | | | | | | | + +## 4.37.6 Date Report Command + +This command is used to advertise the current date adjusted according to the local time zone and Daylight Saving Time. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = DATE REPORT _ | | | | | | | | +| Year 1 | | | | | | | | +| Year 2 | | | | | | | | +| Month | | | | | | | | +| Day | | | | | | | | + +Year (16 bits) + +This field MUST specify the current year using the Gregorian calendar. The first byte (Year 1) MUST be the most significant byte. + +For example, Year1= 0x07 and Year2 =0xD7 MUST indicate year 2007 + +Month (8 bits) + +This field MUST specify the current month of the year. + +This field MUST be in the range 1..12 (representing respectively January...December). + +Day (8 bits) + +This field MUST specify current the day of the month. + +This field MUST be in the range 1..31. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 171 of 220 [silabs.com | Building a more connected world.](https://www.silabs.com/) Page 172 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.38-time-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.38-time-command-class-version-2.md new file mode 100644 index 0000000..ccc0ec1 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.38-time-command-class-version-2.md @@ -0,0 +1,165 @@ + +# 4.38 Time Command Class, version 2 + +The Time Command Class, version 2 is used to read date and time from a supporting node in a Z-Wave network. + +## 4.38.1 Compatibility considerations + +The Time Command Class, version 2 is backwards compatible with the Time Command Class, version 1. + +The Time Command Class, version 2 enables reading and setting Time Zone Offset and Daylight Saving Time parameters. The data formats are based on the International Standard ISO 8601. + +Commands not described in this version MUST remain unchanged from version 1. + +### 4.38.1.1 Node Information Frame (NIF) + +A supporting node MUST always advertise the Time Command Class in its NIF, regardless of the security bootstrapping outcome. + +This allows other nodes bootstrapped on any security level to request the current time from a supporting node. + +## 4.38.2 Interoperability considerations + +Nodes supporting this Command Class are time servers for other nodes in a Z-Wave network. Other nodes can learn the current date and time by querying nodes supporting this Command Class. + +For nodes based on a slave Role Type, it is RECOMMENDED to support a dedicated Association Group which issues the Time Get Command, the Date Get Command and/or the Time Offset Get Command. + +Controlling nodes SHOULD automatically associate such association groups to a node supporting the Time Command Class, version 2. + +The purpose of this Command Class is to read the current date and time information from supporting CC:008A.02.00.33.001 nodes. Hence, supporting nodes MAY ignore the Time Offset Set Command introduced in version 2 if they rely on another source to retrieve the Time Zone Offset and Daylight Saving Time information. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 173 of 220 + +## 4.38.3 Time Offset Get Command + +This command is used to request the Time Zone Offset (TZO) and Daylight Savings Time (DST) parameters from a supporting node. + +[The Time Offset Report Command MUST be returned in response to this command.](04.38-time-command-class-version-2.md#4385-time-offset-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = TIME OFFSET GET _ _ | | | | | | | | + +## 4.38.4 Time Offset Set Command + +This command is used to set Time Zone Offset (TZO) and Daylight Savings Time (DST) at the supporting node. + +This command MAY be ignored by a supporting node if it relies on another source to retrieve the TZO/DST information. + +This command SHOULD be ignored if it is not received at the highest granted security level. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = TIME OFFSET SET _ _ | | | | | | | | +| Sign TZO | Hour TZO | | | | | | | +| Minute TZO | | | | | | | | +| Sign Offset DST | Minute Offset DST | | | | | | | +| Month Start DST | | | | | | | | +| Day Start DST | | | | | | | | +| Hour Start DST | | | | | | | | +| Month End DST | | | | | | | | +| Day End DST | | | | | | | | +| Hour End DST | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 174 of 220 Sign TZO (1 bit) + +This field is used to indicate the sign (plus or minus) to apply to the Hour TZO and Minute TZO fields. + +The value 0 MUST indicate the Plus sign (positive offset from UTC) + +The value 1 MUST indicate the Minus sign (negative offset from UTC) + +Hour TZO (7 bits) + +This field is used to indicate the number of hours that the originating time zone deviates from UTC. + +This field SHOULD be in the range 0..14. + +Minute TZO (7 bits) + +This field is used to indicate the number of minutes that the originating time zone deviates UTC. + +This field MUST be in the range 0..59. + +Sign Offset DST (1 bit) + +This field is used to indicate the sign (plus or minus) for the Minute Offset DST field to apply to the current time while in the Daylight Saving Time. + +The value 0 MUST indicate the Plus sign (positive offset from current time), + +The value 1 MUST indicate the Minus sign (negative offset from current time). + +Minute Offset DST (7 bits) + +This field MUST indicate the number of minutes by which the current time is to be adjusted when Daylight Saving Time starts. + +Month Start DST (8 bits) + +This field MUST indicate the month of the year when Daylight Saving Time starts. + +This field MUST be in the range 1..12 (representing respectively January...December). + +Day Start DST (8 bits) + +This field MUST indicate the day of the month when Daylight Saving Time starts. + +This field MUST be in the range 1..31. + +Hour Start DST (8 bits) + +This field MUST indicate the hour of the day when Daylight Saving Time starts. + +This field MUST be in the range 0..23. + +Month End DST (8 bits) + +This field MUST indicate the month of the year when Daylight Saving Time ends. + +This field MUST be in the range 1..12 (representing respectively January...December). + +Day End DST (8 bits) + +This field MUST indicate the day of the month when Daylight Saving Time ends. + +This field MUST be in the range 1..31 + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 175 of 220 Hour End DST (8 bits) + +This field MUST indicate the hour of the day when Daylight Saving Time ends. + +This field MUST be in the range 0..23. + +## 4.38.5 Time Offset Report Command + +This command is used to advertise the Time Zone Offset (TZO) and Daylight Savings Time (DST) parameters. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME _ _ | | | | | | | | +| Command = TIME OFFSET REPORT _ _ | | | | | | | | +| Sign TZO | Hour TZO | | | | | | | +| Minute TZO | | | | | | | | +| Sign Offset DST | Minute Offset DST | | | | | | | +| Month Start DST | | | | | | | | +| Day Start DST | | | | | | | | +| Hour Start DST | | | | | | | | +| Month End DST | | | | | | | | +| Day End DST | | | | | | | | +| Hour End DST | | | | | | | | + +[For fields’ description, refer to 4.38.4 Time Offset Set Command.](04.38-time-command-class-version-2.md#4384-time-offset-set-command) + +[A sending node MUST comply with fields’ description from 4.38.4 Time Offset Set Command.](04.38-time-command-class-version-2.md#4384-time-offset-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 176 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.39-time-parameters-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.39-time-parameters-command-class-version-1.md new file mode 100644 index 0000000..17f5e84 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.39-time-parameters-command-class-version-1.md @@ -0,0 +1,83 @@ + +# 4.39 Time Parameters Command Class, version 1 + +The Time Parameters Command Class is used to set date and time in a device hosting this facility. In case the clock is updated via an external source such as SAT, internet, Rugby/Frankfurt source, omit this command class. Time zone offset and daylight savings may be set in the Time Command Class if necessary. The data formats are based on the International Standard ISO 8601. + +## 4.39.1 Time Parameters Set Command + +This command is used to set current date and time in Universal Time (UTC). Be aware that the communication overhead may be significant in case routing is necessary. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME PARAMETERS _ _ _ | | | | | | | | +| Command = TIME PARAMETERS SET _ _ | | | | | | | | +| Year 1 | | | | | | | | +| Year 2 | | | | | | | | +| Month | | | | | | | | +| Day | | | | | | | | +| Hour UTC | | | | | | | | +| Minute UTC | | | | | | | | +| Second UTC | | | | | | | | + +Year (16 bits) + +Specify the year in the usual Gregorian calendar. The first byte (Year 1) is the most significant byte. + +Month (8 bits) + +Specify the month of the year between 01 (January) and 12 (December). + +Day (8 bits) + +Specify the day of the month between 01 and 31. + +Hour UTC (8 bits) + +Specify the number of complete hours that have passed since midnight (00..23) in UTC. + +Minute UTC (8 bits) + +Specify the number of complete minutes that have passed since the start of the hour (00..59) in UTC. Minutes are measured in Universal Time (UTC). + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 177 of 220 Second UTC (8 bits) + +Specify the number of complete seconds since the start of the minute (00..59) in UTC. Seconds are measured in Universal Time (UTC). + +## 4.39.2 Time Parameters Get Command + +This command is used to request date and time parameters. + +The Time Parameters Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME PARAMETERS _ _ _ | | | | | | | | +| Command = TIME PARAMETERS GET _ _ | | | | | | | | + +## 4.39.3 Time Parameters Report Command + +This command is used to advertise date and time. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS TIME PARAMETERS _ _ _ | | | | | | | | +| Command = TIME PARAMETERS REPORT _ _ | | | | | | | | +| Year 1 | | | | | | | | +| Year 2 | | | | | | | | +| Month | | | | | | | | +| Day | | | | | | | | +| Hour UTC | | | | | | | | +| Minute UTC | | | | | | | | +| Second UTC | | | | | | | | + +Refer to description under the Time Parameters Set Command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 178 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.40-version-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.40-version-command-class-version-1.md new file mode 100644 index 0000000..f1fd5b3 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.40-version-command-class-version-1.md @@ -0,0 +1,150 @@ + +# 4.40 Version Command Class, version 1 + +The Version Command Class may be used to obtain the Z-Wave library type, the Z-Wave protocol version used by the application, the individual command class versions used by the application and the vendor specific application version from a Z-Wave enabled device. + +## 4.40.1 Compatibility Considerations + +In a Multi Channel device, the Version Command Class MUST be supported by the Root Device, while the Version Command Class SHOULD NOT be supported by individual End Points. + +There may be cases where a given Command Class is not implemented by the Root Device of a Multi CC:0086.01.00.21.002 Channel device. However, the Root Device MUST respond to Version requests for any Command Class implemented by the Multi Channel device; also in cases where the actual Command Class is only provided by an End Point. + +A node supporting a Command Class having a version higher than 1 must support the Version Command Class to be able to identify the supported version. If a node does not support the Version Command Class at its highest security level, it may be assumed that all command classes implement version 1. + +## 4.40.2 Security Considerations + +The Version Command Class provides information about the device implementation. This information can potentially be used by an attacker to find vulnerabilities. + +If a node supports this Command Class and does not support the Security 2 Command Class, it MUST [comply with Table 22.](04.40-version-command-class-version-1.md#4402-security-considerations) + +Table 22, Version Command Class support + +| | After Non-Secure inclusion | After Secure inclusion | +| --- | --- | --- | +| Non-Secure or Less- Secure communication | The node MUST support the Version Command Class and advertise it in the NIF.. | The node MUST NOT support the Version Command Class and MUST NOT advertise it in the NIF or Security Commands Supported Report commands. | +| Secure communication at the highest Security Class | N/A | The node MUST support the Version Command Class and advertise it in the Security Commands Supported Report commands. | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 179 of 220 + +## 4.40.3 Version Get Command + +The Version Get Command is used to request the library type, protocol version and application version [from a device that supports the Version Command Class. Refer to [1].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +The Version Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION GET _ | | | | | | | | + +## 4.40.4 Version Report Command + +The Version Report Command is be used to advertise the library type, protocol version and application version from a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION REPORT _ | | | | | | | | +| Z-Wave Library Type | | | | | | | | +| Z-Wave Protocol Version | | | | | | | | +| Z-Wave Protocol Sub Version | | | | | | | | +| Application Version | | | | | | | | +| Application Sub Version | | | | | | | | + +Z-Wave Library Type (8 bits) + +This field MUST carry the Z-Wave Protocol Library Type. + +[The value MUST comply with Table 23.](04.40-version-command-class-version-1.md#4404-version-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 180 of 220 Table 23, Z-Wave Library Type + +| Library Type | Description | Version | +| --- | --- | --- | +| 0x00 | N/A | - | +| 0x01 | Static Controller | 1 | +| 0x02 | Controller | 1 | +| 0x03 | Enhanced Slave | 1 | +| 0x04 | Slave | 1 | +| 0x05 | Installer | 1 | +| 0x06 | Routing Slave | 1 | +| 0x07 | Bridge Controller | 1 | +| 0x08 | Device Under Test (DUT) | 1 | +| 0x09 | N/A | 1 | +| 0x0A | AV Remote | 1 | +| 0x0B | AV Device | 1 | + +Values marked as not applicable (N/A) MUST be ignored by a receiving node. + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Z-Wave Protocol Version & Z-Wave Protocol Sub Version + +These fields advertise information specific to Software Development Kits (SDK) provided by Silicon Labs. Refer to Silicon Labs SDK documentation. + +Application Version (8 bits) + +Returns the Application Version and can have values in the range 0 to 255. The manufacturer assigns the Application Version. + +Application Sub Version (8 bits) + +Returns the Application Sub Version and can have values in the range 0 to 255. The manufacturer assigns the Application Sub Version. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 181 of 220 + +## 4.40.5 Version Command Class Get Command + +The Version Command Class Get Command is used to request the individual command class versions from a device. + +The Version Command Class Report Command MUST be returned in response to this command. + +Only versions from the command classes shown in the NIF, in the Security Command Supported Report or in the Multi Channel Capability Report can be requested. + +It is not possible to get a version number for the Generic and Specific Device Classes. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION COMMAND CLASS GET _ _ _ | | | | | | | | +| Requested Command Class | | | | | | | | + +Requested Command Class (8 bits) + +This field is used to indicate the Command Class identifier that is being requested. + +## 4.40.6 Version Command Class Report Command + +The Version Command Class Report Command is used to report the individual command class versions from a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION COMMAND CLASS REPORT _ _ _ | | | | | | | | +| Requested Command Class | | | | | | | | +| Command Class Version | | | | | | | | + +Requested Command Class (8 bits) + +The Requested Command Class field specifies what Command Class the returned version belongs to. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 182 of 220 Command Class Version (8 bits) + +If the requested Command Class is supported, this field is used to return the Command Class Version. CC:0086.01.14.11.001 This field MUST be in the range 1..255. It starts with 1 and is incremented every time a new version of the Command Class is released. + +If the requested Command Class is not supported or controlled, a responding node MUST set the Command Class Version field to 0x00. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 183 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.41-version-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.41-version-command-class-version-2.md new file mode 100644 index 0000000..2d9dedc --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.41-version-command-class-version-2.md @@ -0,0 +1,103 @@ + +# 4.41 Version Command Class, version 2 + +The Version Command Class, version 2 is extended to report the version of various firmware images such as a host processor firmware, etc. in addition to the firmware image running in the Z-Wave chip. + +As an example, one may construct a product comprising a Z-Wave chip and a secondary host processor that maintains a security certificate. With Firmware Update Meta Data Command Class, version 3 the Z-Wave chip, the host processor and the security certificate may all be updated via individual firmware IDs. Version 2 of the Version Command Class (this Command Class) allows a controlling node to request the corresponding version information for each firmware ID. + +Commands not mentioned here remain the same as specified for Version Command Class, version 1. + +## 4.41.1 Version Report Command + +This command is used to report the library type, protocol version and application version from a node. + +Version 2 of this command renames the fields Application Version and Application Sub Version to Firmware 0 Version and Firmware 0 Sub Version. The use remains the same. + +A node MUST advertise the version of all firmware images which can be updated via the Firmware Update Command Class. + +A one-chip system MUST comply with the following: + + The Firmware 0 Version MUST reflect the complete firmware implementing the Z-Wave protocol stack as well as the Z-Wave application. + +A multi-processor system MUST comply with the following: + + The Firmware 0 Version MUST reflect the firmware implementing the Z-Wave protocol stack and the inter-chip interface module that enables the Z-Wave application to run in the host processor. + +Another firmware number (e.g. Firmware 1) version MUST reflect the Z-Wave application that runs in the host processor. Any firmware number larger than 0 MAY be used for this purpose. CC:0086.02.12.13.001 + +A node MAY advertise the version of additional images hosted by the node; even if such images cannot be updated via the Firmware Update Command Class. + +[An illustration is given in Figure 10 and Figure 11.](04.41-version-command-class-version-2.md#4411-version-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 184 of 220 + +![Figure 10, Version Report::Firmware numbering](assets/img-87cfd2782b.png) + +![Figure 11, Version Report::Firmware numbering (2)](assets/img-037dc24bd9.png) + +Further, version 2 of the Version Report command introduces a Hardware Version field as well as new version fields for each additional firmware image implemented by the actual device. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 185 of 220 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION REPORT _ | | | | | | | | +| Z-Wave Protocol Library Type | | | | | | | | +| Z-Wave Protocol Version | | | | | | | | +| Z-Wave Protocol Sub Version | | | | | | | | +| Firmware 0 Version | | | | | | | | +| Firmware 0 Sub Version | | | | | | | | +| Hardware Version | | | | | | | | +| Number of firmware targets | | | | | | | | +| Firmware 1 Version | | | | | | | | +| Firmware 1 Sub Version | | | | | | | | +| … | | | | | | | | +| Firmware N Version | | | | | | | | +| Firmware N Sub Version | | | | | | | | + +Z-Wave Library Type (8 bits) + +[For a description, refer to section 4.40.4.](04.40-version-command-class-version-1.md#4404-version-report-command) + +Z-Wave Protocol Version and Z-Wave Protocol Sub Version + +These fields advertise information specific to Software Development Kits (SDK) provided by Silicon Labs. Refer to Silicon Labs SDK documentation. + +Firmware 0 Version (8 bits) + +Returns the Firmware 0 Version. Firmware 0 is dedicated to the Z-Wave chip firmware. The manufacturer MUST assign a version number. Previously called Application Version. + +Firmware 0 Sub Version (8 bits) + +Returns the Firmware 0 Sub Version. Firmware 0 is dedicated to the Z-Wave chip firmware. The CC:0086.02.12.11.008 manufacturer MUST assign a sub version number. Previously called Application Sub Version. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 186 of 220 Hardware Version (8 bits) + +The Hardware Version field MUST report a value which is unique to this particular version of the product. The value MUST be updated to a new value every time the hardware is modified for a given product. The value 0x00 SHOULD NOT be used for the Hardware Version. + +It MUST be possible to uniquely determine the hardware characteristics from the Hardware Version field in combination with the Manufacturer ID, Product Type ID and Product ID fields of Manufacturer Specific Info Report of the Manufacturer Specific Command Class. This information allows a user to pick a firmware image version that is guaranteed to work with this particular version of the product. + +Note that the Hardware Version field is intended for the hardware version of the entire product, not just the version of the Z-Wave radio chip. + +Number of Firmware Targets (8 bits) + +The Number of Firmware Targets field MUST report the number of firmware Version + Sub Version fields following this field. The Firmware 0 Version fields are not included. + +The field MUST be zero if the device only implements a Firmware 0 target, the Z-Wave chip. + +Firmware Version (N * 8 bits) + +Returns the Firmware n Version. The manufacturer MUST assign a unique Firmware n Version. + +Firmware Sub Version (N * 8 bits) + +Returns the Firmware n Sub Version. The manufacturer MUST assign a unique Firmware n Sub Version. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 187 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.42-version-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.42-version-command-class-version-3.md new file mode 100644 index 0000000..42913b1 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.42-version-command-class-version-3.md @@ -0,0 +1,204 @@ + +# 4.42 Version Command Class, version 3 + +The Version Command Class, version 3 allows supporting nodes to advertise capabilities related to the Version Command Class and optionally provide a detailed list of information regarding implementation on the Z-Wave chip. + +## 4.42.1 Compatibility considerations + +The Version Command Class, version 3 is backwards compatible with the Version Command Class, version 2. A node supporting the Version Command Class, version 3 MUST also support the Version Command Class, version 2. + +All commands and fields not described in this version remain unchanged from version 2. + +The Version Command Class, version 3 introduces the possibility for a node to advertise its supported Version Command Class capabilities with the following commands: + + [Version Capabilities Get Command](04.42-version-command-class-version-3.md#4422-version-capabilities-get-command)  [Version Capabilities Report Command](04.42-version-command-class-version-3.md#4423-version-capabilities-report-command) + +Supporting nodes MUST advertise support for commands present in previous versions of this Command Class for backwards compatibility. + +The following commands are optionally implemented by supporting nodes: + + [Version Z-Wave Software Get Command](04.42-version-command-class-version-3.md#4424-version-z-wave-software-get-command)  [Version Z-Wave Software Report Command](04.42-version-command-class-version-3.md#4425-version-z-wave-software-report-command) + +The Version Z-Wave Software Get/Report commands are used to provide detailed information on the actual software running on the Z-Wave radio SoC. + +## 4.42.2 Version Capabilities Get Command + +This command is used to request which version commands are supported by a node. + +[The Version Capabilities Report Command MUST be returned in response to this command.](04.42-version-command-class-version-3.md#4423-version-capabilities-report-command) + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION CAPABILITIES GET _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 188 of 220 + +## 4.42.3 Version Capabilities Report Command + +This command is used to advertise the version commands supported by the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION CAPABILITIES REPORT _ _ | | | | | | | | +| Reserved | | | | | ZWS | CC | V | + +V (Version) (1 bit) + +This field is used to advertise support for the version information queried with the Version Get Command. + +This field MUST be set to 1. + +CC (Command Class) (1 bit) + +This field is used to advertise support for the Command Class version information queried with the Version Command Class Get Command. + +This field MUST be set to 1. + +ZWS (Z-Wave Software) (1 bit) + +This field is used to advertise support for the detailed Z-Wave software version information queried [with the Version Z-Wave Software Get Command.](04.42-version-command-class-version-3.md#4424-version-z-wave-software-get-command) + +[The value 1 MUST indicate that the sending node supports the Version Z-Wave Software Get Command. The value 0 MUST indicate that the sending node does not support the Version Z-Wave Software Get Command.](04.42-version-command-class-version-3.md#4424-version-z-wave-software-get-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 189 of 220 + +## 4.42.4 Version Z-Wave Software Get Command + +This command is used to request the detailed Z-Wave chip software version information of a node. + +[A node advertising no support for detailed Z-Wave software version information in the Version Capabilities Report Command MUST ignore this command.](04.42-version-command-class-version-3.md#4423-version-capabilities-report-command) + +[The Version Z-Wave Software Report Command MUST be returned in response to this command unless](04.42-version-command-class-version-3.md#4425-version-z-wave-software-report-command) it is to be ignored. + +This command MUST NOT be issued via multicast addressing. + +A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION ZWAVE SOFTWARE GET _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 190 of 220 + +## 4.42.5 Version Z-Wave Software Report Command + +This command is used to advertise the detailed Z-Wave chip software version information of a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS VERSION _ _ | | | | | | | | +| Command = VERSION ZWAVE SOFTWARE REPORT _ _ _ | | | | | | | | +| SDK version 1 (MSB) | | | | | | | | +| SDK version 2 | | | | | | | | +| SDK version 3 (LSB) | | | | | | | | +| Z-Wave Application Framework API Version 1 (MSB) | | | | | | | | +| Z-Wave Application Framework API Version 2 | | | | | | | | +| Z-Wave Application Framework API Version 3 (LSB) | | | | | | | | +| Z-Wave Application Framework Build Number 1 (MSB) | | | | | | | | +| Z-Wave Application Framework Build Number 2 (LSB) | | | | | | | | +| Host Interface Version 1 (MSB) | | | | | | | | +| Host Interface Version 2 | | | | | | | | +| Host Interface Version 3 (LSB) | | | | | | | | +| Host Interface Build Number 1 (MSB) | | | | | | | | +| Host Interface Build Number 2 (LSB) | | | | | | | | +| Z-Wave Protocol Version 1 (MSB) | | | | | | | | +| Z-Wave Protocol Version 2 | | | | | | | | +| Z-Wave Protocol Version 3 (LSB) | | | | | | | | +| Z-Wave Protocol Build Number 1 (MSB) | | | | | | | | +| Z-Wave Protocol Build Number 2 (LSB) | | | | | | | | +| Application Version 1 (MSB) | | | | | | | | +| Application Version 2 | | | | | | | | +| Application Version 3 (LSB) | | | | | | | | +| Application Build Number 1 (MSB) | | | | | | | | +| Application Build Number 2 (LSB) | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 191 of 220 SDK version (24 bits) + +This field is used to advertise the SDK version used for building the Z-Wave chip software components for the node. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the SDK version. + +Z-Wave Application Framework API Version (24 bits) + +This field is used to advertise the Z-Wave Application Framework API version used by the node. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the Z-Wave Application Framework API version. + +Z-Wave Application Framework Build Number (16 bits) + +This field is used to advertise the Z-Wave Application Framework build number running on the node. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the Z-Wave Application Framework build number. + +This field MUST be set to 0 if the Application Framework API Version field is set to 0. + +Host Interface Version (24 bits) + +This field is used to advertise the version of the Serial API exposed to a host CPU or a second Chip. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the actual API version. + +This field MUST be set to 0 by a node running on a single chip. + +Host Interface Build Number (16 bits) + +This field is used to advertise the build number of the Serial API software exposed to a host CPU or second Chip. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the actual API build number. + +This field MUST be set to 0 if the Host Interface Version field is set to 0. + +Z-Wave Protocol Version (24 bits) + +This field is used to advertise the Z-Wave protocol version used by the node. + +This field MUST be set to the same value as the Z-Wave Protocol Version and Z-Wave Protocol Sub Version fields present in the Version Report Command. + +Byte 1 of this field MUST be set to the same value as the Z-Wave Protocol Version field present in the Version Report Command. Byte 2 of this field MUST be set to the same value as the Z-Wave Protocol Sub Version field present in the Version Report Command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 192 of 220 Z-Wave Protocol Build Number (16 bits) + +This field is used to advertise the actual build number of the Z-Wave protocol software used by the node. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the Z-Wave protocol build number. + +Application Version (24 bits) + +This field is used to advertise the version of application software used by the node on its Z-Wave chip. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the application version. + +This field MUST be set to 0 by a node if its application is running on a host CPU. + +If a supporting node’s application is running on the Z-Wave chip: + +Byte 1 of this field MUST be set to the same value as the Application Version / Firmware 0 - Version field present in the Version Report Command. - Byte 2 of this field MUST be set to the same value as the Application Sub Version / Firmware 0 Sub Version field present in the Version Report Command. + +Application Build Number (16 bits) + +This field is used to advertise the actual build of the application software used by the node on its Z- Wave chip. + +The value 0 MUST indicate that this field is unused. Other values MUST indicate the application build number. + +### 4.42.5.1 Version fields + +Fields indicating version numbers are composed of 3 bytes. Version fields MUST be used and interpreted in the following manner: + +If used, Byte 1 of a version field MUST represent the major version digit. If used, Byte 2 of a version field MUST represent the minor version digit. If used, Byte 3 of a version field MUST represent the patch version digit. + +For example, if the node used Z-Wave SDK version 6.51.09, it MUST set the SDK version field to 0x063309. Unused bytes MUST be set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 193 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.43-wake-up-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.43-wake-up-command-class-version-1.md new file mode 100644 index 0000000..69e174f --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.43-wake-up-command-class-version-1.md @@ -0,0 +1,131 @@ + +# 4.43 Wake Up Command Class, version 1 + +The Wake Up Command Class allows a battery-powered device to notify another device (always listening), that it is awake and ready to receive any queued commands. + +![Figure 12, Wake Up sequence](assets/img-552a3c0bfc.png) + +This Command Class SHOULD be implemented by battery powered devices. Wake Up Notification commands SHOULD be handled immediately by the destination node in order to minimize battery consumption. + +## 4.43.1 Terminology + +The Wake Up period is defined as the period during which a Wake Up node is supposed to be awake after issuing a Wake Up Notification Command to its Wake Up destination. + +The Wake Up period starts when the supporting node issues a Wake Up Notification and it ends either 10 seconds after the last received/transmitted frame or at the reception of a Wake Up No More Information Command by the Wake Up destination. + +## 4.43.2 Interoperability considerations + +The Wake Up Notification Command Class MUST NOT be covered by any association group. This also means that the Wake Up Notification Command Class MUST NOT be covered by the Lifeline association group. + +A node sending periodical or triggered unsolicited commands at the same time it wakes up SHOULD send the unsolicited commands before the Wake Up Notification Command. + +A supporting node SHOULD NOT send unsolicited commands during the Wake Up period. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 194 of 220 A supporting node having no Wake-Up destination set SHOULD fall back on the SIS NodeID (if any present in the network) to issue Wake-Up Notifications. + +## 4.43.3 Wake Up Interval Set Command + +This command is used to configure the Wake Up interval and destination of a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL SET (0x04) _ _ _ | | | | | | | | +| Seconds 1 (MSB) | | | | | | | | +| Seconds 2 | | | | | | | | +| Seconds 3 (LSB) | | | | | | | | +| NodeID | | | | | | | | + +Seconds (24 bits) + +This field is used to specify the time in seconds between Wake Up periods for the receiving node. + +The first byte MUST be the most significant byte. + +Values in the range 1..16777215 MUST indicate the time between Wake Up periods. The value 0 MUST indicate that the receiving node MUST Wake Up when initiated by an event determined by the application e.g. a pushbutton activation. + +NodeID (8 bits) + +This field is used to specify the Wake Up destination NodeID. + +A receiving node MUST assume the indicated NodeID as Wake Up destination. i.e. the Wake Up Notification Command MUST be sent to the NodeID specified in this field. + +## 4.43.4 Wake Up Interval Get Command + +This command is used to request the Wake Up Interval and destination of a node. + +The Wake Up Interval Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. CC:0084.01.05.11.003 A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL GET (0x05) _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 195 of 220 + +## 4.43.5 Wake Up Interval Report Command + +This command is used to advertise the current Wake Up interval and destination. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL REPORT (0x06) _ _ _ | | | | | | | | +| Seconds 1 (MSB) | | | | | | | | +| Seconds 2 | | | | | | | | +| Seconds 3 (LSB) | | | | | | | | +| NodeID | | | | | | | | + +Seconds (24 bits) + +This field is used to advertise the time in seconds between Wake Up periods at the sending node. + +The first byte MUST be the most significant byte. + +Values in the range 1..16777215 MUST indicate the time between Wake Up periods. The value 0 MUST indicate that the receiving node MUST Wake Up when initiated by an event determined by the application e.g. a pushbutton activation. + +NodeID (8 bits) + +This field is used to advertise the Wake Up destination NodeID configured at the sending node. + +The sending node MUST send the Wake Up Notification Commands to the advertised NodeID in this field. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 196 of 220 + +## 4.43.6 Wake Up Notification Command + +This command allows a node to notify its Wake Up destination that it is awake. + +The sending node SHOULD start a timer allowing it power down again in case no Wake Up No More Information Command is received. If implemented, the timer MUST comply with the timing CC:0084.01.07.11.001 [requirements defined in the Z-Wave Plus Device Types Specification [9], [20].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +A non-securely included node MAY send this command as broadcast if no Wake Up destination NodeID is configured. + +A receiving node MUST NOT return a Wake Up No More Information Command in response to this command issued via broadcast. Upon receiving this command via broadcast, a receiving node SHOULD configure a relevant Wake Up destination issuing a Wake Up Interval Set Command to the node that issued this command via broadcast. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP NOTIFICATION (0x07) _ _ | | | | | | | | + +## 4.43.7 Wake Up No More Information Command + +This command is used to notify a supporting node that it MAY return to sleep to minimize power consumption. + +A node receiving the Wake Up No More Information Command SHOULD return a MAC layer Ack frame for the Wake Up No More Information Command before returning to sleep. Not acknowledging the command will cause a number of retransmissions. + +It is RECOMMENDED that the handling of the Wake Up No More Information Command and the associated time window for MAC layer acknowledgement is left to the protocol layer in order to simplify application design. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP NO MORE INFORMATION (0x08) _ _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 197 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.44-wake-up-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.44-wake-up-command-class-version-2.md new file mode 100644 index 0000000..a21f0f5 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.44-wake-up-command-class-version-2.md @@ -0,0 +1,131 @@ + +# 4.44 Wake Up Command Class, version 2 + +The Wake Up Command Class version 2 enables read back of the Wake Up Interval capabilities in a node. + +## 4.44.1 Compatibility considerations + +A node supporting Wake Up Command Class, version 2 MUST also support Wake Up Command Class, version 1. + +All commands not mentioned in this version remain unchanged from the Wake Up Command Class, version 1. + +A version 2 supporting node may receive a Wake Up Interval Set outside the range of supported intervals from a version 1 controlling node. A version 2 supporting node SHOULD NOT ignore a Wake Up Interval Set with an invalid time period and set the Wake Up Interval to a supported value. + +## 4.44.2 Wake Up Interval Set Command + +The Wake Up Interval Set Command is used to configure the wake up interval of a device and the NodeID of the device receiving the Wake Up Notification Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL SET (0x04) _ _ _ | | | | | | | | +| Seconds 1 (MSB) | | | | | | | | +| Seconds 2 | | | | | | | | +| Seconds 3 (LSB) | | | | | | | | +| NodeID | | | | | | | | + +All fields not described below remain unchanged from version 1 + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 198 of 220 Seconds (24 bits) + +This field is used to specify the time in seconds between Wake Up periods for the receiving node. + +The first byte MUST be the most significant byte. + +Values in the range 1..16777215 MUST indicate the time between Wake Up periods. The value 0 MUST indicate that the receiving node MUST Wake Up when initiated by an event determined by the application e.g. a pushbutton activation. + +A receiving node MUST accept any interval value within the interval limits advertised by the Wake Up Interval Capabilities Report Command. + +A receiving node SHOULD NOT ignore this command if this field contains a non-valid value and it SHOULD apply the following: + + If the received value is higher than the minimum valid value (advertised in the Wake Up Interval CC:0084.02.04.12.002 Capabilities Report Command), the receiving node SHOULD round down the value to the next valid value but SHOULD NOT set it to 0 if 0 is the minimum value. + + If the value specified in this field is lower than the minimum valid value, the receiving node SHOULD apply the minimum valid value. + +A receiving node SHOULD accept the value 0, even if the Minimum Wake Up Interval advertised by the Wake Up Interval Capabilities Report Command is larger than 0. If accepted, the value 0 MUST disable the timer-based transmission of Wake Up Notification Commands. + +The node SHOULD be able to issue a Wake Up Notification in response to some local activation, e.g. a button press. + +## 4.44.3 Wake Up Interval Capabilities Get Command + +This command is used to request the Wake Up Interval capabilities of a node. + +The Wake Up Interval Capabilities Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL CAPABILITIES GET (0x09) _ _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 199 of 220 + +## 4.44.4 Wake Up Interval Capabilities Report Command + +This command is used to advertise the Wake Up Interval capabilities of a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL CAPABILITIES REPORT (0x0A) _ _ _ _ | | | | | | | | +| Minimum Wake Up Interval Seconds 1 (MSB) | | | | | | | | +| Minimum Wake Up Interval Seconds 2 | | | | | | | | +| Minimum Wake Up Interval Seconds 3 (LSB) | | | | | | | | +| Maximum Wake Up Interval Seconds 1 (MSB) | | | | | | | | +| Maximum Wake Up Interval Seconds 2 | | | | | | | | +| Maximum Wake Up Interval Seconds 3 (LSB) | | | | | | | | +| Default Wake Up Interval Seconds 1 (MSB) | | | | | | | | +| Default Wake Up Interval Seconds 2 | | | | | | | | +| Default Wake Up Interval Seconds 3 (LSB) | | | | | | | | +| Wake Up Interval Step Seconds 1 (MSB) | | | | | | | | +| Wake Up Interval Step Seconds 2 | | | | | | | | +| Wake Up Interval Step Seconds 3 (LSB) | | | | | | | | + +CC:0084.02.0A.11.001 Byte 1 MUST be the most significant byte for all fields in this command. + +Minimum Wake Up Interval Seconds (24 bits) + +This field is used to advertise the minimum Wake Up Interval supported by the sending node. The field MUST be in the range 0..16777215 + +The value 0 MUST indicate that the receiving node MUST supports Wake Up when initiated by an event determined by the application e.g. a pushbutton activation. + +Values in the range 1..16777215 MUST indicate Minimum supported Wake Up interval in seconds + +Maximum Wake Up Interval Seconds (24 bits) + +This field is used to advertise the maximum Wake Up Interval supported by the sending node. The field [MUST comply with Table 24](04.44-wake-up-command-class-version-2.md#4444-wake-up-interval-capabilities-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 200 of 220 Table 24, Wake Up Interval Capabilities Report::Maximum Wake Up Interval Seconds encoding + +| Decimal | Description | +| --- | --- | +| 0 | This value is used to indicate that there is no minimum / maximum / default wake up interval. In this case, the sending node is activated by e.g. user interaction in form of a button press. If this field is set to 0, the Minimum and Default Wake Up Interval fields MUST also be 0. | +| ..16777215 | Values in this range indicate the maximum wake up interval in seconds supported by the sending node. This field MUST NOT be set to a lower value than the Minimum Wake Up Interval Seconds value. This field MAY be set to the same value as the Minimum Wake Up Interval Seconds value, which means the sending node only supports one value. | + +Default Wake Up Interval Seconds (24 bits) + +This field is used to advertise the default Wake Up Interval value for the sending node. + +This field MUST be set to a value included in the range defined by the Minimum Wake Up Interval and the Maximum Wake Up Interval + +The Default Wake Up Interval SHOULD be 0 if the Minimum Wake Up Interval is 0. + +Wake Up Interval Step Seconds (24 bits) + +This field is used to advertise the resolution of valid Wake Up Intervals values for the sending node. The [field MUST comply with Table 25](04.44-wake-up-command-class-version-2.md#4444-wake-up-interval-capabilities-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 201 of 220 Table 25, Wake Up Interval Capabilities Report::Wake Up Interval Step Seconds encoding + +| Decimal | Description | +| --- | --- | +| 0 | This value is used to indicate that no interval steps are possible. The battery-operated device only supports the minimum and maximum Wake Up Interval values. This field MUST be set to 0 if the maximum and the minimum interval are equal. | +| 1..16777215 | Values in this range indicate the Wake Up Interval step in seconds supported by the sending node. This field’s value MUST NOT exceed the difference between the Minimum and Maximum Wake Up Intervals. This field SHOULD have a value so that the difference between the maximum and minimum Wake Up Interval is a multiple of this field’s value. Examples: If a device has minimum wake up interval of 5 minutes (300 seconds) and a maximum wake up interval of 10 minutes (600 seconds), the wake up interval step MUST NOT exceed 5 minutes (300 seconds) as this would be larger than the difference of the minimum and maximum interval. A Wake Up Interval Step of 100 seconds indicates that the nodes supports the following Wake Up Intervals : 300 seconds 400 seconds 500 seconds 600 seconds | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 202 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.45-wake-up-command-class-version-3.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.45-wake-up-command-class-version-3.md new file mode 100644 index 0000000..3128fa6 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.45-wake-up-command-class-version-3.md @@ -0,0 +1,56 @@ + +# 4.45 Wake Up Command Class, version 3 + +The Wake Up Command Class, version 3 introduces the capability to request a wake up on demand to supporting nodes during unsolicited communication. + +The Wake Up Command Class, version 3 is backwards compatible with the Wake Up Command Class, version 2. Fields and commands not described in this version MUST remain unchanged from version 2. + +## 4.45.1 Wake Up Interval Capabilities Report Command + +This command is used to advertise the Wake Up capabilities of a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS WAKE UP (0x84) _ _ _ | | | | | | | | +| Command = WAKE UP INTERVAL CAPABILITIES REPORT (0x0A) _ _ _ _ | | | | | | | | +| Minimum Wake Up Interval Seconds 1 (MSB) | | | | | | | | +| Minimum Wake Up Interval Seconds 2 | | | | | | | | +| Minimum Wake Up Interval Seconds 2 (LSB) | | | | | | | | +| Maximum Wake Up Interval Seconds 1 (MSB) | | | | | | | | +| Maximum Wake Up Interval Seconds 2 | | | | | | | | +| Maximum Wake Up Interval Seconds 3 (LSB) | | | | | | | | +| Default Wake Up Interval Seconds 1 (MSB) | | | | | | | | +| Default Wake Up Interval Seconds 2 | | | | | | | | +| Default Wake Up Interval Seconds 3 (LSB) | | | | | | | | +| Wake Up Interval Step Seconds 1 (MSB) | | | | | | | | +| Wake Up Interval Step Seconds 2 | | | | | | | | +| Wake Up Interval Step Seconds 3 (LSB) | | | | | | | | +| Reserved | | | | | | | Wake Up On Demand support | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 203 of 220 Wake Up On Demand support (1 bit) + +This field is used to advertise if the supporting node supports the Wake Up On Demand functionality. + +If this field is set to 0, the supporting node MUST NOT support the Wake Up On Demand functionality. If this field is set to 1, the supporting node MUST support the Wake Up On Demand functionality. + +A node supporting the Wake Up On Demand functionality MUST support the Supervision Command Class, version 2. + +A node supporting the Wake Up On Demand functionality MUST return a Wake Up Notification Command if the Wake Up destination node issued a Supervision Report Command with the Wake Up Request bit set to 1. + +A node supporting the Wake Up On Demand functionality MUST ignore the Wake Up Request field if the Supervision Report is not issued by the Wake Up Destination. + +A node issuing a Wake Up Notification Command after a Wake Up Request MUST restart its Wake Up timer for the next Wake Up period. + +### 4.45.1.1 Wake Up On Demand functionality + +If the Wake Up destination has important messages to be transmitted to the Wake Up node, it can use the Wake Up Request bit in the Supervision report when the sleeping node uses Supervision [encapsulation. An example frame flows is shown in Figure 13.](04.45-wake-up-command-class-version-3.md#44511-wake-up-on-demand-functionality) + +![Figure 13, Wake Up destination initiates an On Demand Wake Up](assets/img-696723cfa7.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 204 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.46-zip-naming-and-location-command-class-version-1.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.46-zip-naming-and-location-command-class-version-1.md new file mode 100644 index 0000000..73965c1 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.46-zip-naming-and-location-command-class-version-1.md @@ -0,0 +1,148 @@ + +# 4.46 Z/IP Naming and Location Command Class, version 1 + +The Z/IP Naming and Location Command Class is used to manage the Name and a Location text strings of a Z/IP resource. + +## 4.46.1 Compatibility Considerations + +A Z/IP resource is identified by an IPv6 address and an End Point ID. Capable Z/IP nodes SHOULD store the naming and location information locally in non-volatile storage. In addition, a Z/IP Resource [Directory (RD) [18] MAY store the naming and location of all Z/IP Resources; also sleeping resources.](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) The Z/IP RD manages node properties retrieved from actual nodes as well as extended information which is not always available in classic Z-Wave nodes. Information managed by the Z/IP RD may be announced to Z/IP Clients via service discovery [mechanisms such as mDNS [19].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +Commands defined in this command class MUST be encapsulated in Z/IP Packets. + +A client modifying the name and/or location information MUST ensure that the combined length of the Z/IP Name and Z/IP Location is 62 bytes or less in order to comply with DNS-SD limitations. + +## 4.46.2 Z/IP Name Set Command + +This command is used to set the name of a Z/IP Resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP NAMING _ _ _ | | | | | | | | +| Command = ZIP NAMING NAME SET _ _ _ | | | | | | | | +| Name 1 | | | | | | | | +| … | | | | | | | | +| Name N | | | | | | | | + +Name (N bytes) + +This field is used to specify the Name portion of the resource name. + +The combined Name and Location strings MUST NOT be longer than 62 bytes. + +The Name String MUST be UTF-8 encoded. Since a UTF-8 character may require two or more bytes, the maximum length of a name string depends on the composition of the string. + +The Name String MUST NOT contain any appended termination characters. The number of bytes MUST be determined from the command length. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 205 of 220 The name MUST NOT contain the dot (also known as period) character “.”. + +The escape sequence “\.” (backslash followed by dot) MAY be used for encoding the dot character. + +A user interface SHOULD allow users to enter names that contain dot characters. + +If a dot character is entered, the user interface MUST replace the dot character with the escape sequence “\.”before issuing this command. + +The name MUST NOT contain the underscore character “_”. + +The name MUST NOT end with the dash character “-”. + +Node names MUST be case insensitive. + +## 4.46.3 Z/IP Name Get Command + +This command is used to request the name from a Z/IP Resource + +The Z/IP Name Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP NAMING _ _ _ | | | | | | | | +| Command = ZIP NAMING NAME GET _ _ _ | | | | | | | | + +## 4.46.4 Z/IP Name Report Command + +This command is used to advertise the name of a Z/IP Resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP NAMING _ _ _ | | | | | | | | +| Command = ZIP NAMING NAME REPORT _ _ _ | | | | | | | | +| Name 1 | | | | | | | | +| … | | | | | | | | +| Name N | | | | | | | | + +Name (N bytes) + +[Refer to 4.46.2.](04.46-zip-naming-and-location-command-class-version-1.md#4462-zip-name-set-command) + +It may be attractive to use dots in names. The escape sequence “\.” (backslash followed by dot) MAY be used for encoding the dot character in names. A receiving device SHOULD display the escape sequence “\.” as “.” in user interfaces facing end users. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 206 of 220 + +## 4.46.5 Z/IP Location Set Command + +This command is used to set the location of a Z/IP Resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP NAMING _ _ _ | | | | | | | | +| Command = ZIP NAMING LOCATION SET _ _ _ | | | | | | | | +| Location 1 | | | | | | | | +| … | | | | | | | | +| Location N | | | | | | | | + +Location (N bytes) + +This field is used to specify the Location portion of the resource name. + +The combined Name and Location strings MUST NOT be longer than 62 bytes. The Location string MUST be UTF-8 encoded. Since a UTF-8 character may require two or more bytes, the maximum length of a location string depends on the composition of the string. The Location string MUST NOT contain any appended termination characters. The number of bytes MUST be determined from the message length. + +The location string MAY contain the dot (also known as the period) character “.”. A user interface MUST NOT replace the dot character with the escape sequence “\.”before issuing this Command. + +The location string MUST NOT contain the underscore character “_”. + +Each location sub-string (separated by the dot character “.”) MUST NOT end with the dash character “- ”. + +Node locations MUST be case insensitive. + +## 4.46.6 Z/IP Location Get Command + +This command is used to request the location from a Z/IP Resource + +The Z/IP Location Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP NAMING _ _ _ | | | | | | | | +| Command = ZIP NAMING LOCATION GET _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 207 of 220 + +## 4.46.7 Z/IP Location Report Command + +This command is used to advertise the location of a Z/IP Resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP NAMING _ _ _ | | | | | | | | +| Command = ZIP NAMING LOCATION REPORT _ _ _ | | | | | | | | +| Location 1 | | | | | | | | +| … | | | | | | | | +| Location N | | | | | | | | + +Location (N bytes) + +[Refer to 4.46.5.](04.46-zip-naming-and-location-command-class-version-1.md#4465-zip-location-set-command) + +The escape sequence “\.” (backslash followed by dot) MAY be used for encoding the dot character in locations. A receiving node SHOULD display the escape sequence “\.” as “.” in user interfaces facing end users. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 208 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.47-z-wave-plus-info-command-class-version-1-obsoleted.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.47-z-wave-plus-info-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..2d55aad --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.47-z-wave-plus-info-command-class-version-1-obsoleted.md @@ -0,0 +1,14 @@ + +# 4.47 Z-Wave Plus Info Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS VERSION HAS BEEN OBSOLETED + +New implementations MUST use the Z-Wave Plus Info Command Class Version 2. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 209 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md b/docs/specs/management-command-class-specification/04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md new file mode 100644 index 0000000..7d0efdd --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/04.48-z-wave-plus-info-command-class-version-2.md @@ -0,0 +1,272 @@ + +# 4.48 Z-Wave Plus Info Command Class, version 2 + +The Z-Wave Plus Info Command Class is used to differentiate between Z-Wave Plus, Z-Wave for IP and Z-Wave devices. Furthermore this command class provides additional information about the Z-Wave Plus device in question. + +The Z-Wave Plus Info Command Class defines two icon types. Icon types allow for a meaningful, homogeneous representation in user and installer Graphical User Interfaces (GUI), respectively. A Z- Wave Plus product MUST specify valid icon types. Icon types do not affect the operation of a product or how it is certified. The actual graphical appearance of icons is out of scope of this specification. Any app may define its own icon library mapping to the Icon Type identifiers. + +## 4.48.1 Compatibility Considerations + +### 4.48.1.1 Node Information Frame (NIF) + +A supporting node MUST always advertise the Z-Wave Plus Info Command Class in its NIF, regardless of the inclusion status and security bootstrapping outcome. + +The Z-Wave Plus Info Command Class MUST be advertised as the first supported command class in Node Information Frame (NIF). + +## 4.48.2 Multi Channel considerations + +A Multi Channel device implements a Root Device and a number of Multi Channel End Points. + +The Z-Wave Plus Info Command Class MUST be supported for each End Point in order to advertise individual icons for each End Point. This means that the Z-Wave Plus Version, Role Type and Node Type information is advertised in a redundant fashion. The advertised Z-Wave Plus Version, Role Type and Node Type information values MUST be identical for the Root Device and all Multi Channel End Points. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 210 of 220 + +## 4.48.3 Z-Wave Plus Info Get Command + +The Z-Wave Plus Info Get Command is used to get additional information of the Z-Wave Plus device in question. + +The Z-Wave Plus Info Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZWAVEPLUS INFO _ _ _ | | | | | | | | +| Command = ZWAVEPLUS INFO GET _ _ | | | | | | | | + +## 4.48.4 Z-Wave Plus Info Report Command + +The Z-Wave Plus Info Report Command is used to report version of Z-Wave Plus framework used and additional information of the Z-Wave Plus device in question. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZWAVEPLUS INFO _ _ _ | | | | | | | | +| Command = ZWAVEPLUS INFO REPORT _ _ | | | | | | | | +| Z-Wave Plus Version | | | | | | | | +| Role Type | | | | | | | | +| Node Type | | | | | | | | +| Installer Icon Type MSB | | | | | | | | +| Installer Icon Type LSB | | | | | | | | +| User Icon Type MSB | | | | | | | | +| User Icon Type LSB | | | | | | | | + +Z-Wave Plus Version (8 bits) + +The Z-Wave Plus Version field enables a future revision of the Z-Wave Plus framework where it is necessary to distinguish it from the previous frameworks. + +[This field MUST be set to 1 if the sending node is compliant with Z-Wave Plus [10]. This field MUST be set to 2 if the sending node is compliant with Z-Wave Plus v2 [20].](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 211 of 220 Role Type (8 bits) + +The Role Type field indicates the role the Z-Wave Plus device in question possess in the network and functionalities supported. The full functionality is determined in conjunction with the Device Type. + +Node Type (8 bits) + +The Node Type field indicates the type of node the Z-Wave Plus device in question possess in the network. + +The table below shows the current list of Node Types: + +Table 26, Node Type identifiers + +| Value | Identifier | Node Types | +| --- | --- | --- | +| 0x00 | NODE TYPE ZWAVEPLUS NODE _ _ _ | Z-Wave Plus node | +| 0x02 | NODE TYPE ZWAVEPLUS FOR IP GATEWAY _ _ _ _ _ | Z-Wave Plus for IP gateway | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be CC:005E.02.02.11.002 ignored by a receiving node. + +Z-Wave Plus for IP gateway + +The device provides access to and from IP networks and allows IP hosts to discover resources in the Z-Wave network via Z/IP Discovery. + +Two IP services MUST be available to represent Z-Wave resources in the IP domain: ICMP Echo (Ping) and UDP port 4123 (Z-Wave control protocol). + +The device is typically a stand-alone device based on a residential IPv6 router. The Z-Wave interface is presented as an IP network interface to external clients but all IP communication to classic Z-Wave nodes is terminated by the gateway and forwarded in classic Z-Wave frames. + +Installer Icon Type (16 bits) + +The Installer Icon Type field indicates the icon to use in Graphical User Interfaces for network management, e.g. in a floor plan. Installer Icons provide a finer granularity than user icons, e.g. a light on/off resource may be a built-in wall outlet, a plug-in module or an entire power strip. A sensor may be a single sensor icon or multiple sensors in one casing. + +For further details, refer to the User Icon Type section below. + +User Icon Type (16 bits) + +The User Icon Type field indicates the icon to use in Graphical User Interfaces for end users. User Icons provide a basic granularity, e.g. a light resource is always shown as a light bulb whether the physical device is a built-in wall outlet, a plug-in module or the output of a power strip. + +In case of multi-endpoint devices, e.g. power strips or multi-sensors, the info command class MUST be supported and Icon Types MUST be specified for each endpoint. The User Icon Type MAY differ for individual endpoints. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 212 of 220 [Icon types are defined by the Z-Wave Alliance [13]](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command). [The 16 bit identifier values defined by [13] allows](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) the GUI designer to know how a given product would like to be represented using resources from the [GUI designer’s own favorite icon library. The icon graphics found in [13] are only suggested graphics.](04.48-z-wave-plus-info-command-class-version-2.md#4484-z-wave-plus-info-report-command) Output device icons SHOULD be tailored to the actual geographical region. + +If a GUI does not know the specific icon type, it SHOULD use the generic icon type as a fallback alternative. The generic icon type MUST be derived by setting the least significant 8 bits of the icon type identifier to zero. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 213 of 220 APPENDIX A ASCII CODES + +The standard ASCII table defines 128 character codes (from 0 to 127), of which, the first 32 are control codes (non-printable), and the remaining 96 character codes are printable characters. The table below shows the hexadecimal values of the ASCII character codes, e.g. the ASCII code for the capital letter “A” is equal to 0x41: + +Table 27, The standard ASCII Table + +![figure p225](assets/img-81079508de.jpeg) + +In addition to the 128 standard ASCII codes (the ones listed above ranging from 0 to 127), most systems have another 128 extra codes which form what is known as extended ASCII (with ranges from 128 to 255). The OEM Extended ASCII character set is included in all PC-compatible computers as the default character set when the system boots before loading any operating system and under MS-DOS. It includes some foreign signs, some marked characters and also pieces to draw simple panels. The table below shows the hexadecimal values of the OEM Extended ASCII character codes, e.g. the ASCII code for the capital letter “Æ” is equal to 0x92: + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 214 of 220 Table 28, OEM Extended ASCII Table + +![figure p226](assets/img-5494f2b277.jpeg) + +Below are listed codes for players, radios etc. as an alternative to the OEM Extended ASCII codes. Undefined values MUST be ignored. + +Table 29, Players Table + +![figure p226](assets/img-dcd97ada58.jpeg) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 215 of 220 APPENDIX B CRC-CCITT SOURCE CODE + +The checksum algorithm implements a CRC-CCITT using initialization value equal to 0x1D0F and 0x1021 (normal representation) as the poly. + +/******************************** ZW_crc.h ******************************** + +****************************************************************************/ + +#ifndef _ZW_CRC_H_ + +#define _ZW_CRC_H_ + +#include + +/****************************************************************************/ + +/* EXPORTED FUNCTIONS */ + +/****************************************************************************/ + +WORD ZW_CreateCrc16( BYTE *pHeadeAddr, BYTE bHeaderLen, BYTE *pPayloadAddr, BYTE bPayloadLen ); + +/*=========================== ZW_CheckCrc16 ============================ + +** CRC-CCITT (0x1D0F) calculation / check + +** + +** In: byte string excluding 16bit check field + +** Out: CRC-16 value + +** or + +** In: byte string including 16bit check field + +** Out: zero when OK + +**--------------------------------------------------------------------------*/ + +WORD ZW_CheckCrc16( WORD crc, BYTE *pDataAddr, WORD bDataLen ); + +#endif /* _ZW_CRC_H_ */ + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 216 of 220 [silabs.com | Building a more connected world.](https://www.silabs.com/) Page 217 of 220 /********************************* ZW_crc.c ******************************* + +****************************************************************************/ + +#include + +#include + +#include + +#define POLY 0x1021 /* crc-ccitt mask */ + +/* CRC calculation */ + +/*=========================== ZW_CheckCrc16 ============================ + +** CRC-CCITT (0x1D0F) calculation / check + +** + +** In: byte string excluding 16bit check field + +** Out: CRC-16 value + +** or + +** In: byte string including 16bit check field + +** Out: zero when OK + +** + +** and + +** In: The crc input should normally be set to the initialization + +** value = 0x1D0F. + +** It can also be used to carry over crc value between separate + +** calculations of multiple parts of a frame, e.g. header and body. + +** + +**--------------------------------------------------------------------------*/ + +WORD ZW_CheckCrc16( WORD crc, BYTE *pDataAddr, WORD bDataLen ) { + +BYTE WorkData; + +BYTE bitMask; + +BYTE NewBit; + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 218 of 220 while(bDataLen--){ + +WorkData = *pDataAddr++; + +for (bitMask = 0x80; bitMask != 0; bitMask >>= 1) { + +/* Align test bit with next bit of the message byte, starting with msb. */ + +NewBit = ((WorkData & bitMask) != 0) ^ ((crc & 0x8000) != 0); + +crc <<= 1; + +if (NewBits) { + +crc ^= POLY; + +} + +} /* for (bitMask = 0x80; bitMask != 0; bitMask >>= 1) */ + +} + +return crc; + +} + +WORD ZW_CreateCrc16( BYTE *pHeaderAddr, BYTE bHeaderLen, BYTE *pPayloadAddr, BYTE bPayloadLen){ + +WORD crc; + +crc = 0x1D0F; + +crc = ZW_CheckCrc16(crc, pHeaderAddr, bHeaderLen); + +crc = ZW_CheckCrc16(crc, pPayloadAddr, bPayloadLen); + +return crc; + +} + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 219 of 220 REFERENCES + +[1] Silicon Labs, SDS10242, Software Design Spec., Z-Wave Device Class Specification. [2] Silicon Labs, SDS12657, Z-Wave Command Class Specification A-M. [3] Silicon Labs, SDS12652, Z-Wave Command Class Specification N-Z. [4] IETF RFC 4861, Neighbor Discovery for IP version 6 (IPv6), [http://tools.ietf.org/pdf/rfc4861.pdf](http://tools.ietf.org/pdf/rfc4861.pdf) [5] IETF RFC 3122, Extensions to IPv6 Neighbor Discovery for Inverse Discovery Specification, [http://tools.ietf.org/pdf/rfc3122.pdf](http://tools.ietf.org/pdf/rfc3122.pdf) [6] IETF RFC 2119, Key words for use in RFCs to Indicate Requirement Levels, [http://tools.ietf.org/pdf/rfc2119.pdf](http://tools.ietf.org/pdf/rfc2119.pdf) [7] IETF RFC 2460, Internet Protocol, Version 6 (IPv6) Specification, [http://tools.ietf.org/pdf/rfc2460.pdf](http://tools.ietf.org/pdf/rfc2460.pdf) [8] IETF RFC 4291, IP Version6 Addressing Architecture, [http://tools.ietf.org/pdf/rfc4291.pdf](http://tools.ietf.org/pdf/rfc4291.pdf) [9] Silicon Labs, SDS11846, Z-Wave Plus Role Types Specification. [10] Silicon Labs, SDS11847, Z-Wave Plus Device Types Specification. [11] Graphical UI elements, [http://en.wikipedia.org/wiki/Graphical_user_interface_elements](http://en.wikipedia.org/wiki/Graphical_user_interface_elements) [12] Silicon Labs, SDS13425. Z-Wave Plus Assigned Manufacturer IDs. [13] Silicon Labs, SDS13738, Z-Wave Plus Assigned Icon Types. [14] Silicon Labs, SDS13548, List of defined Z-Wave Command Classes [15] Silicon Labs, SDS13783, Z-Wave Transport-Encapsulation Command Class Specification [16] Silicon Labs, SDS13781, Z-Wave Application Command Class Specification [17] Silicon Labs, SDS13784, Z-Wave Network-Protocol Command Class Specification [18] Silicon Labs, SDS11633, Software Design Spec., Z/IP Resource Directory. [19] Silicon Labs, SDS11756, Software Design Spec., Z/IP DNS Discovery Support. [20] Silicon Labs, SDS14224, Z-Wave Plus v2 Device Type Specification [21] Silicon Labs, SDS14220, Indicator Command Class, list of assigned Indicator and Property IDs + +[22] + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 220 of 220 diff --git a/docs/specs/management-command-class-specification/04-command-class-definitions/index.md b/docs/specs/management-command-class-specification/04-command-class-definitions/index.md new file mode 100644 index 0000000..da54a55 --- /dev/null +++ b/docs/specs/management-command-class-specification/04-command-class-definitions/index.md @@ -0,0 +1,63 @@ + +# 4 Command Class Definitions + +The following subchapters contain definitions of Management Command Classes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 4 of 220 + +## Contents + +- [4.1 Application Capability Command Class, version 1 [OBSOLETED]](04.01-application-capability-command-class-version-1-obsoleted.md) +- [4.2 Application Status Command Class, version 1](04.02-application-status-command-class-version-1.md) +- [4.3 Association Command Class, version 1](04.03-association-command-class-version-1.md) +- [4.4 Association Command Class, version 2](04.04-association-command-class-version-2.md) +- [4.5 Association Command Class, version 3](04.05-association-command-class-version-3.md) +- [4.6 Association Command Configuration Command Class, version 1](04.06-association-command-configuration-command-class-version-1.md) +- [4.7 Association Group Information (AGI) command class, version 1](04.07-association-group-information-agi-command-class-version-1/index.md) +- [4.8 Association Group Information (AGI) command class, version 2](04.08-association-group-information-agi-command-class-version-2.md) +- [4.9 Association Group Information (AGI) command class, version 3](04.09-association-group-information-agi-command-class-version-3.md) +- [4.10 Battery Command Class, version 1](04.10-battery-command-class-version-1.md) +- [4.11 Battery Command Class, version 2](04.11-battery-command-class-version-2.md) +- [4.12 Battery Command Class, version 3](04.12-battery-command-class-version-3.md) +- [4.13 Device Reset Locally Command Class, version 1](04.13-device-reset-locally-command-class-version-1.md) +- [4.14 Firmware Update Meta Data Command Class, version 1 [DEPRECATED]](04.14-firmware-update-meta-data-command-class-version-1-deprecated.md) +- [4.15 Firmware Update Meta Data Command Class, version 2](04.15-firmware-update-meta-data-command-class-version-2.md) +- [4.16 Firmware Update Meta Data Command Class, version 3](04.16-firmware-update-meta-data-command-class-version-3.md) +- [4.17 Firmware Update Meta Data Command Class, version 4](04.17-firmware-update-meta-data-command-class-version-4.md) +- [4.18 Firmware Update Meta Data Command Class, version 5](04.18-firmware-update-meta-data-command-class-version-5.md) +- [4.19 Firmware Update Meta Data Command Class, version 6](04.19-firmware-update-meta-data-command-class-version-6.md) +- [4.20 Firmware Update Meta Data Command Class, version 7](04.20-firmware-update-meta-data-command-class-version-7.md) +- [4.21 Grouping Name Command Class, version 1 [DEPRECATED]](04.21-grouping-name-command-class-version-1-deprecated.md) +- [4.22 Hail Command Class, version 1 [OBSOLETED]](04.22-hail-command-class-version-1-obsoleted.md) +- [4.23 Indicator Command Class, version 1](04.23-indicator-command-class-version-1.md) +- [4.24 Indicator Command Class, version 2](04.24-indicator-command-class-version-2.md) +- [4.25 Indicator Command Class, version 3](04.25-indicator-command-class-version-3.md) +- [4.26 Indicator Command Class, version 4](04.26-indicator-command-class-version-4.md) +- [4.27 IP Association Command Class, version 1](04.27-ip-association-command-class-version-1.md) +- [4.28 Manufacturer Specific Command Class, version 1](04.28-manufacturer-specific-command-class-version-1.md) +- [4.29 Manufacturer Specific Command Class, version 2](04.29-manufacturer-specific-command-class-version-2.md) +- [4.30 Multi Channel Association Command Class, version 1 [OBSOLETED]](04.30-multi-channel-association-command-class-version-1-obsoleted.md) +- [4.31 Multi Channel Association Command Class, version 2](04.31-multi-channel-association-command-class-version-2/index.md) +- [4.32 Multi Channel Association Command Class, version 3](04.32-multi-channel-association-command-class-version-3.md) +- [4.33 Multi Channel Association Command Class, version 4](04.33-multi-channel-association-command-class-version-4.md) +- [4.34 Node Naming and Location Command Class, version 1](04.34-node-naming-and-location-command-class-version-1.md) +- [4.35 Remote Association Activation Command Class, version 1 [OBSOLETED]](04.35-remote-association-activation-command-class-version-1-obsoleted.md) +- [4.36 Remote Association Configuration Command Class, version 1 [OBSOLETED]](04.36-remote-association-configuration-command-class-version-1-obsoleted.md) +- [4.37 Time Command Class, version 1](04.37-time-command-class-version-1.md) +- [4.38 Time Command Class, version 2](04.38-time-command-class-version-2.md) +- [4.39 Time Parameters Command Class, version 1](04.39-time-parameters-command-class-version-1.md) +- [4.40 Version Command Class, version 1](04.40-version-command-class-version-1.md) +- [4.41 Version Command Class, version 2](04.41-version-command-class-version-2.md) +- [4.42 Version Command Class, version 3](04.42-version-command-class-version-3.md) +- [4.43 Wake Up Command Class, version 1](04.43-wake-up-command-class-version-1.md) +- [4.44 Wake Up Command Class, version 2](04.44-wake-up-command-class-version-2.md) +- [4.45 Wake Up Command Class, version 3](04.45-wake-up-command-class-version-3.md) +- [4.46 Z/IP Naming and Location Command Class, version 1](04.46-zip-naming-and-location-command-class-version-1.md) +- [4.47 Z-Wave Plus Info Command Class, version 1 [OBSOLETED]](04.47-z-wave-plus-info-command-class-version-1-obsoleted.md) +- [4.48 Z-Wave Plus Info Command Class, version 2](04.48-z-wave-plus-info-command-class-version-2.md) diff --git a/docs/specs/management-command-class-specification/assets/img-02b3ab2b70.png b/docs/specs/management-command-class-specification/assets/img-02b3ab2b70.png new file mode 100644 index 0000000000000000000000000000000000000000..e3520ef3a2ea2e3b1a0e4e1e32999ecb3fbe7c9f GIT binary patch literal 62086 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-037dc24bd9.png b/docs/specs/management-command-class-specification/assets/img-037dc24bd9.png new file mode 100644 index 0000000000000000000000000000000000000000..0d41af879ce1f78c8eb1b37959a93c1fe880d533 GIT binary patch literal 4786 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 Q`w2y-1?b%=R<#QGFK%Jcd;kCd literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-3049bc51b8.png b/docs/specs/management-command-class-specification/assets/img-3049bc51b8.png new file mode 100644 index 0000000000000000000000000000000000000000..785d03b0c8be3f12a7666fd4b1cdd7cd6178875c GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-5494f2b277.jpeg b/docs/specs/management-command-class-specification/assets/img-5494f2b277.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b0ea1d500a1e6f2f8e42290563caab5162317cce GIT binary patch literal 72548 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 KTq^8aB{7bfhsX3d&q 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-696723cfa7.png b/docs/specs/management-command-class-specification/assets/img-696723cfa7.png new file mode 100644 index 0000000000000000000000000000000000000000..2407043978bedc2ae9eee03294bd5d8113d79e82 GIT binary patch literal 42990 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 Z;Lmm<@K`UQi&hyuq$?>uuWzX2 zEjhf~)9FTEKTYKrzEd>VI8R)qle%7D=vLx$$^@>{?R%tD%-M{$pK=7 zb~VhrDIC^V+Ig7_@i-m}ywkomdPcf@(*8UU8ZUDS%kjm$#Nx8sbT zrXpX=zKn0L-ObO=4)Z83vBXoBg}RFB07RQK}B)GA$5SJ0{-p5eTp+Gr=Q z6QWBcbY!j-4=AJCImrbR)_soWt}qg9%U=aHq06GWUsUTaMaHJ4fg3(mJ~=Ny;7S~0 z#S#fOKo=hcUErd^%Snj+~pII|wR!$)a(LG&%gsUH3Nf&SRI1hA3)|#QKk+ zSC{|_ZFf+X_7AP|m}i{(yA%?I0b#z(SA?oC^q;B#?{Qm01IIEa=?WyIp)W-cs>1Sr zssdt+&wIM1yemo<=6&m2Q#kxjQ@}@To=tz5uC=m};gY)y(P=R}?)qO1PX8un%3b>)rZZTE85`4?Nj z8B{V*shqGTq=X#gxRmX5S&%j^>{m{C>FodWF4hya^nxTk9;q^dchDcHaD`jQ{+b46 zuWB0$pBgsD=v1cOWX5h>=gj?^`;Q_daQK6|MSfY8M6HmK@&9Xrp~G$u%ez)UbnocR8*w(LTmlC>pNx$r?*Hd`gaIfu{9o z>9&23{VEb+`Ul0z(AT)e&nFvoK-@_#%dh60!%xaL)mgF%CSH8I38oUAA?c`a>58r! z@^zbjx9Y1mqA_9066)`JE2!R4x9I?Dnmx!5(ohIR#!zVAOO|#a94XwXePTnrp7%_@ z@}|^=4v|84IaYZ)&_Zp#>!A))BeQz)#g8}`2Uu>GS`9#LuacT7iu8wE+E`^|>CV_* zQa-%(q2KS92aj7u@FxVk^Cs!SrfK&(`K2V_2UuG=;v1)Eqzp#f3goWy@i0ub{9ziu zkLHgS@=1)a;{E*;8Mf~i;!0NS5KoSVxb>LwojM-~qbc81)7()`g5^#$BcQ z=Ni7(WaGhF004B_Xa~hs_Ww*v;`k=pN`J=7%1oy1N>>@C|I!+75UeD!q~lOFr6^LAGWsk*(!*BY~rRD;5IQY{6B!y zJjY$X+3yeg7asn#89hAbRn0-`W@9^iKjbQRR|bi*@Z2PV(1TX8x2^U6`C8L(hz7YQ z(;N&o8_uW)3WsQh?$EhmC|J~mAr?ry-XY)?UeQr$(O=7;`+bpq??qa~ zER{ktCh-luCj2L-B=|@-ZljUk&qgo8is#;5deD5I2D$msh6-C>NkQghvuaTjrGjO< zas%akGY?^Ns)L_m$(3y2x+Z}MN~Le=(8;;!uVKI`G#JdJcq%* z*jp;h9JASz_z^s}Id0YLZ>H0=Gpk(!<3$b)&)}BsXzh`u!Ts>>Mo+>6RkQkXNbu{9z9&*cG>oP2 z!g&KzC=7K%nU84RhVGZRpGxQLntiM$DDf3s6LbW;%ItM&ryo6Z5PFhBGNs7$-m70- zNw$Igt;W{iH$s+FJxfMZ2DVp+5gJY%(-cw1ck0LY(Gm(klrkm_}zBjHi|@Og|E9($M*zT)m%I=Tq+5Vcw*M&5y1(J(WN07`!L6z#Z=p zf3HowxFpD$#g$Pnx6-xld657k8=jQIc_5$T$Iou+z)mHa=gleh68zRv9n^QpqU*Ke zUE|FpHT=_jg-MJ4?(eu{-6cNu=%W`$7gsni?t_-CfIGh5S^bIj2C8{P(Tfkcs=hVkxn$R zi17h`SlEqGLV&cFDmz?{!N~d)3)M4i!Zwx=FF~PQK^~rp&Uz^TUVwIe%zWRFh3*4D z(nwJ)wz|ejN_^YhGe@4u*A!SZS*HEl$x7u{vN)yzjdW{RM!|FP(;m-di#*1<(|CiK z$uXt{#>oIV$r?ZC=}Rm;hNnvzs!S$QiV0s--2g*V_-}s*SdaMm2XL2X^GLZq($s4e zOO?rE0?U~UxC{ISLh2bFm5MchScAKuChZCst!f{?zKI|f1s7^5WAljyIjN17VW^(H z=ELpyqQqQ%RkYVS<=bQ+JrTOP-v%9r^{odM3}z?iBp_6bxKir}GVbs*ahOW4b)92w zm^|^PogM?2Y{YoJ*VRJjH(|yWduG8zrMShQSh^D0+R$f_ZrdUGV6{>qG_v!rZT1)p z1F5j~>RTIiGOsaENVR3O>XoY#k4@Ak%Wr_jhBpu)W#Orrt5;d+4Z9@EUp za!G%#2n7j3#d#Yz=n&L7w*a++DBeavXRZ2J?rI)KQ-pPUpF#-&Y1MyUQ2E%{KeqJ0 z_C_KHI*zV0zu8HAjo5Hs^XK$u;O&$9Hs_n~xbNvq(yoY+paIUUFEi~k(Sa39Q!Fxk z()EI%CNO^et9=~!x3cVN1OFl(e%tA2NmxV*1A=)g!TUQ=*%W{sp#zTgO|=Cwujy@X zfB~9S5GtZuuA_nA%l8$pL=gM-ThEW4vn#xJrv?0MXYP)d?TsjgNCWdqC>*4EH%e+O+(@($@LAC7Q#T6k3!r}LZ zS27CpvP4yPp)k;H(&xLUSWoAmXM`b(Dgp&%-z4L!Z`oxPy+cI_(N(!2X>IzBwPD%r}vT4jy=ct^^{G z)r%0b6S8Nve6}I9AiL%sIF7T2t*hrvNMDPDlGUzD=}z8o>y)N=81TgH#s%A!8}Nbd zogyp|bVR+0n5yEyb@XsBcle^$M^fp!L=L%)sG9-V{YqZP&9RvXcZ636=;dM?H zWkjKLslOve)N_QP#_4s_g;|8mE4{{UK2$%H{ zm}am$!$sI}eD!Kj93D^sG{~>GM+ohL!s-fr>AF-w?L|+t3IYl+;!9^Fyzexc2o^jc z0plT%1+nkX_Ie6Z96Lv^Z={N!H4N6c6n9bTVG|pUgS>(N&xo(Az^6~kKp}DNGLQtI ze7=XMGcS8$RjLT}Wba%(LG;AfK$jD|7(}#wt5oY@THqrMZG>C|d;!vfYMd-rz3Bg1 z5UAsA=0l0QCjj^^DkRbtv$~053GV9-!;O8H?xI(|ZE~@h#!6Ov;0xfd|9Z$h3GZ3A zj3@BN~Cwp@W7y3D)rnSCmcaR z1|3vc$8u+aoM);H!?_w#y#LlvS&bLqA7qibiuSMOd%8we$a#Bg?AxAj&^B%jdz*d76_QPcK-_?wM}ece$u7c{f7uKP5%}jv3Xm=YQ6m?Bs_L(F zVISSgV9=Rj5knlP4VtiJo*j`rpA9WHVt-o56dsKj6frJcoO1LKWlnGAYFsL9O6&`N zJV_c%_eyYvQCTwAxK;4AkUK)I#EQgK84ffI*L6q+K(J`^!>~%Zrsvl>eE{ zDH7Db+y`>k0_S&E!khN_LtF4_0BiIRD30&0A}=4NlxN-tH9Iz-4TJbS^230Ad%2`= zrGX4x8BROAihvH66zA#j>x+RRNtzy$Na6Z?)vjPZ_Y3ek&w@gIsM*Qdv?l*mfVp75 zD6faM?o5C5aJ;3!=9*OukBt4hYM7xgNHh7R@#2eWqlc2OqW_y`rYb=_3u&CRCEmgC zy7^bq$l$YdTG%ZvBc%%S@jgK#KD@hpAqfdCTb;alB&i>d*6ZsHI-)AZ?X)WA)Gd(u zOPuNtm+}mgTz2cvPKs7M8aKw@O}Om;_1&&Fp*~AnTIIs)rNy+xm9;^?5URrvkeGnp zom`;D=jdN@f0OpbRI`6U&DWVQ*=&XRu7o&lQ<6cy`h!l3rQxFbm*26*Hf~Tl7mIqK z6B84cPwTmz*jC%EqT}46>f?97gC{W;)o?&_ifT4x6coBPXFC!kNpZnL}+Bld`+FKdnWM{Wn`Sn>U=&n`4R<9H# zE`{JH8mph59?mt0jD@+fF*E0>=aIDCQ+;eb_j6d!tyYEQUxvz#9ht9RnD_hlbXE7R z9F73#(~xJSJJ?SWR#-j=!hTiRE^nvVEcW>bFvz~3_`21lA4E~mdAL`9rjzyrck@a4 zwCPZON^hQK(dl1bN_epF?ypxi$LZk;&_zM`{6=*Bv5#Zi!&mQ1jGEr#s@Zf4jk-`f z(=%Wm?XEJjusCn`N)_Btov1AwAFbT`;}j4OuwFUsR+0C&$v4S<%0Hgo?d)j6IA?hv zNBrz;|A(+$fpr)EyppjF%2x7zx%2VHkCHE6?x*pcZ1*z;#t1p_;8uX>%6$G7EtCHa zu0-?I9B>u!J)hp?z5n1R3}85=0BE9q)Lvi-JFFz+$6Pu-JzB3I4?ceP+3N;=rpM{w za6KG8H)lJ$ za?{SD`qL`)JPj0doP|HNPL;GT+9MdZH!JE-3ZDHfsQ8mQSFWM!!5;Z^y)+r1&r8MCN&`RhY!Ub{0?y;ilH5v}`HV;?y2Y`3Dmw;2(& z{sHZ9)D6Zh(vZvpU|I>oI_y}UcYM2PR zDuErZy{k`C&X)q8;F_54$_4yeNDJ0=JJ~6fDKDR+>G@J3{3OBc^Z;yehVt~^ja`ho z*0qc|8v!E$r`;9m2JoD^f(Lv?1pQg6e5Mwj@Ae~zJc+A#RRvuZI@gs@ZNKsI(1WBw z!{dvAK%LXxS`SR@#S7}%ZO5oK30hdP|JkCV+ZT!y_@99SMdJfQ zzMT&u@erxZWH9wnMH$|>d(1uRBE_@eBE6*Js9}*Ap6o7fOroFn^v4%k+1(C0=;dQe z&BlfVPe%-s3=9l#Z*w#YesSC}*>x|=nUNAc41H!|O))@CcWZU5f_Ge;Dq+g}W1!PQ zPs)c6SgLml#!QQ9=LY#BgYNQ&X_UQadas)&vnX1mTMH!tGjIQKT8|;V-;jLowek9& zTDScs%F!@y5!E?%DrUM)hImU){`(2!GMGOpTE&yz{c#v*&ku=`` z$|z~es@eQIoF^J{o!0&aoUml)zOt@=f16-iqCV z(|0Of8}(<(r)fmoh?TnEopLWi^>g$h&R||)RXcrVAK#9R(C4~%KC3C#ir+7v+!b|- ztmg~;)*|yc9KLhscGLptsX9_CsDRE<8|@xx-%vMu+%(IFnb*^346y7MB7fEvvyw8k zxW|i^2lEW;9Nb-7+uEp;_CVH!6);FiM|qmBmg@<{I-i~FvBFDRySjMXOe^2c$}F9Q zD?W|^SZ_>a{WFMC&^|=he4;L)_INJNVzkuQ`t)F)^0D)NYv{dTq1~sz39Z#N;HJs< z9CQdVpf;5(Z`zI!wMCbQlJT0$xdxH^>jrN80A3=G;b$Yu zd*JkddtwuuOV+2w?uU1|O(I4xx6&9A?P(&z&L|!{hm29b4kNH>KSnE6*c#HZ$WVCt z;fvMulM>&~INtuy&CRz0j{q9il(CmQ&k;G#D$SDNSh*R#@bQDr;bU23x4lHCwXZ+O-`!p1 zg8u_aGXIgYD_Ozl#liU7p}-ksc`~1i8Em0 z3;q*nv`@lceG(g6@>rY}#;gyD3J!grcp7US5!AD*!VHxAY%7$ zXL*rsgs%j7{GB|?4AxflTz{W_*spog)jze5UN}JgcaDE@cH8e*x6wsEjr`Q*^-;~- zyl~LYyXQ6+>^>V?rr?i!RXAMcMq6FA-CA|7zRBY3&aj?^8MpJkr9kWBx;a1`==OeR z$dYpC=SQsU6u)T7Zd7#L47WT#SgYgJya&d1-p;JX4=8gO7-UYXU;PNmr1jM1C?k9L z64i;{{5Rk7`t*-rO2tJQ@`u98hG(ZI+nar|>;~+NX;f~DxkK-VouK>6Z>9nImenSR z%m`t2`5K~5gnv^&?TD~j9W{tz)2oXQD!$Pt#(>!j63SXe6Wa19UGdQ>*K$&doJ5#6 zLy~jf;e3$r@n3w*>FF?|*txHnfud}`9hVBEan&1WJ?uPpx(Qd_5k%0urKi9oq{EcQ zk+m_sVp@oLvhbBcO2LFxNQYEfwhZ)*#fd(z{no?xVPViO*nor_Y~P>J1K0B5?&>l( ziPIm)<)MPe_ahleyk?_n#)1oS!r@l>gNNIT{kiIS>-A@U@{-2Pt2++^tm!}ItLW+` zc3$|rxE6csc&j_hOZaG{Tl>+T&LD-5W5`)~?PrglY=d7HQUjQR;djf;%N2g2VG0Xf|hG#e|A$vLe*-6`_^;iZm~lfv|g_Lm*=L+k}ftQ&Ckg$H?p*<@#9WG1}_q78o5YWsOBHB*9c+U9- ziib&D#$l}07`fqJ9}eSxxe0^ru8d4CeY$D>^5ik+lXBYTC|cA6 z4mTv7ELdFuNT!u}Z1$QEreA-aDH}Vd-6l7zZ=vUfWktGBw^+Dt-LYFT?23nxgw%d7 z2Tsrr=qz8a*}^-D!};0*{8GEoa;LDJ*(V%zY^{LnF_TS$CtB%7HhrKaEh;GL~% zTb+s?7_#WtPp;oKhtMd+?YHt!iSi6$j**q7AOV|&=N*D*!s817@iI&l1vgMn7v$b{gnE?+>Y478Q-OSBDx`9OB>J-nau!8*4&^f6{JDcz1A#^7`KCAppQKk77gqUtq)x3nuUcjLCGg1;vkk9@VxvTaTl7)j!5 zZ*Py6T(M%@!Zg<0lfxp4`tkbBej(F=*q4rSjeI;OdmG^ybS^OG+>QeJ9l`j<$g^7VWQ;bn{sJkrVE*YG=;=tMhJr2Qa@F*W~G; zxfv?ssTKLZ`jiO9_4NaO1nsBg8gN5@@t2g8|3AkZk#=|zsAA3 zzkMtWb;HcqE8kL7)T6}nd6?yT?Vd^*t5&&E_E4_6DFAqz5U9Iut)n^_Wra*u7)^w_ zf_3&6+829k<3nCFFysVNndkdNiU}Z<-*<*ZEo^K3R~N%P*KF=ogq6DbMdPTRSt-Emc9>6ye(?BbZfR+RkO6`K z^*XXW`{JE(Ti0Udxx;W@hOCZkOdRiob_c<;`S-YY;KD-TLExQ=Rs|2>vCBs#3BSU; z*Xxc7U5<83!)CIGems_ZEemDxsmLJO{oy?USoV;YCk%Nt6=03Hz- zEmttd%&_!v!l=Z<3HH+^?{o`p$u;hC?yTSSV2p^=e;UkqfotaZc|;(0A}8|~kYI{tfq$2{39oZ*Z;;MFw9t>4F) zOq-NkT=LD%!9}IPX&hlGJi&YPG{Z>LZ8CbFWp-3s7ktb|13=&TOO!WjkOZrG-hiyR z0Z9L=#trA_bpb;|LvSYy94E7GR_oIhz&uSWc;cDG@dgi~pv>j8DVqy>=zRxtZf{N^ zzjDF|MxsiEq$77qJ}qFd`s@_h;cT$0#tGOm(NP2NdERkms zBmsq3A*39j2ll^eTm-%E-GoU*9QOC8gWD*>OP&D|pYZO_!8a8A5Ox-J_KK6&&t=_Sy&+LFcq5f%*79N~{>^lBdD7Sv~cE`4_45m}?e=k$PL-?A#pv z$KdIj#mqQ>&)@6Vz8x<2(aA>jg!c8RY#Kg#x0a4KQaSh0Qz53_y$&We+Z!yh+LzHG zNvc!&ZvD?}M|6qm>!WZC2czACy}4nXP;A9plppHfjBu2UYFX4u%2om72Kh-2$ZUiv zd8}XFJ`hHtWQ(fg_|!%9I#Idmt#{Gnz>s4wm*VroR_&FQl@Te4Q5^># zUy8G+<2UZ3-Kq{Z8OrCkSy1Ydistw=FBn$x+10{ywzvCV%GlSfMeEIpmFkcMbVYH& zjb@_lEp<(u?=mA}w+g?`k(HeOjNv4T>Q=)|33pyv87XPQ{7k>IJe(Ds`T6;SAL8_z zGvSJ_9|sGzgHmqwFy;^^RNV#C;jL>u0uKzMl9DW3UKwRTv zC7Sh9PsGqTV*^%Ho>jGYH?-+hlYyb3D*liKx$n`$Ilmt{^fBdj;Oz-SalOrd8tju&+Ag*S! zotcIIGll-`4j>Ph3V|{$DL($Lmi2@g48}(n^;3XTI(Rk5<-O+QBSaNH;um52>Bb1} z^2q6eCLrf09eSrPT^T9p3QJG>vlJ^5rJ~sSxJLBG7Q9uS$PfO+QWQSnS}pzj>c?TB zxDt?N-)hmb_A+%_M4(Wmi2yMbTpHVgu0m!fJhja6k}Bb-Z;62v7qhjmspn$Axe?iN zhbSRQ?hptTHQRl%GpY%SvQAbrt%Sq)8fSnU)=~^6Pjh)65bzI{GCiCSFeYz&JtV%6 zPND0vGYEjDX=m$cK|RTN5oM_0_`FNZQk{{A&w2mBJc>w8Bal+?ttG}hA2gqPn=x?h zaAhAzglC%_?ADL#h8&i1D2L}4VVp7iGBFa5ecs=!+n)+}E$q20XJYK~OO)(8|2?gW z!s*cF4RywhrLPLJ{NEA-HNut}SgJI(9!9}wD!jM~Iayk5F z3d6Wbr%D-Z0JExJYb`r)on=bQ@A;7G7P~r?!g_c$FhK{-y%ixiBYYHF<5BLqto!QR zM+9WU^Og|E;pE}slSOKviPt_USg3n&%oQy)3~3d)RI~r6^7IaMFF$MtdakGcCXW*5y;HlIi3gjjrauL;J7;6>-xo(2{73FfzXYu5vJ8^T-d{^Q$JXli^naF{*OSw#xAOh-pN{|4oY&}2=o+?x?2Ah+2sAu!v@MM}U`7)i z7rt^n005^hyH6QPkEwaRPl2Od8Bp$;RxT7TnH%PPPb$cHcf?S62cgYL4XT&c09svC zcbIEJ+;Ayz*XS<2mrvaH?0CeTCKb%aXytIGn7J{isV8)_QgU{(?)GX_c)EkVUc1ah zJ)B-1lw2Ch%Aw^}2NL15r3(?I5?QA#*W}->WXWidHD;=pQ7@Dmcu(Vb!nUuAaUr|ukyH5Etygk=> zfS*z|?mhYVtIp*JP{FEq>k8~`pB;cw0x)NBAAk|~ixmL(G3FEal_?(=!)a*#yYh2t zswWgvfCE%T018I)`OQYT1onX~zYdRqc)DN@WF0&(s`*4o`|(VHq+ z>XP|58uS^u-qRf#e>j0CabLoIM1mu+*$F!9W`blWEv5w!k`a1ZLc%z>EEsVAIB&@t zh67R(8Jn+Fp^&Z!_~751ti;slTBkj`)5iU;^NFwOClNqBLI{H)PaiH9Wlejb<8B@f za?eV-9rh>XOPwBcy8&S;Vc;Lo_{u5Hz?q|T*;W=%$T-);rw4vVc{^{mF#sjKM~c!# zUr4&Gj}o*QfOqEA5aRj|^^cf28ILWh7BfNNEeLuW*(88SDk3hMW zE(*F8n5HH_{=uVUUKuQG_s)FASu2sthd(0Mx-D>(m^_aq}nkr zg&}IVm%5yRY!P@>-1$f#fCdI7Vb_i4i*neSq4GeEp}CnP}L1>lhjJUvRcO%?#I|LWk)MM^@_*I+W3`+08WRA+}^W~&P5(n8Nb z0reT4Ap-L(65QPcm+_;&-b6nMeQ|ETlz&?j<&#V_oTtg2Hwp`7>~S75esT1!{LBV%9dFw`L0cDb%c>w-(oES;U5XR8k?ceU%c>q_n6y_1(gAAAJpV7Qyf zMBPafdKWL2CK-j_Z|bsCtsNkPt{$>HXR3uT_R0Uw|y;4HUHOY-#(WO#mt?i$KWu zt}7!C{rR_sLaE$Q11iT8wB7Tu4%C-`oepP)Cjt#RCQ^#R!F$O2Sb$#=uA(us+$enf zuL+RT+%2HZyMk+Rh7ojpU?}`-=r-@*~Mh%w{>@~ z$b7uDLV|#8-Qg0msXW|z^ld)WP!W>}-!IsuoYa`(#m9o=YB ztuxPRpP~^ggJ3Qa%*>K+Ee7jymh#Y8AQdPnS%T|L@7=g9ZMW&wxo!o2X~4^iM_Lyt zQBVmu=?T5rIe_DY-Y}bRJ39d_p%T$Hi`9wxiIFVQ*J0oO*iY`v`yu35HIq{^6}vD? z&^M(2_(M(m`%@uir_m*#NLXrsW-zVh%&1opHn{bLYSU4h@-4fC_GmxyzNxe`Iv2bX z_-@0*K)b4~>GM4Rnzgrq;tD@I`TF@aqmIw!gq{F%IW8WQtm#3i;4`9jW1#UgBFtfhC z=i#i?Z-Y7-<2sOy?+(O+E`s*UN90`{0R?Ui*sIn6G(cu+SP) z1{AI-FZ|i|E+3^K+J?95-twBAI0kAx3h0ZceXv${WWK9J@Y$%BW=jz(U-9kpz3;un_xIoD z^KkC_yv{kV^BT|B^L1J`ZcV1ZhG(-2J1oAna@!2)b*H7bwri54UP~j9L+dZ8v$j44yh7^# zfO12iz+}R6y70uLSy_ueQ{$om-D>T%lrz}6B9ku=YTd2_90r@pY!r5RS^U!nsB?lP zX))_;rdN()dUnQhQ|8B-(+23^*k#AezQQn2^*2x|)r1Ozd`7r3y>nMz1XE_Y^sTS8 zS{|}!ptoF2=Pc;oyWE@v~IpHKZq!w)Tl?He)?-l3_v4OE0v!-=7(N)t_ z?{!(+WZX<%syG}dMmA94Nd6@0DvR^w0GirHZ_F9xqz=#*y?OtVbrl3Ri67o3 zC+mYFVtx4d?xe1Q$3+X>)&XB#+GW7Hi`5P*#`+ z@Wjq+70|#h0q&rs^)^v$so*DrT9lK7WirQ)$)WX6PbJoUX*rQ^LKz6~L{372I}evu zNtp6|OqugkC*wR*+@)4ib3+@npiJ^2nT=+EJ0DbSh<1h4-*_E?1#58MmOJ=13-OB= zoS62n&zvo<+1nR_j;RMcspD;LtR+5r_Oj4phPRJ5u@yR@nj?mLJDxKnIrhKS8joh0 zg5dvwld@mC)LRFEDIi)DNcqvXwym@B9KIxD73G|7lsNz2>;Fhk-ec>r8}d=6?kjh7 zy|kHkv-J1XnFMhEZ8!51&cp>0Y1;$p{5g-E>GkV((}kCQn0(NUco!m^m1V!63y*Wj zQ~~A0Fny>vFX+vk{oUPKLRMq_!QiGo9dM}!CplRO`J~sS>n#aM95MyNA?jnpK<4-n zuJV>CuGub?gN?0rSwF;jrcElngF-#vesM|1I{7E{sEFu<0HzC3mGpym49)< zOVsX=?_FEpb@g(ayxK@s$R56lUydctvj7@Pm&lLjrLGl=a&9tJKt}3?>j_a=_^g6% z2{4_&+r~#gh{{7=HdjURSpHj2SS&SE4Z9n&^=@X_D#sqx;y&N{l$4u zX_LR#$EV0xCFra6iZk`8dcZc^Oh z{Gk8Z%8KG1e*;1kc0Hp!I?pBDp|C#wV4(Z=K$ey_DT?p4z)yc<5EcO-vxrwAlF!HV zyA?JTLZ}nYMcNUuPfl<7)CT>RIa*!&<40SD_D#Aw`Gtjrt&Asx)Ge34bCA;TG0{Lp zO6ArIK&u5^jcTv6Y`#~!KWlPd=9-I(h)=F=T?C|tnHjwLeI+aGc?u45xcgV7Xo_k=got zQ1`IMx2nYJ{nUi#D)#+mPdS=anN=n7&=n&0sYfSLIM$XLk&qn2RB5Do-p6k<&NAYH zNZe9Vq$$*ZsMT#I%?j2GI}fzpdHHzJAZseyv_ooNr=bX79!e7Q(T67mMx#DQ70q^S z4KZw=s{D=RH}1H~op>Z!yIf@YD3}s1PiG>-P)<$GqOo|$D3P-HGWYb|h5R7{Su`ZF z>LF%as#(7$(lU}*1Am?U9DO6;DpetP)*z*pG5($>`y?4izTX%ke`=g$HC_O9A>E&0 z15P*H7XCb(6#as;9-K1$Q-(}=hKa_u$GqlE;==lI z<-qv(c!2qq7l3x9Zzz47T(uOC;9w8Nch>hY#a~=hjW$gtfd`on43cGG#e`@7IfHK> zA4O<49~OY&l121WqXSCLMO!lNcj*C#NR#iKK8v+Rz~@N!&MN zW$RuBK{6$#7w(%`9d}e}%Mnbi7Tc858el0=_9Nj-6Tcos=bK^roVY()YCTr(TzPZb zdExsJOs@0Pris8E)aPY=MR*nafot>TBdi6Oj(#e(=S$*Qn zS&eeZE{FTCb6~KYWqk4?jSx=*_Jy+5K9v(R(f zx%>H+R_(*K_lH~7)-v4;4Yc1}>3(PWkymB{iY{Y4?ht_Jwp%UaEm>9H4Iqw=hK#w> zT2_cUkg0R|wTXQ+cVbht`YQ(;U+M4YYHDma)iX?b_R;ptO<Wa%EEzp6bc#V9{>3xX{}G&#S8OKX6`SF| zH1PmI?jxm_kRUNcn=%i;O-&;G*oREkFEU#Tr+4CTXnR&X6I zN7#Uf$`6!xQ_{^*2bVXrs1wjJ58qHzOm~p)S{dTQ%&K|enB5Qu(8Ywlvft0|UV zr<%rkWzSl2NaC6I5loEbOa`7KQ?LG3EAPpr|7!)&kbQ&n#gtqPKwbTfrBez(7wa6Il?=qk$X1HRJ>~i znteX!9>Wvmp+LZy2#a+oQpvtHEEzkCtoX#Vzz?EcuKe*&}M z{DIr&_MTcM>@4!QhBNZG#=j2+F$KXxUFtikXDDxzy__@qlC!vN*IsaVLnFMMAc0j5 z{Ra{M)d@A1aj84x8X4ewLgw2Vv-Fc6c;+Q_!1JX@^}?S?U;cB*8hk9uBG@QpqMH_a zIW8pF8R>VLgu%ds-2)ZU+#UyH{=Pxzsey)3sNrqO_A3{qF;#eb+)|jE+zMhP*T&;$S9?V^Dcgq32BFoO-r~dXR zwUxpNv_Ia#G>jss4<|Td%ti_c)3lZT0Oo%Zq2~)Njm}Au9Jt@L0=k0q7DA7Z{{MUY z5jRHXw(6hAukX$9PwH{zjBASJd&Jaa5IXCTl3rU5Pnki2dJ7&F;UIJYWEI@X4#L0R{BgCH2TQL-uD! zbNC@`qKWorwEW*z4Or2Cu3}(&@4qv_5X19<$om#Zs}%4b)Sf$&qfiysi(QV6w>54S zAaA@N&AGVEwqXtoz`AUlCu}ynr3j~a0bj0c%b67oUxwfTd2|u!N?YB;Jurb=8S>0U z*}rEliW!8LjKM|b9ejI*}>#=H&k&^_k66Va3NO9qwsF0@hHWXkaPS75B+)~n2|7=y9O`EDcR4nr4nQA7+ zfm4(hQ(xuU9pR8hGd&w?j@V$#hK{o2YGh^f@3TEqBpa{D%&Cn&xpc?8Axexg#<{yu zEV!VJT=31`halZH9e;Vso*U0Q@YM9l>AeYi<7JKDslmoFuH%JBE8nrBaVB>aP7NEx zoYjjK|8~S|Sdi#_VO6#njbL)X)t1Hh&reyu=cnCeryh@0WT{?=q%X-C|8OGVgo4CV zrK?s3^6+SeKF0QhO8}hTxv#&DRGgL|!EkxpGcl*B5h(vyM|twgx0hsrOm?nGl5d$R zm+v$@ZMLLArB}Q!k=`4Z$Qwl8SoU5CdD8UQ(Bywa>FJ^TgDc~|ID}?4I@8#El`=j# z?O(0$vW+;sK-zSEz{8BC>_DkklwM`NNx`AKp|W3>1*3mm_P#G{nk`Wl{VIdr^>mbr zga=ty@NBEZS&~b8n1}Kn*cetVHKyHGoVw01uHvUyQRfYRZ|#-Y>E9lk_#)$0MGRPS?!Dh$3Jz;IAf&{{1ysfa%= zMBhGetQ;OoJ9YHJnQOWJssCM*HA3DAbjBEbV+U2cb-2d0rfL$T5maF_oK6yq777 zuoUnnn_m56v9nJbyhDj#k|JM$7t78yVk}5cqr+vbxH~_iRf@tH>nRjeo@tPjyOuT0 z-=(p-C*fx9}~Vc@P$i^gLLw~2w3{$HN$vU)6KKb)bhJ|S{%@5!!3dbUe~u1S1* zQwI5ug=ZP5oR%F>C%SZqisEs&5=n~Tshpf7qcxx(Uw9IM+)^>GnCqEp`i{RHdQ|pd z#ttfzUEJ?N9!#$sfKh*&0#ADI+`R2~KlXIsA;IA%KTHmUGaEuZ@4h$}Dc_gv$fUDCca zT*=>XW3PE4FZ6DKt%No%#2Ju?l@DHlXXPjzzl_UE1e@t(n14?9FiQEBa7UY&;=#b8 zyFZ=u^|zrZY_^Fl{oz(d-%>-*T+-1dtxuezgzwV|Gp6q6*neWL_p7R=)sfCuVj2eW z2n`McG&tmG&8`R8>>stBJ#xPMOTzf&tM}#+=Uvp>&$@L|5`LdIKH8x1^_WUJ`~ay^sL)PY{Zf1;^tEQmiQn5A9)b*DY>#~l*o1qas4 z`j>~-JeYr&_FdE$*Cs7X8|Wf`&z7;Dfz`+E|{UJI%sYK)siBT^3SRfD_= zd1G(*VdRZAC-u*7ehYfNvUp?vA~I<9lEveN?xeCCZkoho9H%2O5>MDGL+cfsRPH#* z|Ebjldk+sMoqi`o%pa#^h9~#q?Qo%*aS)m-27e^jmKH!X{I8mE+6Ql5D z66^JyD^fh)1K#&RQ?M6w4IZVqeLR_gOJ-wfAb;gcb)eR+C*uf~g*in;yq3z_y)=4Wy* zwZ>dBK7K!5MnXyWh^Ct26%+1hY)G#MoaI%@JzuY>KQa6QeOqM@JV(-kAra7bJ4wobMoA?0hXVX2(Jf5#o5A2mQTCczSa@pCt zsuG;hEy<_(jVGc`iWMCe{hleY(E6isfQ$Hs$A1RmbL>WFio4`QVQq_%_MFq$k^TD! zURLuuJM_KASt1?ioNlwq*KpjSHsqBFY#HvA3Gn}oFWe|d#@pcCXrz<<8?!mP)-OEb z%Zt1#;f#M*0tOb{y3m{{p_3``)+_KyzZxk%B*1ZER)7aQ6ry9Vg)r-Mn_35m_<*FSOKL5y%*QCmLiqQtNnjh1XKkyCPDzmp^Yw`oJEP zepBIgjy>;(IOc1KvM14JeGVzPvm7Q)C5>^Y{eYEB?`?+AOU=snD@Rk~Cj58#lz7#& zz%#EocSfBTJnBL8%cG%8ug!V0nGE+qzSq${ zYVnmr$g~<~-PM)c`4P!t9Ys%~Bf1lxqfj{=7i>69J!gW+_O1?JV(f`OUGhNsmdQ$B zIqzhdsZ6BR5!6#E%>xaQDxW9lY7(BKTngn5<|iLCLngNz5YL_&<Gm6cM9UYc~#8ajj%q=-!TM6N{l?3@3c29xMlR}|abc$$s~^|tz}IQ7r8I1??&s8TgciAWj9_$aTb${aRHRl2Q_(o3z&t_ZXZo-^9O8rt~G9!jYf1Y zBOTE#!ZClE)Rq*lnzG0J&5FUktK_5_)(^Bt>Fwz&u;0`DJ{hnP7t@pl52CJm&zwQ@ z;3n+$-^s_S&3+ceiaZLziPvlUh2u5@2gQ*%{IBQg%;492&K`unYIv&0n}Ze+G|{Jg zF)1vml|BMK=lkTq}LanCN*=qTy$BTogl*tEgj)^R#hV%8Z zug`~;1(NMW-Fm#BX)fC;D@!B+e?5*~jDTrX7hjsWupwtC-JsbJp8wga?>XW3$OsS{ zMrdtZM;7-c=3RSyNV1-s;K8?e{np~v{S_hUI`_35*&dx+MA$ahqbW@0e-oi;vS(fxUkquh+Jcb!1h3X&~9&P7qg(KO4=)dv)UOd#$8R4bDC6HRb}v&XMsi z&!2CxRu#$bwqQ5(3^6(RJ%{>M3jP>U)3uGMHotMl!d*P_z5O7S%UH+5B-6l@2hocU znz^P~epnIvR{n4#r!!MX!cJMFO^51sR+K#o;Hc4htsd_jzP$H5CC=PvSyJ;!iB}CH z>h~%k@A>l9rSZ!$FXemBj~R1>!;-7hF-oXRu}n1d!AJ$$(f_LAc`L&$sC4)s=W@a9UZo4?tH4N> zj_~J3NS2RQy#$4mQ_gw8kvJqLsB}AIsKal>rASW767w@aV5v$o@B6V!){!4Vqa1Dv zlyRiauFBq)ZO!d=rhe;&U*FyQggW;1-ceD1vb}E))+jeO52^97C6edS)-m6m_$o76 zXUk7Z{?Kp2#qz9+DRJOz03FwPjM&);p)HFZG->gUNE4CWb@2=$D>R@JUXiVlf_c@P zk%c_IoWiCLR*W(EW1MS(BXXm;#{LmC^Os-53Ta6vad5w2b+G1KpY>LYPo&ZJe0mUn zfFx>y@r(mgj>Yy4f?U)vTgSw8u*7{2m*Bk&7ndMeg8Uo>ChyaQF}Z_f7M+4wtVk0$<0 z?4hmo^`(C38SNmjTrndRmazSW4Yo-jXh#ilpV+@wT?97<=D%XR{CU2a^0Ij1a;PM^ zdV!hmQJo*LR$7j_*cSzQHi!nGyUSFP&M-~iYi&E~YSc$o7cIm+yymcyV|%=0s4~X+yb1WsueIGf<&^4_?dJwUS5>5M#1+vc^ zf92sGm;ny*mck)y`;T`EXQ?-%-Dzu1*v-v?c~f7D-?Im-Pty{rT0-|MpLgHS8pPIm z84Ily*$ct%VVdNt_%$u8i)D}H_id*-bDL}{otBI#g(_FB^q_Gua^yRv6#GF5G~q|vdf*0(*}oCZgu49 ze*AaT_-1@O+#SuRHuJ_XMWm=?yKaW9M0+8g+!dLBA2RApq5w%~9pmQGA{ZjqjZrAp z9El1E*v-XI2M){?Ln`Ol-gXw3dy21>uAwSgySKj4fbDni-kC^w@iho+xwzIHdo23M zaWv{}>XhAYm67Sjf+7`y2ii>3Vsj)1om%^thS|PkaP7V{>S=1$P!m7AR+TQbGb-JA zNVmxrV?G>Wjf}bAx#{_=(fV-gRO#r~jU;8no#v86ol%3@*}clX&|_jVaRJ3g@wb*{O!ue`)@d&-^!i8qX0SAFcH$3jed z&XbC}X_<8Ug0XU_xd=l~-CTc0B>CUXQp#M3^c;z+?r>MB{j_wiT<|WN?6*I85LIC! znj;ZOh#VRU`uH7J3 z`x1ctrji^@-C%v;hTuY&kvkc@#q=RI(bF1W&d2;pm+q zmxi9HF6t_sTjvnpi&A28ncQsLqAMESC1A#I$7hoF7lY&R{C29$_uP#w5 z8hbNRvRt=)-*O%Pv;`MFf`;GAQy`opjG-aB@_@=2TaQKJp<|s(Uqq!iZr7^)3x^y` zjtfD+@Vo~02lsbJ*ovKKF5~0#(Yko;(xEUU+&cYP57fkk^=~xRXf!n7t=p7uB6J=J zh`!Brx`JipC9D9#p)MYm@9gVv{z%k(?vm3CKUm8i&VRvT#>^R50;bDV0v9d~SkAVf z_vGXK%`fMgV14N^nowLMwz8JYoT{FsMpzl>O5|*jA=T!OJ|ucWc}0s4sYSii z;=fYvY|Mn{yqD^ttk6sRvC!m8EWo)Q$NMz(S=V3e>my4@TnQ_4p3r_5qTgh(b7rJh zRwLloZKn9WnN{4T0>vO)1PDcPr+-hv(r~5@q(?H3?gysge{BUs1$m+ywffTcTDXwS zImkhAfdW4@80^pN>q)=V@p9R&VPNWkJ3CWP+bzmxkI{5H;0By1+>q%(^MWzP2ltIe zbFJzyv*9!ZK``_0aZF^s`1IZ#e^g)7$LC%4KqnNZPjG)_cf{tkTBpk%qvo82eMEj7 zeiP9)NON$e6r{F^wr^)&2X76hh&q?G9WEM{|2b;??2dS(vCa+b>+6Yh_^m5P=Sx@< zYzG)3&@UqlpUJ~D2jNy3um@*2IjzjA7Xn6hJ3 zm`$g?SyWt#;ap-*jD0xRbe1mjtZHF>Bx{3G%p1nIhp&aV-zPIiaBCCRYerHU_WE;h ztBgWxD51ZmObvKkgGJNto{*yTPS^hqpYGxcN zCF@)5VqZUzZJ7A{RCa<$7~_NUFWq}0gQdmK#1!pKbc^_>Fl) zrs!pgRPo(E&Nk)eh}^e{iNjuj^I37%g4EB5YBOh?JK^~$zba++6x))!jYX6uJb@8S z@lw))(n%GnTr4fB>?@4c*w)$)tYcer{Fb7+Z5Ik><7)XhMY%#VjvOMy7=1?_aM|i2 zE?YfC9%{;EFeFzx#4$=-*>|#w|4Ct#oZcr5rHN%ul?gi)ZcQ~q`kLe!mC#u!gKdMN zDY9X*(m71iEO$fH8G=Ox5r?=ond#B1C-#4DK9iK^_d+=8(d<}3sc_~{{xXSNDM!ee z4sIc>4B>1Y?%H{hqeZdIEuK@5*EG3s)?^&<66e~u*@Lcw>x;8wj@MEmA`En^{UEKj zI`Ug3CqLUMIAt`A^?v7Sh`3((k~&tEmg|d!H@j3V-B+FLR@raVUpFNHlK7UyK%wHZ%=C*Ox=21vJSFUQ*x$*8+xMX0_k`s9 zsuSob+g}%LSR)fXa*X>ep55{dIY>ByJG$wSlxA(EAPoN}nrthV5YCpwqjfpOi9$JM z_XWJ2v*jRxlw^IN!Dm@6D}(<`r+62?bT9QfUD;asytdIr2w`#g_$+av?$1F&poU&A6nY_Dr|mt~(6cKd#k?fgmKTqZVA*63G` zCHpHAw_XD`o6FR?O0(FlfCz?cC!N_#9I^Mh+CKQ)H|#d_do18Kq{aFE+2y5Gl+e}c6Y)?>sGbD~J)Zoj;$c4%(6cL9nb2u!wDi#>~7jZ4p0Gx0VA7od- zA%Z;#qjc>r z+caCc`Ud%)VEw7fTX6@85_G#3lbP2$WAV}E)?C#sLl?y~)kQ~6r*pVCB&UE`P!1Pn zxE@CbrK&gUQfdMmnj!^ZIRo*%awAt*dFMSys1Fo&&80&^m$|3pKi?t?{&|^z1wo{j!5!p`C*df zn{W7$a3krJv-E1;>rTseA!F;VGB5W-(1Bake8iT%wB2ebX1jT~ZVzNw+`16dcPwQ* z*1q!;4Yw2WL1gvjHBTWYRVdrq%(v2Qo`1NTm+o3o8!gF zJ$Q);;LS}LL3YGoAgiyNJWv;paoA47t^SJ$y;FJJ&#t0m=Az|9W2LLa_|^YQ9`UOe zWIUd2I9b;{P?0NoXoP4HFL&zS>=8kG<=(UsSBCNOn|j8)!zCJ`hly|G8u!qU60h_j z0a4iLl%rMY$;@g;@+GuiF%jj&;TQimbA&hqHZVcq;8)14Al_S?a8+==a+Q%FkQqI% zcNv7d|HL+1F7W^*aytKfk0D;sa^pu~e*lU^!b)U1w~LN0J!oM(0E+0VTBqYT_Vqej zO(X#NC(yBciS3KLZ&1U@2a!RB(=`0vWmsP}WGb(paL>(NZmNg?q6#hrr>sWXZ$Mf9 zinX#9_Eec%J}*0N7;l1&7~rQ*Xz-^y zEi?;;ci&CqKAyW|`=AG{xdpk&-@`Yu5x!65Ji65a(w+(AYWH@-I+5O0R)P?*wWXKE>F@W=FcT(HU8MWW z0()}x{uKAsRq?7naJDM=SW#3=SXE=&Z8zDYgi z?Re7fsV{w85K=(YwL6zl1x{%HHFMdVmmvpVftC=hz54JU&DZ(}NsNdcK)@*Xgg-Cc zlY(!{S`F9|j?m3XLizdbyz$`ogzcW>F<0kftNx8A^CcMY0LljO9|~1cKKe3!D(CLJ zcgP}{c)uUYr}!D(y-}SOA2RkG^FJefv@dzP{Hj1Q=u=E7;@6r!F`lvp*&=tz)+-eQ z`9<#bE8Hq|q%$}Au3eo7$pL$?Mvf1A@r&rS)$sIiFN4y7!llySJy(gx_4MeiWt9Ow z!|q-PC_AsWi_R?L_$k%|?Rk`c=d@nv;!z&I^${EJ93oP<>VPY5(J}8DAR&(jy#JNY zlo35DD`IgK?c_4DEH1kUU?)$Q?^^^Q0FLST2fpLqdiK@k#umM|^XHWx&R+@62*!Q5LlkhhkQQ6A8zzo>W zf=5>crQ@qk+#lpJa*^XgLQ#rk?Z!lZ}(QKPCTXymo6B2OU$>7Zu}XrCWnS zeOZoW88>=5-V8rgY+RHR!*Ex(d{c_?6_cg(aF0K!Yzmp3D?S&*?|N8x2fG6|gX{sB z-+#Q8c$khUoZ-}7lMY*YT1iSQ={GWaK55k|YxLTA_&HUsDF|JuXhsN6aQDhXq5Kim zW)*@rp;;NwH?ByU2Jt9fU(+wR!JZdb6c7crZ_P8OCtly$8s=HZl~ zDPE*KD$3e(N~--KrefIQQgrqFL_nU*`VaGrEcfpYMIS^}vAW9){*R#1y@#Y?n4OvP zwS^8FRFS^de#5+R29-GrQ5o*A06%JEUtg0?|2KvDdO&Lkvn_V8z}Z*UM&SMgYZiS? z)}t~bbKH94&mj`^$ra90Z03XTO#4ruRMUBf}&9 zh`+?&$=T)_Kuk>Z-;f1-8>Unbv2|+FJ-w7x)$7f7S|*ldIxOeY5VQK;APfKa*kbp5 zZKbxOI$iDPvo+&4Jh|_v2VHtkM(}lv8|QtC4-~OIJo_hj$dfjM zXZ&?y6sPTZtXROq(K1IFM$1@c-tx`(8$XrT%?*#Evv!}=^_aC*_I3Ct-SB5syX1Rw z;&xB@jUR!nxk2bY82faHf*lhQAlgFrq?6r%rq-8POT||y1lw=nI)%|K;*hcL;Vy{H zdEHq;Ut^BJt)$v$9YQvI4Fm~OaF%zf{7<;*BE(08vznwcGw?G!bg$lYEn)7UjGom^ zqryYjugeQbeTPDy7cku{J+dNujybbjDaH0}kQoX8$MA}aH&xMU0YPDP!&Wb(@@QFj z?N1=8;oWWwc0TrR$bvZH>#>`Fo_8+L{F_aC;gM?j`JSvXz8U9$NARqJM99W62OSs3 z(&fNBbAb;-o!lmmh^JgWsrrRj9l{o}V~Vsb>ikqc4l9Sm-oE2f(|y+=kM@1!s(q65 z@Gz(d2NZAA;&H_rBy`8AJ{c6BRTr~IIQ{V&^3k>gdQ`W6BszyfpFM@f-cb?*0q-HL zWs^I8{_FNl+DUyK=$oOlEJkY=q^6u~8)CRIsz1su^kmC-^6?rBhxnDB!Csdol9M3p z;%gu)u&?9D3dr@XUG>ekIxM5DV<;aW^1VH`AYW)keWc@}b!6*8*UF8em&-Jh^p_{& zruGDgpY3t!#k{KdIkz%wkK$cBS{D1DCP-&g}E zKctgy0MLT~t~jUAkI*gRadZoRiNnM?l^kwnA3nubm9jt{1jc1c1wu|BZs238AueY< zD(AYKakv^6nS%D`A1wRy)$7no3{M8;M81UU?pWaho5)G@vGUJQxo~Ieky5k-G&CAt zVnJdgHh6-8Cws6)dtE{B6{+~%r%zsB_0_rr9%~)hWYGdt{_iar+=VMW{Opf9r2%0~ zh-n8@jaD{&c9ueEw*FdGx0(R}!SPdk5E@lcLKHFXF#u77>P{@}#s5e-U3LC|nG*-y z7Y{-VlWQf(aT{ZfL$PsJbFeN-xZ%SpP+epWe0m^_I`Z)egFJ_3@lePZ^G=Y#)(43p zU=GWPR!4xGg9~z6v&;cs+axeT5F6>mkB~41frKHoBUp;gP#>g}D@nT-uw3#NdqE@% z_W7mWS+zO9>8&2m0q`%>vRNR4ua1QBoASmMTP#krt2&RCl=Ggr7S!@hL+Shx*DlXC zZ#YRENh$j0=lfYXybiziz>cKg0Zm>O8>ZOvon3{b`lEzn%Bwxo0eO zFS`MzN2rKMR=8mJ&-4M{4SmAKT_?p<d% zt&7(f(1u>D7oX~ID_iRvTzOfLwc>9tW?VLzy88$R{wQP*zEmhbLr2&yBCH>)5qWfx zS)oly@CEwE!UaS7sf0C~ggj0mYc6C4s$9aqXq-(8n0wiSwj#@UaI~Q+?4?RarbN%y z&HTq;vN5Z*@xnRI zp;dM43?b$CbxHclxBLr8&IxB5R8skxppdk}lG9dR8uOJdxE$_bB<(&@zG(m0UE*mYC!a?!R3S7`nRWB4cEWRgY% z#y>~I9fj2kH~^0jXEiIxe;lIv5?f_%-}HlT59*e_VT}LQhZ9Ajrk)Caqqr?|)i-Xd zrQD(ICel zIRe!E3G2h6$IDOA6ReK-N>WpoFnJ_px#=w6G~g>>$o~2A(|Z&>0CSs>Kf_HQMrn3^ zKVDfbED72`(k6oUm+<2^CtlTg@qb2qLg=2Sun9kmre|KpV+{LN6bXA|Wp>hfMwE_} zxR~Cb>|vlFN~swma1eEaXdd%!FJYE<^-bKm)fp!MoceOs`oH_vP*1Y}L3;xp{4YjF z8g(5(rzmmg)GMD&49j3X1*+me%i(HQeILMyAXI6rFlYsIP<1}dmKGwl_^;2buA`FA ziEY$TRRjU38uzkAAK^7r<9H2BbVp&w60NZ=Cvzo=83=booaTK~(!4B4bFu(*|L9pF zRM@4-m1@_`UejN$n{*d+K-I>6^Gt~R$x)q8-;_e|Yb#>Nlm1IOjDs4l?*LHH3fJa$ z1?mgr1d9pu1^oq0l{zo&!eM^|#pIk^5&gK$(7fmGkALT;k8|(!KF=~7&0~9XKU-)kNUU%ba0sL zxp+vI=vTv?TJm1)KUG5q%rh3d|FON1d;0ma+B-0y;PSs00Xv{7@Dci3SAkLmuIzk8 zazfS1RC!%S_6?Uuz?|=o+&{9SX7^U)(-9n# zn~)TMLiN2+@j}e$(C5^phYH377as#DwVVKok>51*$rJtKp*jy$6zK!R0kW}5i)r!d zRD3)#(aKFXHPlXH`8Y!Z$Js-${zcBd+4neEFftq%U3tga^%g5pNgwO^0{8q`BZ2#6 z(vlgaL9&?%S(qokGv^!kFSzM=8aEkn4Wrp3JIyXzbl9yv zgjFDvA{?U6l6(F6`@TzTF1L;Ht^7}^M#Qy>q+~jq8wb$l=O3`yXmfd%l3#5>REbwggIpHUU9v?=tUUIeP7SG=Okt<}XyY^*Epod^~kuw;5WCji{GfP%bI@v3a zHzb3d!@JbP!r--+se$N=N2rzO30iiAf+e0b$F%HJ6((HPQfx(5Dm6tuF^DQ|wUS$E zDB1H{mNWW>qP%^EZUVksq4`%w3hrW*Kl13ma5QcKQ+SAr~dMf zrN1>7)}{}D-8;qyoxli*i|BZ9PmNYqFR;~&62UoSRUTt1EU2)$;l4u_UbK3wS0o2i zvtn9Z)?_S*@`xTg*6HrZv~7i`{b z3p}fn=@b)`_k;_pX;Jdi;)U&6=4%#?VYG(nn@!7tNs&KtkhcAGGjOvI$nL``4zk;; zyzpqPEGu9BMe$|&O6DhJ{vp{+CjLY0oGJq@ULRPj3;lbZO|SKGaoetbU{F&q>^!?v zl%;jeQ^iZJX!ezQJi$|b4pe)Gw34vlTS*?Ubq#hveVvJUN$Y>=>vsq57DNeRWHdRM zR!q#VJem>GEvMw9QLnnEpt)$dA|4#}W0{LZH9&Do-+~+Dr)~idMWz!QrOy`f~e~Gq{1j3Ub!Tp*v03y`KpF?wZ4f_ zw$04l`SVu9GPg+@!VCoB8b^d;dAVK%tCJBTkO7(WrfVWehM!)s zitSLNI@x5vc+K`)}k+w{o?86E!Kkt zlL8JLhMo>z3I1)aqz!mf+F_K?+~O9G`4hkYY3eVa%tBQjc!D^4qow%nlaY1=rD%5E z$2qnwmB*-L-BKiE{ZmH>q>vGWCYL~wQLZD<^w#dUvQ)r)k`NP$XQVV$(rAM;kCdms zkVDntJPqpVtyy7y=mv58>xv!ZeV{t;qdMQB_p@kIMt)DF9k6~&S4se^0iM(<@|A%| z3`hdye)a0F`*1W;bzd+wxN;D#UOL9hdvd!ow$3XfoKF}}=bgwI?(l}P7_h5wCtsR$ zUAIt5+$|WwoTpDYR{9{J^l>EMHjPH9ii+HI>?`!jA-O!u&zbYBTAnqmzOL!=aLNP%}?PG5<7u(er zP-2o42N-w{{1s_>87^CTrZUY%JRXKZ?QyQr2CRwDlq0$rG4T`d6!sO^)r-K$Jv&~` z1w9|81T+ZwGmZ~4x^2a_#vpTF8oI+;T`?F)ZlIS87h)r0BGk=7u+K)fRyVm$pi!v& zrC2*CdweIvfVg>V)FqpCBP9CMk)EEA)Z`1$kO;IoT!M@Uaa|_pE6>Y+z%|H99nr`2&5oV_Rwa%+O zNU0MwK?qHt^GmTj=gdiTeHkP{sJHe1OL#}97J3MQq>w-$c`DdVzb@H>ULst77JA-NF?*SHK`)+0lNR@9d>`KJ@%mDAm?sEX2oQhjv*fWLy~UIyPI?;=`g{pCJVhMYlG@^x$l*T622$K#J)j1<;Crv& zA(%*Y*mtn6SUWNxiPSB zr{%zB*foTejLUTV-ztoboyhKKKOBu;SHlZTHAmBp9fby%!zjcNcrf^HYiyh|^gOAu z>#jkAMRt$M?B%n#weWcR4!nnK|NP$C?myO(kG>4i2fEZc)_3*{fmnL(}8pf zyE*^Sn++S4C1*xj`3com#DYP$m~J80G%Z|T*q80#0_N0zT(1e^((Sw1J(2Br_B;Hw z0n~+nwIS-VkGw=T1RH>JB&gOC&dZ`dg&r<%NP;wY;#6xV*s$y#YTLuOZR1{_8iiht zzhMn1EV%g7C(&(-V6NdVIPjW!jzB_$I5xNmxJ+>dmnq`@x+DtCRB=12x4E*Oq&nkc zB8*!-t=$aCf^QhF?X#T`(5eHL9Y_VZ!-2Y94Xkg6c2$p1|7%ML)PKPPAFDZTbKp8j zaE@hcQ3&=%;}b$-yBdu|V76a=b_wq2?BVD&YaS+cbzI9reaC_;v{VQz?9#eP&y}AR z+KtT!b?Ge((1yi9FA1V?+|YTVTiDK@k6*eCl+chW-QVj1mzN=ISSvpPZYNCsynVa2 z&c-SQ$h>3vLU&kGz%!jmH)EUwwEUcxTF_FZYTUf1fA5 zB$y!zQe_{mj|C2hGDHHa;4k-TYfl@dB>}k|KmTj~k{dgf^E}H;hT5czl`)xzj3JrJw2>)8 z*D$_*wb{3quNpkZW_Dk^x^F3=ZlJ46NKda-7UoXRrKF;=LF-e-O-oKe z%cUepQS4{ga(L{*k&bM?RF%oym>sxz7WdQ_mwEYT_F+K3z*un_tqM7J7_ExdJ?V)C z0{9R7{|%pdhNS!N`^$rvzrR4vo#(cK`k!BraYy|7Ir%DEJp=v%@JsGA)6xH3PBs#! z_TQgjRMF@D{XDTh_x}TzHOTogH}_-IK+pehy~g3gOp|XUHETqig@wi51*U&blJ{i1 z6=P~@+S}XfDt_|hNg570yF;-Z3C_UZ6)7nr>}YImwYa$W?{%lZ_AYMKi17-m|DF(c z+W_t0;9y$k%GWqw`9aui_^i0ypzlVLl>fob>(>{}9_N+)+6ep;tM_wI^;EG?TwL6r z{r8IHE~7=)JTIR8@8f;P`!O*wF*E)@%?l+<8*ufnO6zrwe3#OUzkdBX`Rwdw)ke!7 z1xd+jy#$s27I%@jT?1EjZy=k=(vR+|^RPBT{_y)70Re&h{Cqw>J_-to%lG=(uF&YUjd?j10E{d8WzD7qWb4){7IXF*S zN2kq#nVH$E$$R_jr&q=cvu$lE?Q|oV6GYKuqlV*3QqL>0)Qe zsi@SvB_B+Njlr{eHMy@23z=2le68|d3~yLbq7U|_oaU&OF=z`lwXn1XaVe=k2j9w0 zDeON>i8pg<+T9*d)YH`+Eu!kGH>QQc{25V;*C??5~KF7iF-M3tEz6A zy!tPs9*!*I+;>*4?UO$L9myGRR>NjV*wXJucx@|R`mL?qG0TLrqVpv+GqS%HQ*4tc z{A>Cms9F2vw)^07e-CMLo-q%0mp|GWDQEdjNkUIF(SR;%XgEydR<#L^nR04j_decV zNEpoi{{6erM@+!}99iRTP0P{x^H||z|FTcCG80wyBj)I7zWn+>$A=XnhU>v(9Em~@ zfX&AvCL5?&CXvU_6}I~>!vWglKdmjd_IAudwc>^j+qYB$l=oti=BPDmxq#u7^!ly; zGQ#wWfoc2guOHDf-U#cX_nd*)teyAq>`!0=wGkNN7iW>4-%HIK%1Ne9aVj)gcgBpM zkklsryPu3BY1or@oC{&EI9Y#u-kfXy`F$cZ4p#nF%|nbdh1k&YpT!hC>jh0t|IwGf zk|#^C6iUPAuVz&_%_=OOXV>BHdNZI9TT@y)e{zxPYO?>USFc+B9Q#gmzJIT|bT=P) z8@;NWCFfn)d}y~m`IhOHbMWmWs&2$f64n8QLq|(X%T(&S;VNs2B>01R!1P`s-k$Bj zLU$5Rl%I{l3GNP;6*sh?pkQ+A-HqnMQi;_$Q-~z$;lTa5$byY{HW_*+bFaB@2OI-- z^{HDwJ`Qf(xwD)z)6bdv^{6hXS-;R4i@+m~B|~R~z=nS9WydbQg!;rMsCRa%0-MFK}pBp3NuPQX})N~2Qou|gGu!?&+jE;?s zefq?$HC}N?Gfu<9!{f${Pt}suPO}#I6;0H;Mz*#~M%0a6@zP-jJsGstmX33%;kR4; z$c>vR0SjGmkbr&&6h3{v(RHoJ{>n>LQk?swec{oMguo87hz^4SUFBX)4sT+i^vR+P z^zaKTMZ}BKTB4rcZ#H^-x?!Bj&LwrbjhLD2=Cy0wX0P1~1CO_J#|bbDTU)EJMzd71Q}CL&vI;z~;z{OqV`ENLc zk)z@65FWSgn}LMSy&d(sZW3}DH!9u2M<5F^f*$hx{c9jl<6+D3!7ImLBqrcsHT{+= z#UzWW^|dUB>c-|~iwECFF*APKSKAveHtsH^Th5oj@(ej^e64aja=SkN> z_LZaK_8(QUs9%52`%S+;<)x~jU{f4b92A-;qsOG9{DssRXZ>_Lba|OVm z`}XbCt5+jWaej^RSNX1z(=Y-RFvn}2g7^qM>t7Qvv>AW1$}Z`mc#X$5qY?B4LBWUh ztLJ&oUcURtan%ET@U!L5gOyutW?Bg~3j1G(-q>2axf`cjtHLS>yM=mncd%^|lR zz`oCP_2{ji>}zJdp)K6T5;hy+@GxvBFL+3EG#~_x@8&`adM%o)rNq80I^vCK|!5r_fMEj5y^n99z;Y3 zBbI`SUG}t-xzB3;r%#^>@_ja%es1DIPbu6qFyO%-jCU*D>*?kvCE9&r5YUKGReF=WF~O(Ba$X(6GK z*RT6}3-u@2qeimjeQj11_mFhfcOdm}$;%%_us%!_egWm=-q3S(R;h;Drr_o?Fbba82IDSYbMYi#Ks{*|hPV^NTYXW^5vaf7kB#~DLv z8BGn1-VVVJxUjFS`lK zo0i?rX1VtOeTbQ|tT*K3%)**yWM#diANdQPF9aL1NjqD?`TO#!W@&)?evf!{0MTd@Pc$(9T8gv~f`94j%4d@bC#sqz*TYK^UR z8D9c8@TtMT%IX;#-SD{q+Ysxw4mjQf!;sue^C&rCVO%R2XR5zb^RKV>a{Tw24{-+J zdfM7Uh-0{X#SzqfeKRYyExTem9*q?Pm0y5NWqZhcexa#NGHGk;>tCi0qa&X-7_LLY z>LyqO^aPn^FgGLPY+zuZlhX!ZIlW9V+x^WsQnYEKm#7N4$wFyW)o9Z0DwNPIH35^5 z5S&`ndIbgrmn6ayaxvHE2`?a0KaiG7s&|}z_1da;yZ2M zv#Ar6cxt339q@a9u07J_=Rj{S{JhOSaIP)fnU{%)$pF2zwMCCkmT0YUoS4rzAaLZd-8PFzK&}s6*sr-0?C)JUVYk*)wOqYyeK4;mb&>kl808T1vzD{?e?r0!_SKt|Pwkw^CQ-=aZoOc6N4xf(XWkAiK%Q%OgDy-UJW5z3W0( zQcN*y^Tf9FF7#-6V0hzak+pvroz^Tj&d|UhB`a%fW241x=-e9|Z>+{yEFQXTeJfPX zk@fjLEE>xu@t)3&O;TB&=wuE_^XT|EKhYlkGIaka0*b$W5#=@Z1(nZ|mX-#9!`R5J zn{CacMu>%MipR`!@=~M1vmq?Dv4v>wEurQ01Z+N>Y|DRCQzlpc&fX3#ti=b-0$W0Y z78DVgt+f3BY=TQr$7#>wQ8M!{^gy8XubxZoKWO#5x6(Wh`+Qak>MmI4v*1quAdx{!K-7-870`!oN zS^tsVZVGj$Is*VqaKo_M-@biI>-jEDwo_1D?Fn#BU0pphGqaAx-rn8|larGmmvlQn zLas3y3{+^S;SEC@yf|Vtd&8E* z73%8ttl^Q7TqS#!Zo+IHN);v7j__yNgO^r)+9-d=&TG>UXtv_`*IwRu#bt#=<5Fpa z|GV~+4D+JVnQ*)upcRP&2*B%7n9E}BQOM5n_Q5;vMADZ;E;=Zb#`#2kuYNdOPo6x< zl@2L4lW-_tGWWa0+sAayW35lu%FJnP~;tSnGFF3jjlXRHK%8v4O$ryK+=q zF4BW+SB`A=X2c84gn3KJ+whT5(-px;We*_r<#%*+PKF^wMJt{^S1}TbT(c^}VzJ}n zH>IzusS#Unee8;3P2vzKCplOws|YwcSXr?nKkKQS-OY>?wrrLI?Dd)0QtTV5GL_Tf z(k53&*C3`oVn?KyY^oR`$EM(yL8=bxCw-!pZsGGq+-X``E9b)82krwHn`h?Q+7yrY zxw*Lo1y5cNTPG*tx(wyr+uM7boTs<1FU;~bn)wT2I6PG=^l5Bt?40@B+#LKi#2Gm? zb!WU6dbuAnet&oE6F{Z72O0G#7Z2VihT`LGjpbznMO@|agr^rbsk%RYk-uL_$Myi% z_CbgIj+#=6gQ&Gqfa)WLIyF_1K5iHgaJ;uZm2}p3uCsct+YjMQN%Q#WQ?^37)2G8) zv<3$UgI?pS`r-9cU2rJp$>A|c8_7Mx&eK@m+jb!u~J~fYTrHAqccy)0vJF#CdvQ;=~z8W z*d(Qy=;YzK9FRz!KYw0cUY?jpYZ53TA#r933j7uHxemJWP-L`7Pe*P*ReepWiHB_P z&W^jHV$1yed^jbOuz9^<#HRAA@m;*0HlA*QM%eW|7BV|QMC9-1XH;SuZtgtm1Qq1s zMXFP$-dg~?pJqTbDdfI`?9|Ob784trqN&J-Ko}bve{l0yg~ZJCq(0^P`M0R)Yt($# zsxRsqClUIJjo6oII5-Gm1-Q9eJ3DOwM{SjpRON|%>uFV_fv0vo5$Y>yqtW$U0PX7L z#wuzZR*Zart*sal^`(8XzrSzG(#>GzJfd0I-L1v^5)tjIl17T9Skk_7WqWs5y&r(U zya#?S38(5(Shh*af`Y5;R>lh4HeDX}VrbZ;xlY{(Lgw!3>gqlfvptE`W_b(b^h3G4 z=J7=cbdKox4vY$TvzOax2Y_o`nlX$DTf!YP(c&{AtQAIH_TDn!7^M4=u{x$MyrdU2JF3eBt@?|C=Q{vsW_2$~z zv!Y559}2e-c*U>2aPlQ@qgZ5SXQ#d&6BV_&yDN0zg6fyltgM)Ywdv?Pd*l`J)outA z+uMJRk7|#h2H$sZ7%c7V=yd`$7ruNc*cc>sHRBQ??le1lliMS zI0)`bj*%i=R-9s8-OJ0%$LF9o?ZQxu?Y(=D?7kdCn#gRG%Qq3KJk`HjWoxH9hXTTp zjYJEZUjKVv^W;%T+q-v3NlEuQFu;S${U<7I`}_NGI2^etEfJU5+s5qu8|vyLj%3KT zK((0HE(qTEm>3{FJ0OGYfSf2~T2+*nrxtdSUov~wOmLjJTk|P&~G2|6I z)t-ndX*)|5RaL-ETpR|4C^)bsWo3~DJt;|SSj=K;tut?}fuEn;CzK!|NI$w^<$3W?7%>oscL~t z6td@w{ClcQa+zQt2t7Quxoma`9hgDJ+PXS?jCq85ywg5NLat-$E=x)p)iGpAHo>2$ zzW>dI&ma^DySOlw*&jzN=)>=Bb6x7@6%e4%Se&1)bYH#BoCfGU(n=#@O!p=M&ow>tFmUFsRuRYAV0Q8P^;3+E3(%y%m@hzwpr-O?~a0;Lx`?lh)0%h5S@|> zs?~b@>}G?fkmCc0unR`7-?acP!_&C*?tceKhd~Ex{o6r92$j zdMKqQh|CzxFT{qp5Ym1id+Gv&O+D%++xW8S(fXgEgB00NNT8^0qpk;rq6&rE&Hj?K}x`TZM{8tDhloma~1!4<*KKg)-4I-L?$V zhQRG~Nf$DU*og>0z~_6mYT$S&Q)7|2w?kYZ&!3qpzfCkr?ud3qCu+9;~3KE=2PNY12dQtDT z;Khr6tNH0%S3rB+29=!TPu*Mu>!vIh*E`pi6x}FS06Pa$4;$8jMIL{%{Nn?-NDuPL z)NNa>H?B*)+9~H{kjPir{QfNr@4wSoGdV7!$Y|KcL2Q7CFy#}svFrbWvWteeUNvr1 z$^;M<8XB5EYY*WCr10O3(ya)gL%1N}2;D4yH$BZxcSTi|i1<7_(|Mke%+1f1$6HMM z11}O3PNM7gChvpx7e8HNa_jXiY%wJG;6b3-KOjo*62?fO-uv7ijA9}pBAWdS5}!-W zV>c=IhRWV(0#XqkAH_H)EzE0PA-u1`v$V0H2nfDP4IUOt@|n?4H_m5{X^0V_b;g0Eq{N1+rDf7&pA1kfgnDaBA`)(rJ%m$<5Rzb9Qv!r99mCcBJ6K2 zprEXSYJ4SK7<2hvd>>jxEH7Qu*K7*-URvjYpv0(`;{6?pNRYxK<#>(jU+TNEo&LN7 z_t((Sz~e^D0ei5twDepTf5gN64=}%vj)rKXkgYGipvGrfuoNHXp&9c`Zyp7@w>An@ z@VD5;2h}q8-GK&!b0I`j8|DkQxd$SQznhqjQYR%#CS4BH3tCV+6~LWuN|TXmI+^$ey10E5HA!ctRH)ngfRJ%H%~fbF>V z5B}_tNLhz5_Tr;M3R?`BqN>Urx(aY7AJRoMsfbd7k=#v7X*=~F`!UGNVq%LuC`!hQ zL3PTRd5%${JGc&sUWy8NPkcnqqk@BjoeOP0JZ{Ad()XP7IO@a)5lf${n~;j2v|nh-3$#0 z8T4tx46*^4)l^dxmyn1?&TT{Wh4bJ$WOiq-+CFrJwkj__f38_1mMH!4_L&~%)xKXXkDkXXzbU?x?#?>m$)XR( zD9zYwWMov0-k34RleX_#ISmZI=RgDW!DoI=w@}8DB}9K$z2y3X2PFY%;myJ~r1W2r z#6WVUrlCO%>EpsA4eJ;bB>vSs%6U{d4Kb@cx)6kaC?^>=m6QnR7d#WJNJXi_PWp_v zxlGo3TsXl?tOAsF@G>W7&gQ0bDrW)l{Wcfd>jZF>hC7_-t)D+dE?zv1HpMqJ-WOZi z=9XRgL`{VY+bXkYl9iXAu0&qT!EeIUNGvXlKOaQz#zr<81|}vl|F-*B+|lpf&_E0m zmuIU(BzR5MIC1V!yKV#NVcu6LZMq+mGzEPo_n;>F)&u-E2;ZZpHw8@$!Hc8$*ZZ0%J*Sz_-! zrKDh+~3uXFPWyGCeA7Z z;q$o+$RjE*cyM9sG|lyB%_G!23gDvM1`7+zCi4$%z{;S7u#0*W@?Cihc+`CgLtBK8 zFLWUGCp_(!Yqbl@%ggv)!pMk$5f#n>&7ibM;GzPZl52Eybimvp z2L~~a!Y1FJTfYE>a~$sAdy+3QgOFFV<-BJaz3r5tc;$W!LE`@k)RW7X4eAW+?D+rg zvJ0`#G=}yamr?L|YFZk=IIf6Rv)a|d{CwpcIAZ3vZav~Tm$~$bM^J)yEBH4TUWkhW zoRR(G#}6+`?y$aGyk5kdDh+Afg&2w_h+(Qk!Jo-K&n+(--@I8HaO49h&`ydBjY!qU zQV6kQK^&vRRY6x7N=Pm<=o%m(#4B0WrUb2fNl8mfgD^7`E9ckq>66EBp7ti^_mDU( zqZ>E!b+vWFn;jH~=k!h!%fv(_10xf1JI*w?3P za_4p%9%qTjuH*VfhsT`FDB-SK-71YlmDV+mzfJ-7z@0c=R8ZX}F? zVK736HIk7!hbgBX!AX3`@t}RkAr!=87w5cL0R%#G0|jNA6?!SVIATq)b+k%HNMMC| z_D+=lk1}aJ2+er0z~kR(7mOpq!{G>hU0&uD7g#EKQr8}buSnaGk{0v#9wG3HW;JJ{v z|M{7``bdP{Bp*7tFM&-aV*& zhY}VRZfnm9u>#lM?>45N~UxcB{u>)cJy09jEG6f_}nY)^ap9UQi9lV4oJp&;>2eah|Tlt&Y) z21N&$4$Pv#m+iKA8!To`zfB_}*+it0!&3==5HQ1IxI8j@ka&2`or6dO6qVGBB8v&$ zCyNi;zg-p~w_SFj+RFdY>M|99y!} zcq&fV!7+XI4cWH9&`L70Cxlk(kuIobfQz6UB@%h69Zc?NIi+1MfSv{%6URvF)yvRm z2Q3p1Q}=f2kUjh2E{G~h=s0ZcNL8J7E@ZxZw=Y|s^+8E(uKnn&n z!sZOScQTOzJ4>YnT^>qV6r5jd<&Xc05(E`wuiGVYyxn&49Wvd-*Lf2hW8&h}zY4Gb zYJ{=_XS0Kn_uU-r6)sisczDu~AG0JbT)xckAo8{TvOX^F zE`N^=!e24jy&<+Mqu->GdYEvD%j2(JOjC_UD0i*)Fu2ZLgFHd*wIz|L=xU_rO|P7s z%@61Lhy+<{prxe+L7YY3m?7g<(9qxuiNN$^<9$o?^{l*{TpQ(>o%YQ=`|*y9N6!-Z ztJhz};*aso?@OqIYkrR_8u8uY_Z^>cVUPJiGdzD@18WbM0XXD5N)m@2M)SY5D@tqq zS##UObkK3#DdB-l&*@a=H0+oJp6Bl{;p4neFX!PJUZ#joNZ2q(uW=jIGn~8NYkZlT zhz7ZX43CKD>gsC4Y@VQI#DdDJjn$TCE=Eslmrw=VR4vn%xBSo=-)lp_8N;p*wMgs! zlqp?ZT^*tvSuq<;J9Q^A0Kv)0=~9@Om43fID zdK-`dUK_i$T>E9{0P;+CN)p)WhMv~d)_$?Hr?cs19{#YyyQ)ubAm+|Ll=?dO@5+## zKbpjN+UdmtxtR|d@5X#l+%lY)oScM2`*mqaIc8IsMLc30epFSN|pwaC-0okHCMXuPFu(S zB$Fs2j8^Q~rEe%WEz(I?it&al3TEe>T;wW~>tI4{`+a5?#DM1f8jWPA>OO=66|Jmm zq3E41XbM6Qk)kIXz1@HkL0fSKld7;=ELN=QzJ{XLocMR0cw}*B>yTj&72hra-w1hj zfsM#uzYf{yzn|-BJ%YxK79Oa<5pG?rL}vO2(ck0WWjsU{FeRJ_ou}f5RYqK@G*Sbn znPsg3=W2?ATj?3)s5{naNbdf}Gk=$FUI*P2a{Yz>y6E({e1hz=1uND{cQVu4G;=&4 zVyg@@picnS+F(hwuYS6r_V;g+PMrd8CJjy3Y_4jgkC#_D zoB$B3q90(3jd!APYFdiVDYr54?8pd$>6wS~&O3Q##aFa0OuXKP3yT-n-G24*<=`N+ z#({+(`1s)Hm5$MkM*NONYXX>e`>KnF_lXSjPwEU#?H0eF`X=$W=9*hvI5D(GaEn<* zQK|nmJM-~+1dGRHC-L6*2?JweL{=)a-Y^)<UsDu{ReTh_o=+lG-CeT>>jwfWUC%_ygrLcsm{edU# z^0|itXj#wi{#yuthajM7|!Lp`a47=TU`bX^sARx zY^#PQCMJrDivef)tPknkxZZY$&!~O`gn;F~%)iZDR~5MQ5jZ2pi_nE&+`!)>`w$PB z9yaUq@UXQLw?pK|gQQe0<^qI3R#w&^Iq;+BLK+QElaeX`djjByiX#7%mPb16(Uat} zf&wQZ@(|AlpBAwJ(lW+Upq(RK3#VD=*S{~|Gl)#n7gWiE*o>+Bm2_={c8AM2TQ z?1l!rKyY~gQuMkL=)>05=du<6&;S{#nm$<7ezu%7%7A78PvvWqH?aAjzG#t#{7bbX zNF49GXO1I;w&}{~kCU~?MvW(*KtNzDsjg;R7hstH-c?m6Dk|!nS6+T8gTmCIz4A-b zaN%eyPTXh54lDHE^$r@4++E-qpAXt8KvE17zO}3=sxh}Io+`+*(N-XleEw180<^%Z zhlhs&j{>1wT(rr!uBFxO!>|)$%>^yjYH@Cx$Mk6Wgs%2T)?!5`fYdU{Q-{IktTrf~`RK46P znt&U{Q_kyPSax)Dw6Wp+ej?sxk5GpORXBed6kI(i*F`O?I)1Cs2m(B05$UTRfd%%F zzFUS6&MWLci9cst{wt`GdK&&GyBAllY70@uS8EuNYQBo}qKf3$}* zBn*z>Yrk@J$BXLwH6EQ!%E%ahDU>o^xcv9pzNyGL8oO3Z1QoN`oi02Z|9~?DN+O%2 z=JX81G&X+Gq`Dnha0yr&)MH>c z)I~G#J0Wz#9A=ZKGAsT@FD^ELOP2;g9v&M*Lw6a>31+ppSR>IY9Q`i_ z>W=l(Pi!)BdH*~oQRWFRcmS6Nems~5h0BClPF#G{y~8}pW85HAwp|~!s-H|3af#0^ zxu!-++#WiSm+~_&--Fz!n=Lm1y-9F@LQ}u%0nyKBXf|T$2hT0A%6M&lN#fDm6#9^k zhf+IeP;A+Eksw2Iy(=m$t?qI@z+2X7LcG!Rmh^MVRzfo&V~p0{7L0k zV{4o&PF+cv^$7Y(kWRcu9ih-bPjs?jWo0EQDhf`(s{PQ1j-?#}a`4_Dq`rfnt+-hy}lq$18w+gD@Sg|7(B$Sr>RyVq;>S>0Qzr z6>3gzk36+N`CI{@w+!J*G_u%Z?+XgFQvX~HYV$BKdxTnbVbol$bfOCBZfuNZ|BTTf zran2D_C&ks(^*U$^^z_csBewGwGc;P<5HgR8thA;~X~b0RAwXZM+5@`*xjIM8Hs;Nn z%cJD$#~Gq`7D>eI+rlU=@q494Mv`5J?zua3%kYgD95_gzFJS`B8P^Cm4NXlaY^|ug zJp1fjK=QV>d@tFlMVra}*#DKDHfYLVnLn{C;gKz87++L~&yb%F%{(6j(O#!t3&RdY z(hj&zo&C=>mKGHS4Zpib>&H{8X>+QgmE_`On|kU=2{w}EupkQ~(n!U#clmdVxhA?W zeP2a5X*ngKI{?S*)5{wmX0G&*fYyRzp3tB#RIV+Epk@SA-p|ZV|PUXxr z=)^FjF~7Ph0~HsrO=hk*_~a^BF7fTtL;n*=buvE8W-t$o4L;u9w=MIvyJ^!HfqXD9 z5IqUU-o1MlU~TTI2-q#_J??|?YP1H-zE?{!=$i+@pekVUTm*kqxarW)csY&EQVdk+ zpr{!F1#+$*Y1sZ6*<)k%t+R(^O7sIxIK+!8&{p#%16~NUvd74)ebS6)OIp>gJ%+w? zwc|v{V-isx8=J++xA$+K&=*i!e%~Mwpy#Q~W6LRDsg-V{Ew0T$pDzx1kv0N)H996+ zG+RU@$(^n0DK=R4<6~%3c!|2qt7(mblXueQAVmPnKcL|gFB^WTlSALE_Nhe808ow?Ex_&lSk_l9Es76&UueV~tQO|%;8N4m zp*c$6La(@rB%!CAyhAsVAMq)qU2K>G{p;)3yMM`6eE%4K`l?>7jte1p_IWg5f0P+g z5)*^;IS#6Bx06;$*eRGc6zP>5eZ)}Nb6weFzIhcy)E&}f9!eQ#Br3_K7U*UIRXTw@ zxT;z*PjD6bRTx$~8RX5P zhf)w6ZGxuvZsI`|*$x9E(1#iLy11zHw8O0LWWq4VTlLR`lH>8pzN2q$ zWO;PY-z1YTolFeoZlhz@^e7VL8HegxdRK*%%}Ad0r`Hs%!mV|?Xxg`6-EU6^k^RMs z7u=`B!cK`c-Rk<>z+f5-0DS6I5{Zfg6>I2QiKC#`=*WQ!1NtGq`Z6zTGP-6!XEBf5 zlNU0g2#YNRl$;GcKzl*n(w7c{E;{2JZ)m%e^|Nt3@mRl_Qq zI$DeLApQLP&CSi{P#}QT{xUK&jG8-}jSx_k*{Oc<^!=!( zqa<(kPq5U7+`#d!jLm|3vk2Op&N)y$GcuwEInNVNYXMN9DKff1rL$F4h78Z*D&QT6 zZbPU{o&2Qy<^sFUU|z97;qzk5GyFJ&$p^x~A7yf?_VJ`y_7Fy()@nHoL)$g+$!%^j z!*r^0BTAW3_<{~rB>mciJJ#Gd$3Pd)%9NZ(Ixtm5MdWDDUnK^sDQ8a~n>YEql{-&& zTi4rL#?yZNc?z48FGoQX18yu*JdacRG^N=2X#;5bgJ17;Sy@?0N#{C;%W2#pZ8hvW zu^}`UFUfmzPz`etByQ2Fu*C@18r(mm;TPAA+Nyat9dktfYDYfiYmQ9sb#g7=S%GAcq&zwZGntMSOt-b1- zRSy1CCnqN`8e?B9317sZp3BxEKe*D>8mQg{&T!4#oO-I2z3~-E6 zc){*uW=7YNdqcYv{7iJBN|5f_cvE=+B#D3kR>4jI@s|XU0b2K-eLX!%e8>6(3KC(o z@AK}1F2rx9_RG$W>~?yp2LC3Q75CDuG<6|)zmev~-gqgBa4-c^HSW}V?&-UZxX zwo1y~k69#i$u1z8ydjtm6B^`gT$-B`1)?VY7OFuy8Gp|pk{KQOJO64bB#RI`jVn4j z5RX-jMZ)6m?b3HIr&3*M`ne_bccbN;6+259e_D2HJ3C)`_*sDkl*a&;s2eB5K}fce z*kn`_vsOrC#=fWP;YA=~f4}qW2(%X8Ji$u0$3?yMUO17nN15>{|7Z|-F_{K8N04pn z+g@>eYTN|*`NVlr6BQZYm$drahT~1XQb@pwgmWrgmFWLPGf(m!v)y zwo=L=YCEr>KqWD6O7p0wr*&>yu)tc1w_& zW~@e$e(TJxCb_7d)UyfsZEdy1U*h|vu46>{o?90pnugDWnXM#mDXrCa zxdHFJjQaG2@exw2kp%64Elb;s+UByG$mOoSgOA1u?&!GO3Z3dSgL|5 z#|g1jeaH!qp&t!HgfP2l+teV+0!wJR^$^JX8llc`A+f>rQ~Jr_Z1fBapHyh}rJYqw zm~XWthPv~+_&^G$oewG!6)R`)W=STQyEb{p)7JT|LM?XXqwFan0u|B|@*W6f52Z|D zYmPH#NCtwRhJ}YKE838z79%qqk`IjK?-|LaLeZ~uo@)cS4#r_r;~H3jZaO{ars4zJ zVIvY~9r+p0Bxap)b9o0wn)4Sz-*sV+oH;2K{S_jX#AX>N1eNALMdj*986Q1v=k_CvGxoBrr=uLXX%Q?Vy*8!q^ zD(kV9r=9W?gUMI5?}(xUvcMtrkgbDaN?uOx*>y2hiUy?=aJ%qrD<2&lLD)ej6lN4M zk|)wycPVAMq1tJF+_N^v7XaAE1E!``RLNwSL}FY#qiAINyL-<>$H|41eSTln)($pO zP8n69q2(UpHR)D1YHA1jwdA~z3$J$&{a#!1@Dm$YO?V~;TW4mUdpEn4Jz{qszQs2H z@K;7QeFu8TtWTTlf4IlYC<=fnUE*wIWu@o(B*~rNU%KEFvEWTWLAqFwIFEX|^7Sjs zNLImEY-(VomlUP?9^!A+mNAS|f+})VRe^wsnpzHoP?kJL0kuKAss2ScODti80L)T0v{^qn4--)<{P8GBR8Fn?jGc$pP;&^N&D)Et^ zFHPXkg|sU5C#Rzm2~WV?0C$6Zb3X&$CjuKb@~_@QzA6acCna|;^!%%`&<@{#?^DsP zpw|DrHz4m7e4m+X5HqR#*IA)u42vnI^z8q?H=qk7(;Eh~U>5Wv*l~T+JL&#+No-C& zOc7vDOi6JA;-&pKDM=I#HB8>&W}2p&NpK0!oWJpD4dx+`S7*U?9}R6r&@8M%={+f) zo{{FHx_1TKF<`QR)^pR9d(q%t9ocTItQ?+MT9f*+H83!c?$b``w;*l2ZkD&U<{+SF zYRV!ke#ls0`33+R0#OK)jQ-%U*%OZC`QOOsc~^1gJ@|oEM@3=QAbIOsSf2J41Rd$YH@MT zo_d?Nv~@?+A+ABsKdolQ=Nn9G5fKrsU(Y^9ft8?io>I7$3!LjSwk~S_8;Z=*u8UD8 zN6PBgUOs^#)(FYc#;sobJh54|V^S(uQ?=ZVe=Xm;dv~&??BaXf5<;ykv)VYG6*MkQSe!8wi0fmi09xaIkdN0IDS-_Ye7%bPp zGJ2yk0ERn#T(dz8B<1`0j~7gmKB&q7yc_2NzSs|+gC)I+yPb^;VP|KPdp7C|JHk<>=wLqqrVEcN2&uj zbzxkV1AEpQ+tfy7vx0j3e>-hTbt5p>7e_um(4wlgET#yHfNwa zP~mGC)^a^xq|~ zoboX~dZ6gN);=|sCR~PpCxUwjgUzWEPg7Gz{~sU0^3Q?s2i1q*jr#iWNsZqx*SAY> zC?F9)fd~EM!6(w0z8uBCu1CzEJ0x3yk7RB7;NZZX1#~b$LTTqO1oKXgn!R8YJfee6 zIB(>~CsM2@Q_|AH*U9U2KSY;vIIWUBQs$;*uzGR&-Rx{jef?xPQ%qR$heDvXH^KQe z%%j$RZxk{0_Wl?c+5uZ_mI8CMZUS6 zjq9NG9W_A=8=IXXNz|K2aF4Dz_Qort9%ZJBH=ijoTWx?^F@6kl*&l+G0C#E^=QPHP zkgIn_^E%B{UA%DNO~H7{1Kdto;L(Rma#V;X`!g_hO5LFJXVZ2Lt8rr>^YVL@S#m#V z85xs)agQuOq_;l+wl=Jci8<-0{P9WYEBq)%jrE;7S1)S@Clwxax%jvnQu!U?hrh*6 z6B+9V1Sm-2rfLSV>Lr4lG$X7PHs29_&RO@-H{UPV%+=@c+c+3Gl?;<2@hALthBU<< zd%!U4bzVbbO-11^r~P3_Jn=Z|e(CCP!igfnr*YB)OSJn1`UE33cEtLozaF!)vMx=j zg})m5P%?=ooOoLRz?l-EO{tL;BOa4HKpjNKQPjrqIL99YBrS^265?*JC9gfQ~EB`!Em9| zC&q3cI8J?)+)mlCo49&0GtuZn+u4QOqH&-Yba;!`L)1Dobp?`2HX zFJ8jaT8g&n129RRPZK9Slh}i=W#C#u#ZFIFAh{1xw`mb?0+79X9SnNio0sOgSe<@< z2|YDx@-k?D?(k@V^G}iDM;M1I1mP_&?wz3kH|e-5Y!YNAz$(l~JFk5?xfT@^6a9b z)bf`@$MI!e-B#~~PiCj&cW8fW=1`Qn?+clt#2+2>D!(CG9x8-U{Nye09N%UVeb>kJ`-?gE4dJJ=y0B|qwZr@bwFwDZX0+vir|%~f3U;lsvQyMv9SyXXE|)!2Mh0;C~DMa+2!5FQyuc**H-#31DMAPlmO*)~EzA z0zv{JsN*$xL*T(G;_3h4>n)(F+`6`5MWjKxyFt1eq(e6?Afcp`2nG$(Qqt1hASe=o zbeD*iUymsoE zJ;g2_bRP$wtpj|Ta9k=lmJk?IM^rA#YQadW8mJuY&jIIlmQcfwjK+C|H1L1}xSRhq zIj%}iE}K{8*45QXi)OmmelVGtpUdJ!((i4$zo)O&sfmf1IgU&zP-H&DPjKYVvzx|V zJNgOL=u>JEMu`(hvDVHXTk#O(zVc27Udz%Zt%xHz!mf^J(EQ6wheR+XAqz8a1fgB6 z$w#zDDwX*R!~{t=@5$2N)vc@swi-SVX1j|(blcIR1s7jJj@A?A&zQ6KXJb6@-7Pj+ z!Y?&;xMD(xm*R^LJyuD)?WvUpr5Bc#ay7j{)w39sa3A~EjrTi$;n{5|(yLjNwdBu~ zZoCZGT}1}AyWoK!>EjPUG~!L&#wua=omle6&CI_0U1ZwgVl_kU*$C&Ou!=?Yk-tn( z4ENUJJn0}qf8KF&+bk$9TV21uu~Dk`7NrEimgH_DQPo&@K3un`@>;Mi4zi3^z3f+AWI^c1^uf? zwYGsl(L+)cg2wpch7zpP1WC0SCd(N7)OQaL39NdX=v?wI#=?JyprDY{wC3S6_tlAQ zokNJ!xR%qM()(?$7j(?ZZ<%>`@SK>$FTiR;H#q1agFNiAJH58W-~bYohM}V89d?Qq zoBQJNdJkQD##nU2ho)o7cAo?+h8i(r5O}n61hM|HsJ3^wrS4}<35;a7fR2Ti_wM0h z`K7wJxqUCXpfukXNthH2sxm4 zm#0Qk(a{OF5AvcPQSzj)vAgatgK7UO|EN|~g|w8I|8~2ZURk&R_%<;xsD|w6(Rs@M zX6_UkXjAYfIP&!J+7xUH`va-5xZSL0hK!`f45r!ZUdabH#&0*|p@8>MDT0mI_|IMZ zwau#FGkR2&(2~E~bcu}mxYlnwd(n&DY}C1fzuA%aBW&P184!17?9^}a)Z8@xcxb(- zyZO$xFOFsDM!)yo`$J3e``AK}I9tU|_u4RBA-R^Q5pO}s4He|9m#(0{4D1DkZbtPg zU4>~2@7+GNO`PFdRY7QCcCwERtLiYeZiZ>I-Ioc(V5?G~; zzkj~BsJ{!YlE;enY>g_7C;hy55PKi{RaeSz0tqQ;>0M{(@R!T>8PZ;#OsrKe-~y7U z@qbQ>n_ics+g0Dq7{9uN2i#ODJnP70#Qo9c~%mq|* z_9&4z-P)CfD<4K*$en{}5&0kf6>aU%MqHvq{K5Y1hl=m?8@@)cw&~~z7#(T&>WrhC zgUL%XEU5E2*-6DU6r-(o24o3zSV3<o+D+cLg-G5*8y5cU{ z^h-){qh&qw_?pL4vZ*T8^4ZcxZjvWeHIz1)?)C^us7- zQ*@*S(mFL?O4e`45;aEh4hmF|rYXYSymf~75htA)R=spGspcCrt#;Y6+%CE5C%q69 zxyJmCUPgRlJce7EZbOzVvb`E**l(?90x4>o#2^!13DZzUeR_3qX1}~K{;n(I@Xs)T z&KV!YsCm2%L9M@ha-oVOlX5=Y9>+Wxr9wv_>PjlovJF>|Bri8NAMMZp7eOne2wKCB zkYUTX!2NI`7R#VzvlMymQUoL=icb*H zwFlbpGg$*DGCC zf$-?{?QL#ZUn*t!REsx&IjG`~($Wx)4BmsBv zqnkkww9 z(5Tgi{|TuP%z(@jd?&3}w!tRvUHxsBrA2kAlbPq{c(y!xDY5joZ)=3Se?uXtY#mCZ zIn%fG)UnNp?;F@v)r}Tw=i!90-Ai4`Kl=8CT<<30mL2S$ zF=dvyk(>FgEdu(Q^Xs#v`Zb5Wi`7C6X4r(;$6Bv#+pOL*HQy;1Ep}diC~%2;8>k3s z#(k!q`NKHs^WWj=>|9IY;Fv}H24M6*s9^l{RRl)A%QBZ^w6A;=oO{!G$Dd0GXyx!Z zCJhp;#mGE(GM!1St-zze7xp-?QWFO%z@0!ehKaGi z&e%QRGBykX)M!5)(mLI5qhn+^{5>T_nc+fE!-S0F(lSfCs_+j^&urf8b5vITF0Iqi+yG8ROwnuA2z6oOn5$0xb;PcMU2Ec!W^xI z{`qnJFNE0be8sG6o5yS&7;@t=q^?t(5wBU&4e(#XkVT>Dv-uul0>AXcg|~2Bzb` zfZ{&Ct20Dm&z_+(+i0wKfVJD7^ZCC{q4FR&uo`RjO`sg<^}eO5^o~^=iE)8{RLI&B zV2Dm$LCUeLOFtN&{0M%({XA%yjXvQm3NIzIWxAvMWvokBKQG(~x>2$ifTfs4ST+NS z3GrYi}-Xpk$3b16RP8FFXx*bB#;PP`_>%JkbT&6rtL3RdV7A6o5$3 z4M(t7@)@W}1$xo{xXk;UsNwP5#oY4TK@1sSHo$+IY8#>2hw3VQ!|y}tjCG!^PgRU$ z;Bzq+zm=D7)nk1&4O(U1#=U@MCTs9xtxU%(Q~p#e_zUdC){0A^_sqgA>@g?4hq!JxeGe%YN;kBK}kH4pAYJcmM^`j>zGj<@q92q}ej+Ra3 zDU)}r#QEPv{0D6(UN;Hv(~8JmN?Bhi_1ov_$pKVSCkaf+wS^AFH4!@yei-?kN6lXrvb)K5r8Y-=QnFdS^K0yyNDoLy+(%ZHo{eTr zju;$68SVCAUJWfTms`NpkVQZs&hnTGOql+2FqRv19exOyAnV^3@*zFFp=79x2j`x0 za(-o`ei-^)ofvclNy_s?pmJyAzbxd%-^H-0uk~v2ZjczJKhxCWg`BXx6}> zTO2pwpPz-%p~3ZbXbK^%G%Eyjh34 z6I7b`aN@`(r&z-1CCv}ql)D)cH9(=Y632J1D|_efW}TaH_4zK1zi0e=?MrG}eH)|X zPFUoOU1o(rsD?A5Cbm9ZvtI`DKbH|S+mbgno1d6CZ{N1ocJ!7TE%6JmYawcXAs$;c zOjTjgh1J)Vx=Oc~lmAxk58`{GA3+~|H<+sR>yZG}!UZhoBq$xc56S|%9jpr zjnT=Rn~-*Eui@Bu*+pWI%u^OnXajzB5ZCx;`?&t6n}lmh`Vdu)=+_c$y11Q(H#a~)%W3 z@dk=2M>4=Y_wMMhU$Luu=t>>}C#YQDkE*n&k=z~|Qz#Djvb4%KzT4$i9PcwBn=HJF z&wY^pwC4}MSK$t-bzHrU2CI6RBmRTSJ4bXzikpy_ekZ#YY*J|zc2{e-LHF6S1Mp9b z_+TchfTpOZsM?a{n;~r^zW^xyYfNJvG zE{M#FLN_*VU7c^IV>SlzqUpr|CySv@lU`z-lR^h2B)t`BXk6mdmXv)6)Y7E>SXPwz z0CS(l`{fNfKO@)4a$iupd9LNWPQObU+Ec)c7;obDDo-uR{p1o{N>D0qWR!APW9B+# zeWO3ax!$$DJMw?+bGa60Hq_vQNQ4o;(Jp!D>p`()9K|LKJf6A*l*VZ6Fl;}e z20-@LKFsnFj#W0%IJlx@{*%+w0z54Y?~&QJ?$JICS=FZ3ClRa)7w*>9je z`9p6^iV-W$eM%gIrRa;)DhQ(g$niL>{rs8YhZ0&VBq#Gv+}c|p1gzynhwEkU2~-ly z)3kpDZ^ALbQtWx`s4D;o*65CdDdYXEiZ`H&>&tty+8?)OvWoy%<)Ep9+{J!TvHdJ? zh*~|m6T{wxe?#+zQRi-^*G`)Y5PMdrdbIbry}|yqboZvVzzXie>j~sXTKf9IhxoJ| zB=(=2xD8T4gSST1>{3U~lL&S=TCU;UL12bq1)=2*KXVO>nYu2MCA(S4AQ^#?|fQL?tYNPl&87DsLn zB=rsVWfZ6Um5vt}6%ZH$DwlLr^k%s(UdsKX^xb<%PHs%&rth6b!jTN~-g9aol4&-i z7`*L$Pwa9?3>6i1;ZUK<@9C3lX)3buP!ZI7Mn&&B!20rEO<)1PYf8!&9nWzbb}0=j z9{JBW>A#5bx&V|_vk31e;f3t+9O_(Q<>lY`MgGn{Vv_!JE7jmY0pfnCd}0QcxX%L0 z`REh^5zNe1k&N=)1FsVX1f+g?V5HRi-QBJC-T6E1unoq}Y1F^AHZKnjB+kuF>c2~W z*sR*YRNSa@TRaDc>s6*E1<4c^IjJu$5oIMYAMwuZ>9)wvur@yqVm#Zbmju4*)OYM< zvSfY*d6sou54t=G>L-}HF^N`~SkDYtmeZ@e#3xG8U)!H;*#r)KrFNYycbV}s%}8+q21XL_H^Ci_ z2d)h9nbkbg9IpwmqVe1{>({Q+0FbZRVBPi9r4IZU>5|1e;iB(G?uVM|Kf70}8#2tX#%N{TP*zm_K z^?iyN^gQ#(@TCL8%EU5YT_@+K3QcQ%Qo65(n=e7YGT;_2u$LfjRfQu@*~@swxbTtG zR{O@AUvQ2m(j7HU6Qa)4NS=8M0(+zWxs>*Ox>&4Q*En98W10?pWJ<2jdGkuwfX(S)A7=`{7cdkb-4U( z7thE8Py+}!=D+i^hxsMvCkPLdGT{hV_4?V>S@uLh@1ysr74-!a7OJe?7N}`rkACIQ zRZwo{y>cBYfbMz>K?sPDxJ0l}ZV-sC3?a*m8-gf9C|fg<|+*pbc&IXo(VmjlWKnjy|z_lN-=dmFYt-nGMue;nw8*e8TJ}8 zOU2n3%n*kbW@6!nb5YX*(&|=HN4-RQ&7?A`jL&Vy#3U1jB=p=5XO36@!g4a?1hx^* zD&MD`+jNDKKwG*}+&^3S4JEiMe}U_4->Ce7a9&2Sm(I)CILH13j=H=Z>K~f-Zu`w{lOKX28QNKD!yCYx5@;cxJAceF$l~AlTNS#aAgp`_ zR-Y^f0=EP4sR@`^O}f&~8&y?s!u+K0bko@C$+FLtD%*FbZyoq+_=2ne9A)NbVlXT_ zQj+nXz2I*va%b}Io+Q+weAdU#Q-Whyz+b4U-j63vBzDqxUtHZtE7fM%(MjsXT8tz* z^Ju6D+WV#nHFKA+hPw=LsJX<;Az1znWmcifQo0{%w43u|RkGvz=uWN%@v>NNeeAxl zXZuj|CNpnC{pvgerJv|t*bU5m<0W=>r=$l2kJy^l4n&kgOB1r?R&k_8!wC8Hg9RAX zcL-$t`wSiuKW)W00>#Iem4!f_|DLGVB<_<=+ zrDql;H~3^&Zm4DSk@m58u_QQkHig`?CuXQ~z|K*#TH$jFqYeHNXyMq4iCL+A{0(0{ zk!yWYu_t?4O}ia+93fNeszbbrSdy7n(@tnWf9-l;s6kCbWrtCkLCkU&0!5%bo09ep zGyLbOQ+IiW)I{!`9+6}-w ze}B(Nv(GuoO)Q}&(?ai=a@oV_az_#Ez_@XmpeuFNN#KJ`am#hP+WyCWT~rkO|6F#L zu&Kx2cmXS$gS&Z-^>3vCGK$@RD0cd{M)zCSrW^WnteQ5ll6C^>H|R0Y$-%cP{2=8` zm$m$Aj(ki!-Ss5T z=%-5@e+BctNPhWnqR3*4heQea@w6Pr>R)9x^(8sf162O;m@l6G3~-qxxeXr{PI#;L z{)PVke4Xw(-tSV^wE33{q8m-d7ly zv?L*c{IJ|k7T{vs;z}>QU+%fG=TDa#mFWIg1wK7)K^tC4=59Xn7lh-VdKWRP#W^2s zP5u4x*6l!GHqS)69pztd75UT{*%{zU`sZZ#)#aa;`z4Q;In|T1r~A<1qmbW&F>F@^ z{2fGw#Q2Wx|J)A${B(GaO3KRbO+Jq-{@?#^0wHWaHd*yJ`bQCL5KJOiHsqFqbs}!d z$pGg&xC1C!WRR=%UtefjM9TdjI~8t!>v@XyH~;6~T?9v3@X5Om5DMG`w3GkWhc6zi zet8J_F+?Q7JWb?!|0|Xte-8UcrT^ncs5@$J=d+s!*t5|^r8iGnoKpU2PV(Y0s=9PH zQBnEFu5p)3wk-mU|Bh|~YCo`@0_<+W=9=_6y!a7lkZ3Pj>y%~vYD=2t`|v-09Sbc! z-t;pB65VI|UHeh&|_@h?8l<+veQ)rr%Osd5(Yi|=f=t*)QUl5^jySn7|T$AMcT@<^93&V*-zTq%#^MVX$me$rqMdZ#Pkb_Oe5e&Kid>09m$UiLcmS)Jq zmi?b4>U^jt861T?*~mwUfIoz_6uV;4{A*iuk|G!O6+DQ2+{Lc6 zQXO!Ekq7};OTp-sxw#m)kEVg*42YX6D9CC>tybsd{`zQER&F zt7do%S~6(dbOYynTLz3+62x3An7=}Mh`HuF(QG0BztwLK)svq`sYMzo45u3{on5m z#j<)dlz?e#2fS0jXHs?txvX`euJwQsAeqdv21YRL;K$5M@Q8p+Y|;I6&-|ncOh$TG zf>K;Q!|H(fe$+CghVU~iyX$yN>M9_wn2D9xadv0?^XA>mQgeTv+s+IH2}$s42waly zOI^bs{vZ3vpMTnJvclZ;1iGU7WrhSNAm$5?uq{G{?0W|Q@BqEbfHoC$Ilw8CzW|b3 z0i;l3iJbZyBLy1A*S=-R@?OWI5KuIMx5FVz!cT-@@fPXtPQ zg0RE=&mbb=f`%Zg%(EjRgc0p z3Mb|W@QNVi?!393AmwpD%%Kx{4qUvka$`{;!dJ^;AhOyQfvhhKIfQ8I`g@})R^Z0K z;f+-Vt0NW=;JLrkD;WV}QoSNX1`zL&QDUq_*93eKAC4Ai^yoKqMV6IG3zE4v6#=Fzg!(Kh-n2`JQskW5xkQpU^54cf2J06i&l!=ACCY3V|n`qz7j!j zB?j5#IfyH};L!!F)jft_1k%b%0f=?S%8ZDT;5bCJxZLTcH>JidUI5Bu=RSa8v0)zf zQiT?OLF((VGb8RxIPHSHAL)u5g+w!roIlgG8mmHURB6=*wf1%mS}KUQ_aTM+GS&d<31W~us zv^yh?S#3#+1{e@MzrbU(!fuq+WgS?4xr$*}#O#mo!sJ)VH{!RB33{NDi9SjtM+9fgo%j zaP7n80d`THPeDwX+Y(`WH!aEzckXUiG+uw@M0k?hgmigDSWfj>qruF==S7CCb?&WaO9n4>VQrB&Z;l2 zGY9gtN+QD}Su_E`(9{zR;I`Ir{e_rL;BxiaCs zEcst>(k1%~8=GIr`NSFah})CJ;1@t_t&4g<-`fX~St9rArtZ5J*D7wzSo^?Rsf#i& zdA2deF`B-6An_`R2^*2=z7$p$)!PDBL~F7O+gR7nv{N4g<)VxVeXEIi01)0RLwCse zPOB;tx50aAS#(@Vt1Ml&{iQCTKkAq01V6Gy4+X+__^Vo1d4j(8w<=5fdEu1yC-G)E zlErfBmqL+ur5VQ@1}7VN52+PTV>(m<>fXn_CP_H8z;+p$B7Ff=wO;QfIFKw(%hbDd zo=5g)2dgac>uP~#z0+X-wV%bITL`7noWE*!ID|ifT9DaH%M$(Ue~YbQ3&I}&lOCI> z49S8k60$badr9=M- z;n(%xDp+T>8-)0~1D`yjQpeu52bAi*fW-f-&JnUw#M%y6p{LgOzrk zGA>*u$g4PBtA^;wKU%&#$R~i+F-=Vy8Ybp`FqVEkQE9DlG4yzfjqY~a9<+ir$hcMp zGmN96L!%(3l7Cwx;;I_T^nx7%yPIJgMV1G3rBU8Y5FRBWGLj3TEWE8%4Jstp0JiwO zUjM()-2!7=wx4$fId0K<%FShT^1+Zm!@qh@)k3vEg!jm^+a1?K68Pr}zY|lLs0{lS zgow6c}artFHdO( z3eha>s*^=QhL$4Ss8UhT+hb&-(KnYRqAKapX$fC3dHx93~3L{%Y2MZU+D+P{FB zRnqtGo0b43RGRURYzcWT0FgD_nuXZ(zUGdBt!yF{fiQ@Yz&YEb$x|4QiJI;Xm@Xys zS!OgOaTy8VoU|r7K<2S;Qt_w_PR&7PGB_&Pelu-!|JXPn@^p^+0md-H@7wOTp3FCA zs53st_Amiw{MAmm7kayMO$ylQWSNZy#VNIJA~d`r;+rvbG}4|4-}!1Nxfymf7Cyg% zo8yW1(kz;Xaf|Qe!tdkuVC)Z#2jOGN{eNP*AX@;|4=0NUL1i({P<9Tvui zkW|rM=84Y(5wL_Au9s}K$nfyo_>~M~N@^fNPYaa47Rq0!aAHt9Op7zFz3a9tcZvIE zbzDnmdI`MYlkFdmO_1*V0MH3utWF^4k9B|@v^_BlSpiZTo(1_3gu_M)TJOC(RW!lh zCGkYQS#}1Tc&whjYGs z;i|_(V_=#tfvjss1KBMbMf2DUx?nNmDushM`#>loJHu+GFTIK(8y||J@NoN-6wztKIh1~<` zs1jh^luj5nSs}?fgUfi>2sT)^LwSC#pnw6U_opt%Mz^uQ?kgMIP67sz%`3**3%H!? z(yBIaq_9umqU~5j*uo+FH3FE)Hh)iOmQOq|;>AY>2jSZM4F0XpK3MZY788+VP#i2SQ^D`5Y~*!|CI9 z5DuBI;AqDtO+n7Vysc<9xJy)l;t_7bsATiRI1y^!#eJF2I3F|nIX--ifbRT;O9qZo>OvSh2|PTC1sKuhng8;&NtmBU7&@KTDkn? zyB|M3MnS0Lq+9Tn_MUHBq^q8wJ+JKc57B)K(pz}KC?lj7PD_di9mCG+x1#vX(P8XO z0ZaHda8U>=*PH_gPOQ7}<)dm{KzauVZlfgjSVl{C7eESC_cT9P{Sp=H%k~|CHk?*M zwcK!QYvMYi;f<1agumDBQ>e|x@b+5~ztZ)tCg7A6@6e3nWo=j|Md31(M|^o~iE8EN z=%#QpM)7(IFIq|`HyV4~^2e^m((Sh(671I>cqYfK8=B z_T=ErWVk5f&sxs~6^Z9(YS!5cov-|!IzLO&dt_II@pK%48E8C=7#o4o#pNl)0hIH6 zf<kF<1odj%JMtM4PQA6criLEZm;|Hi!eI70`Sb0w zU;nHLt=tgj4`>`?bCn{N#2_dlXV}c;!|ycP{DMW3?!63dAKHK$uG&K)2*xpxLR)>X z7HvHHnP$U{@9(xfJC_^37U|(`YSf(d#MRB`;f>+x)A0KBgnA~Z-KkO z&s`+d)hP=D^N-W}D02RQs|WQjYh95dm;p}V=$f5kU_dK=vy~Ub{MrUw`%v}62YJTe zme1UDY)a&A0+%igYvn@}2R3GZZ^U4l=!aRei=BpDz8MauDuI4Wnl=Azc3O9XDUJT9 zGYb{o5N3sy(Hl($B;COw~{e>f~Y((6eRIF+E~4>CB*V<7dfr; zDY$__$-tll8nQTY$}D0!9!RfUB2Y^v!2t9{ovy51k-*{g1WId_-Y5~T?P+1Nk*TW3 zwU22k(IZ~L;~gJ~`~IG|cWqnoUZVc+O2}+Rtp=FcLTzl>Uew7?S@Cmw&Q^@}UDt3{ zB(=DXC!v3HKLJFp#Xi?)xU<^I zZP~1FSnoi~$706!C*+Xin1{4cN{xqzMj_0$bZv)ZNw@co4vI&v=&C)cf1&mwoBjzR zovnF&%;(T34_eWhg%%N)5TM zFJYX0(!|vM2UdU(vt>K6jf5dUe>}?KaXU|sAJC0udF_Z(zX_w?d>*50rXiUl%@^#k z$z)LM3iVYRCn5H=8=>!mUaKc3-|u!8U~^?+jzO(^6gX`uzsu3F1jCB6EX!}Qvbu`f zye4NS*Z+AGt?B?H?ZDip>t>imlBS^&^L1>w+@NwUwBj<>qN4cSJU^B<_d;m=n2D0e zlfF=GGtW0!RW!qmVb$EhwqKOQHri|K$k8&b#w8vtTpBnoKmV0($%0kWvIvqAlR>T5 zaCyWZLjnQW$T^hS?zY3Z!TjZQL2p@&u!waRQWxH+Ng^|v3Sl*DUU3&tF~+YkhNtN) zaOg>S6i6QqDL@5r_`s4$PcYn=YZsiK2_7$j+^Goytw;GVj`#!(QG7jH7@>Fqzol}I zBd+N1*Qt*D#0`U5C({PCaPHgukT>!%BJBx>{S2oR=zHdX#PnJ5r&bnNp7+ihai880 zc96=Ok(wydJ@G3|f3C?=EvZvRC~&hMJB>?Vdh&g1m(-FaRglpPp*f#+NN%p!v5_W890?})Zjk$2~+ zk|XSJhh5|+D~ga0-4ejTPG0Ct-&?K1_QAV1vh&&SqlK77Mq2ruVv%YTf%HU;npnGn zL-~t0<(jtew0mhc@*hxQ%Mb4tuwGkJ3*($62v(xBuG1`a0!8A!+AW0!`jARC6@XRu zxSH^_xJ%qeycSfO;-WY65vh@PSZ|C@g@4L-$>~^qp`F5|=tp3nvhL>&$Leaz=Jk?ejQXQYbbo+is@31_h$;|k7J2oXTdoHC@H0uqZ0ic054+# z2Y!ka{1&K-y)McEv8>QWw#ih3Tt|9>%<~*45$W08zw&u9wmZKAVGD^fNgy9xtL&8@IPWubD2whJ(~ z`uRJiz~%!+0<#?(H|qz!-XTm?0)ds%E~upedg5}8vqZ~IBd>{{nymr2Y^lA9FN*&& zyHlmclEQGW9xlZ@;)?Gqma!#-(!U4u6f2HHZqYg23VIy&lJ?P>Tz025DyHej(SS<1 zKmB@M{kD(}b_)u~;iw$+4`4DQ$2y0vrgG|YZshE9Wi94Fg1f>zclruQcs4PpH!Y+h zTyv>sUk8P{=2B86fk$(Hvuic)?~=FblK?!ahubDwi>#zYa^X@4bgq!U(u%+Ld07Q9 z=JKojVWcZ$qRbzdM{U1UZWd0i6)No!Q#9v^g?>tjt@Ao@qPVzIKps!It(eA$DHQae z#-2c}t$J2NB%k4)rj5H`1xB-DvnOlm_E|wj!ikUyAC`$f0(lNxoW)5?!r$VOB5^3Z5kpcfARZHb zkwEfLNauG!R;!Dmwf1igH#?KlBrLgFN6kE2wlIcTE$`E!`Rt|$<;rO4kyqiC&~x7J z3slAa%v`TgqZ=7x>h_mb#I49x;7t=$7jBDcVd{-Yu-I|VtM=?DB*Xl|My!MW zDIB#nUnxJz*I6~z*pK&H`g|hmdyI1lFp>F{#dqXn+v{<6!^6pV2b+#dWNg_e%;ns~ z6Nw%XK*&wkK;kt_?2ZEb_kgKRu@Hv09Te*y%RJpNmuC64@Ln1z2`4rVpZ@H$T4%lw zzC!C{Tx>k-ZE_VZjlOU6C$fCHKdG_5&2$!LxaS&PL}8jbRs52gc$6f4dqqQ*L;&U| zT60BBQ=Mk(RL9>N`Z_|+rNdPcw0O9vAv3C%-7Fw=A4^hPjOX-*4G+kwzDYK4qLCrCqa zL`?nnK&tS&{wPSU>S4~{x^=jW zOdB7e#=0&rm6OpZin|0ESIW!D7@c zb|(G9yB0n-qFJrDo)U&K-b-MQHS!~-X|rXU>X^>#bFCv-t#I2lOK~=QZz66P{IJEh z$*9VP*5Q4j*MmHovR5cmwNJAqPsWN{*^DT*6vSnrAHMlT>A#6?WdqN%MH6U9Xe?CF=bj0(&l`g zSBCDuTNUtwxnpA0OmVNHsUc+QWfSlY3ajD}Os!@C%(ANDiraDe5_)6g(q84a@C7tR z88}f1Z>tGv6b&KlM)GrL`;~=V6{`TO8C&GhjqQ^-AHf?&9LD2)15eR?Lxqzl&O76A z;xWV9j>^My0J5MR0eMjaI+CLB$sWy<4->Cfj{;9<18>Tftw+%#MxO$i%Ny21 zR!vs(=wbYmxtW8Vo&=<;L>!xDGo(t;=kRdcyt1xWg%WuC!}HD&=*Lz(1V^xa&5N$e z{Zrr2)iB!4AEjQsU6FHEFpcHMp*Gdo?_Vl^#ked*owkG2nU#u#=c1MZg8eU?4UbSB9G|<6#knVbKhG1Q>wnVyn1C;kQ|b{ZZneP zb4yJz<1V3s$gjTmp3LzJ;x2ut`ch2PHDWR9YTXa!q}17kwyR(L^~FpnRJ<;(ZesIP z=VO=PxD9xnRwANT8bOo-lJb|{nSlOis{v#j$OtBd-vKJ;LSY=(j|_|yKsHY@He_FheWFHn+Se4sE#*&NgnVWLF|u{ zPt2}GpR7x56|c6}uyNVye?vzOPF(CAjbVhI#)(~;0IR|V^-iufTwhP=EC{z(3@JC7 zIG$I9Tb{3rZ3-KmGW>EpY&@7S}^zLrl63m(J54C;;0;G0$xxmA&rWJIL%?ml;3 zJwc)cza@>#7D^i7cK9&I)#|Czp5%fDWTDVC*D)9-j5G8K(-5Lwt_Q%V>_JT_mv`lhVcjoCnnI{8x_NF29Y6zgH>CLi9eog_haL@F>=u_+Lm%5C(H&|pX z#}GTqRY<3Ruda|bbn{oZ=00}b;!>Z#O(in<{H+uI`1VH;g4J8=q*jZJuU;2s#LVPY zU+x5zO!wi9TSCPMh9F4>nZQ)Z?PNf!GA9lJJsJ8lS&%ghJ%29n z4IZC=fe*VeaRlGT;x1_yeTWnxeXI9s_qb zR-eDmQ}2GX5CB?XW$F9yWeo}SZZs^ie^G@K5hdNf>dY42F)%p;Ln;m5N9i;AGBhw} zU1r|oN_4ZGUWWr>;Z`rIe+x&y0KomqMN!YG~YVT4l3k&@nj4U#Ov^Nn6r&5Qd@2X>lrWtaQkpW{NOkfl z-i@Kr1DGV3g#T!TbG)x6`t-%``VFZGPqau*qdg|$_`K&U1Z((H3!6{?@NJfRQ1zvw z_i!e_az${E=DW5lbt_v)ed3h>Ue+_SPst7=`F#l-x>6IzZ9mJ@KFDrYKb@DE%4vXT z)F$;EVz+o&mCaW|x1J)GyRRrd)G2LSiA)I^`vjv-Jk<8}*ls0R9jBCDvx~J_EYhBK=W#$6{YH*#Vex{gIJ-{Khpm ztS?frrzGl*{8|5+1t2n=!HpzFo4r5QLJ^YMWfn&^UlPAk8!~S?Ll`EF%y>K@`8k-B z8_~_iLfvorQ-4I|^Cs0-BhMUYW=l*+-W)U>wQJg=T)fi@oQvmc`9zBTbDgD zA=a^Ep;6^T|w3SzF^X-)Gu^%w+d#%1d$&$oBBbrUnVtEoA4u^NtDe zEA-*_#3e)L3t{DFDhYU!CNzIp-q9?-2B4C-z^a-^EwL#dx{8#`-TP}oC-<=c(n_2a z=?dJc`UUR?!&&6LxXTDv?^KglZJlE6olu&pZ!@45urTUW z1#7dWNb+3cumYJQ_%qGk#S8T`52t-LkdFNgb;;ZNfgD^%SXkOA zNcNct!?--xpgn*IJ)F!3X#*x2EvV70%7HDA{>?4dEGKmZ`+>ZCO?+G{lIrns90BPE zg@Bc+ZQ*eSvzaa1Z+fEui+S}OnCS`aM}ltj58mgQUS?lHV@ZBVsj_aFA3mb^axIk2 z7J^Q5;{kCeTJ&6{HMTvLWL#OtCnP&XZ2=wu#me->beLOY84o@fTEc5`i+;x6Ae|Vi zs0U3(4*nc1$lQK|C~dmPKjlq3!0T^B69{?M&fv=IyITRZd$>hgvk~}9a-C!Peh394 z^-RVNEM~gXtn~Hayw~EE-+iYE7bE(+Cga+82JShxQZcCT!tVD3E> zyL$pjw}cr#JQgP%pr-MYj0Abr9~&FmC82(5huoq zCXq*mgMbrr%3*?gvL-&|VR)wE(-`smeef2E>CyhW6>*D$Y#0ravl&3M6a)84Mj%w| zj=xK?i-yj(JBU_QnLOl^h2BFyqF1ckr{#K!2bF0Q95akS=rCz~XP}|!x|5@^KpqUR z0dwh$(&j1jISDkN4=!TLD9h5Z2pZEI##r`)#N62asbXy=!FMs)`32bwWIQISbI-!c zvX9gdI-6U|2K@GH6qXEk4`Ni~K1Ri3QfpCIQG&7ENX9Qh^Me!vjw$xDN1v$P@;iG& zZ-?|LbJi04)t~O(N#wKA(`wTM{EMqB4=)GP#T5z&_p_ju8LE!|9ygW1K_P#cKNq*S z(g)$Ygl+6Pr}y6D$6dM*0}pbZ&Nq*25D~)3Mh!upY%@u7VvCHJFFE(BK6ecHe34>5 zx4+)f+xZ!wdvc9U;FG{g92%aBHC$R^eL)pG(GyMC)~&JE2jcp-n4OgU%7k{yuNR-F znr-ZYdL)cSoL*TDA9yBeH1+~8hn$x(pk+46xUu!)M*j<@ts5=Vm>RjTV+e^S_;SYI zo2K=osHnhj-(HCUm0`Y}H!Um1ykeiw4<885U;GRqMrB5%lOHki6A)2sk&@qJK7ahE zW&zhD>|-c?S6qCFfL4pIPaLamaz!^^2%ojZ7~-c3F~7}}C8>=8J16G)GwS+!`*BW` z6T|uB&+4cH`@%D}^LaB4Mz001qaFc)KNLNsFmwZ78ri%BGC9Vw;UR4<*>dDGxuN9n zjc_~)N!PMv!tV6sxHZz}T;HJKZdEH6Ej*#3;Q++VKY0;UPC?)piznM`7RO~2u zn-1en-3A1y!4SpKJYe+@$Q~N}s{<)j>Tfw$WcfdO(TYD~z6|S$)0a|GpK&}g@61f^ zSpImQ8uVb%+03^H2!CG8T=Uo@LnTc8YKh5w!j4t4;7XYwKKF)`ZL>jY0&ODBQWZM| zTfK|#{3<7-E{T%?%O5q)?pe_L&MEWFcudB4sR?(2%&$UhmF>*|cvdTHt;CXL9-l>l z95-^k+r2{I&s4Qrv@phf;3IhAoQ1XWjqcf65Z4N!Q^L4CVRnltd}_$YA3t4RGu|Md zO*NM6LqtQ@x4FZ#n#eTVR8s9I&q7Qp{wb})vODa9nJeg|cUdFlnW(B75J7G8pIy7r z#GEFr(_J+hT>o^O^t1hpYtN6h z7LeVm$|$_`jrqEU9KqO0AO{nYBa-2bU*TCxWbF3X`+KIqJ5?r%Bu|A5a? zMPlw(F%9K#|23IKE9h1U5H69wICxMP>DazA_y#yaIZ|CHq^e9G-h<(kcof4NOjh+K zCPM<-+GOqu?&OxlKZ@Zx?4?TiL%w{5fUDW1WtPrkg<#7jvUF|mJL7bB#j#;kAYXQ$ zhY(da@JSf%10~j}83ZK*of@9}g3s1I=95hLiT z=Rqd$wzL0$`#KXLQGDbx>f{d111-*qonu*5m)15eOk!U^P5kQ`xQV7@Bx$GIT zlS3Fwy>-+LkWb0Gp{gO{jAHHsIXL@<; zFOymKqHpG2xLK^edGyL!^>FKkEoL13 z342i)K%ZjYv}k?9U%Q1 z(5=ms@&J}}|EwSKiY?1v)y(A5utgH6Er5;<9Bht7g|h1S3V=w66O1N`r`KKmg@E>R z2=@z$=3et}lNMj;90WBW(CpHGm3c%;Upi&|VN=qpqB^^={QV)o9`j8@0(jiDHAqs*Z z4H6Qso8BIp+d5 zPNHfYWhy@+>C#QD+CyTJyRimy6eZf#Qx5%T$mNt^&Vz+TW}~D-Nk0_h!FPPmou@sf zAMga415EjH8$FbL0`qlOw!eX-pwHPBnCKEv4c3g{;V3}IfNJf#&9@IRl+`O41Fc(W zXFp$kp8XHCol3x~F|iL5|N6mczfbKKu1C$a^>DKmy1J4o4nT1wX$k!CFYP}o_JamjzxI#N zl7v3B9k3&f_E%x_uD@i zoiyspgrjFg_YQ&XgA`HcXsUpJ`TzJV=;&gnn0zm^>gOtzi43<&7|)JOpkGLGjN`h? z3&{bXi(v2e4f1!|3B>Ug+VVg%>{#~z9yJ`-Q@rfBKtmRV%FJaOnH}qTk0Ap(U5$5+ zSb%m793|isOhU#7Rqf^xqy*5L{{wTH*Mp|Bpn>SQJ;z9L;@Fpohxdqfc^~olQ&0fX z^gN(L;Na&C8n&%_kXRlvt^%EZPTGb384!b6bUgqAN*pZg4wlMsm4H_L+8kC?iz_t7 z1Bqy?BIkfE1XhFF05{wO>R~2A?|>h=@n#d?Szw|t3%HE@hEt7?SiZAkBnwWnZ4Ga6 z`X>N7B7TU#@*-=5HYE5BfAbd292CEi;svxR^ZXl4vpS#rM?++XKz-MHs z@x1ySAHL=8=!^U*=c<1F0#pzNTyV^RpchBvi9Fs=fEX;qIRy(jh_ zurP<|^6%HC@EVDav8$(a_Q03`1}d#gC0_yoPFUS=JF-T(24&rLwpjpBEVM?wHL7xh zdsEb$y2Afr5pD*x8@CTP(u-x-z+MoY<#Y%K+QWEt7b*ld{dNsf5BaYUKfao;Er(rxX{R`44bsbW@3 zx5k2Fj|Q)Ve;DOJQ=IbK6?I#s5}1XG#l;pPgaR?Nk38VHdYr)8kfVe?bsKgS%s(SV z%MlLW%2m>b1Ze%sp7ABzyWu@BXzLL{CGNNYOu53Q5{DbtqPOcy8)lBe`Mo|)qj+fw zCJaUB2VI~Mv?5$b2;+D=5LgjnQURd(a~GuA5`lV=t_3dkL4i;*nRLZSaeM`G^~Pw~ z2523?AX>Dn8k{!SlJ5hh6Wqq?oPm|77c#Td&x_I?!R@^1!3oB~6(si7^PrZG8@^4U6vN;dEtaVuVn6Kwy#o zfY5P4Wkc^X+OOPdbM38q2nA0F!E(p6www70xPpasfJ#FiC02Ugy=fPA8^R;z1x<_l zqS~2z+u%9lau*g=*IXljMLPM$pjx0!0fhvF4gpuPdp|do8K5B?ZFbJz(=ekc2!#!E9 z{@U}f7Y+SQ7^`^*+jA9ccOBK^dB-6HT)lj`xd$@Sj_q`i%`tml7_$H;B7`hO*qtnO zda5RUkHKP4Nd_2Zw11Gw3E~SZ);9t?D}b*l zAOp<-n@gm!f)FQh`qIrMb)y)d)n62abU=)+I@fv44?q-13+}C7Ui0Vt=@CabTl{cz zpd7ksT3P6|gpI|QRSyO~twoFijgH38jY$^5iP{2;a;iJ#?nQ%+D>fC*(0JbPnG&x< zpms|P{E|PkF?|X|-k;bY@8+`3(fWHyg1_Ux;If}Qlh7PQ9hd?=9dO2Ny(-c$D*hQ% zC@f-mk@a6-a53a~3J8^h5ejq@vc>&S`FY}y!#&%ziIEa^JUJ~p26Xm@{Se6> zU>aBA^=#Q=!|vUmd)YMOTV?Dy{~CgWO74Wu>9fcZc4OR;B>-MpUqCPh4aVegISeif zHH%G!{0(77LIh_79mvLCA(S%T#Yh9LgWPpM)^4A$mu z(hPo?z`N(y0o&%S7snrLVhDf*ALBtv7>xbcj(u;q{Nh>@Phsi==-b94W9E-jpY0|d z=|Ha>RFKditOtG1>TK4(50kYs@yqTlu^;H(=jd0Dr6Y{4SPY&GbR&D+S8S_Y)dR~k z3*ZgS3^}(oA>fuqmMB)3`y(q4#Qp$Yku^Z$-DKd#Z~+cYwHr{h$#^*=S;EJ&ykhM^ zQ9y4uAN?#zI{$Z~v4EU#hLhU;)&8tVudy8XOt)ckCmVLH?5$ zFl#W?ZKUQ|741goHn1MClo?(Esk{OZX^ZR2z>t`K0QpL8V$EAKK#IK@GeOOolf ztv{-Gk?Q*MQe>ztibC=q&F8v|4(hxWBqw^iW1+g7;8g;#fm8+#EW`m*z^c=xtO1VR z5S*uGX2I$wpYGSzs0kP4UzAyF&8&jvBncYi6P5(nCoNk*oOlErOj-O;K(0awKA1yB zh*(6O#DFxJS@9x^G;p`%Q->C}+ejbLwCVI)vjyFA ztRKMJIXPL6RZ(9Oj=Hala7vPx*r<+y=1ncS%|c9NA9$<98)_V+yx`R#i{de^rrLwf zd$87RDx`@I2gY-bEPMzBzb`i3Ml`XpRpdX={Dly-fZPeF9eJJ>_-IXh@qz&WwE%%| za0IrBJ^D#JVOL-PmU$YN2cp_<>;u8|^yCeE&)1F1V!uWMo4onA-IXoc95L{k1kaxURGh ziQsF!JJ}l2=ydomk5))(1j*+SQWG0`32=Kz_J^SjLx#vaL6AZOX+iY?3r{8&og$%p z^Od-3L;j$a9ONPSkecP<^&@hHo8!#nF2kOCR^ zKZ@V$i1PSj;@n~HjIZpW-_RQu4W2EJ z&Hr@<*gEsSSEc;Fyo>*mO~-xiLj!9te5IVDeGND~tdNi)Dt{!b7qHS6_rnI2L;V0A zPgDjA1E|*2o6)fxn%5`K|4;dR>=4<-5nHIY=;f8mp`Nk_IQ9RkEr)j6BM{xB-T}=z z=)6F`(fPF&MD7T-fF#rg4bt$xnLBH9xBmY9{~KxifBhEn%>TPw|6d{a|5Jti|Nk-Y ztp73C(JNiDY5pV??{KQ!L2AcqSVQq&?g9U0yutnFxRn4ynTDA-bXohcBJy9}5C5$E z|1ZA<6+h?{6M=Y51z<8HP$Jd^9L}A2?s zwi{~@z3TUCou>Wvv-*r7<(`Z%wnxnHA!pQ3PmO$#e;eQv zrjvz5BY8Lxe-fpD;1IfeUw(+jFM$T*uHW19o30733N!HF%nv`Grm^B$Pi1C+H&KtM!;`;e>c zPX(DS%)<%X2j4!OkGc;OLrCWN&Y8nJ2^d2-emm_CRkes ziIFn6F-{UoX6FK+lw<%DH*d<)Zz#k<<{yU;cpkP;c)&$V<@Z5_hfvCoZ}+{weOQM@ z3@<^x8r=N}DXVWdjP1k2b*5SLXaNagTP38>fFh3N2f_hno-&gKTEMd7r3}nxRBs#O zSPjHnplAWuJVvEnM$q{SxR})8ns5Swt;dB;n8rx8{cZn#p@nj5&oNMzao1oCr3aAE z!2umzJ`WfRTni-4ko|Nfixr8oDMx1l8xx92Jh7+PSp4^a3-U0m$hR{q4L;DpB_V|o zYy=kAFKmIWf=tTK5|1r2rdpGFzbQwkObCr$1)o{i2VtT`CMU%a(D`IS)kHzl2+}Hq z0N%R;(8N}l-i>fenBbg|J$|*90?NM+I-J_Zkc}R%MLv6q1nqwU2`-cYAZ-fr{0_+* zfOKnvNq`PTq$;p&wZKjIfVRBKX<~33nbRSEaS}Xbd!JQEInOk?_DBY%BBleSQpXe} z{jjy<_w(-8p6n{vgLX*IL{4q>@iu^`lD(c^v2%>7geThLc(`VX8Hs1pZk1ym)IxVn zV|G0inxRTE3XHS>B127>Jp);HdVl8AbV$jexFh5_0tpzI3^+$PIu?J4bNZm2718ur zDT)aeSt81v_ZX?mv!x)zCK?bNiOdY(PG2&`t%k)`-%~EwzzL#XNYWq`n}-S(_AmMu zJ|%A$%8a|X)nBln53Pj_jWK>+s9+oBq2ev`lGOx3st6O4pX#=>zki zh8P2k3SeBT3baHCLda+!m5hObnGmudq^VX%9YoybgArQl^3fk*1}t%3weUy|w4eY8 zyWx`w|Eavq++=3=E$!@O&bo4Pc?E1l%4k;jXi3XUBKQZOJ|SK}Ca`#91H~d+_pZ1? zgJtZUPZ#pV=fZW!4m|9;5}5^$7PD zGK`}!;K9|mZcIJ48?eD*u4ExcCZvPT(sIGi`83kbOl#PF(G3i%d8gm^W78Gr_#ZIH zp(*;W!_&pj!p2Xx{YJOH#TVtj#wy@gpU+gNDh@ zXb4!OB}7(l!?Y!yNU7^t5cIjHO+I8ig=3ksSCHQBjygp3)~{4W%{E!!qGAD=hL&vh zHBf@u+uM9HJ8yQU;|1+VFxjH-Ew|?kzA*_II;>j_ zy@h2!{32WktekaB*08Bs;7VCuCd|&rjKSQqP>6wvmYT0X|2}fQ;1a zN|TnbE6m;y2q~Xh0Di0_@>;^vWe4}txg6JA!Lbs%_!epw=}vGwem%mKvQ!1F8P?^5 z!S)>>2`5n8&DKbVBxb~25$sQ%z+G2-|KjDIISa##OzHLEECg^|X$NV?z-e}EU5IFV z8KPj3;>$PcQZby`Y+l8-71%5L7Z_!4=`@2F83gX4&y ztNuVQvpzJ$ozPG1!|9=$`aA?i)>awq-1j5@jags-^-s)#a}s;=WiYoL&-L?R%nD)( z^zZvX-QLJLF%Qu7LL`_gxZF`7D_70LRp3zwi{cOR2V0=_6+|e~j9>qL&e0xMa1sew zW=^8H7MH*SGNB-eQct*i3T;zvuGZQx4`mjF+dN41hB(Y}&8v5R_BMJmE0kh$C#mJVRNSB0!`F=m%C7rM@%Zxm7R)Ab1^oL^;ucDKK?$VZ1qz1;Ke6p{0M8!_Y%C2w$6~_J-8|rA15!d#KIc5 z^5di8Tyv4v5+y5B2@@o4LKaIjnl=JyEwkrr*xMZ-f&O*ff=#jq+;SH68G7e~g|2wN z;TJ*u8!(Y#EAaYvG*yjWC#B;yT2v=gu>6ayWTPtymm$AaOrk=6r54oF>o? zQ0I2+Me7L;X(f=tU#q_;>bad+;G7PL40P05q!dOWV`UK{)WEyiv)y}%eBkE0cKN*@}85Z+NMRqCw@QXThfAR3{6|$6s>awy=UXY>VuJ9b3NkHUIC9>^!mAg4XJ}z_2{Sc- zmU~_;;{xh$;sq=TpP?i>W{v5s zmhvpuuo1ix&e^g{G3A@wA@t*_cmAn<{sdzP8Kv#HdNKzwFqVGbhKGnYK!l~~|66x=zJ$Zg*6 z=u-BLw%s!Y(RmChFy+nUJslbAwXEVxvF!I$ZpPqA_!*xM_eZsZQfv8kEz3!i5DXY% z7!g|IH~$*+hm12+D}$P(8}yOyn6KThsm5!vVb@fI#5HqDiL!!4P*A?C*lsYwO)*`A z>5_joWmJ>#M`5>(2@D}n?fH6U*z2RE1m;xPh8DTnEyN;OQ=mcaGdu(5PR1XoUM;2k zpDVU@XJ^|8kuk=w3tef`vrXau4~=wCIe(op!THZ) z%ls#j-~x7;KaL%f0hRSakr_CbnBQGxEW5`!f`?@Wk~p_L*mS}ATt=0}&n^-!1gNRx zfbgPxvnJlw>nH8b_SZNSaKPeoj8eARrOW3y(0zEdV!H#HMa{y|8#Bg9ZVe+&8;Oh; z_%DQbxw`R3H~k{61Lb|>4gRk+gpGC&PZ?6n3Vt_RLfuWj@{=af*`luU!T0Pa1JuEJ zny4^VEa-LKoh^5omVw3HWU6R!M!2AnZkV%?)K`Sl%?7yI&*q>XU?!5=dq$4lOSAI^ z2-aDcw1&5E3C#|a98)KPzt)`()zGzT!mVITI(tDcl^OJpO7TxmvTmHesIu?^vAS^Z zYU|W;UDgi+f6+^)0A`}kV0EkE(hA!rj2kVCiD&B-WL$YF`~FF8I-~n2Wl8W4hy1ca zbDB2dg)=s>&n0*h%sr!6w{M)yo1bWOf)ET3R<0l+(JKS9c?zykLs^xY1{S!IP}~50 zt4i_}Akl4u`2D0;*8Jm~l1GJMhqm!5_U{9BI)|kgMzce5C$eOqgEvqP#dv-&&%k;w z%z@?cuj1V(WAO(|^R!u&!1mE8)}3-@_wDv~h+`7wwHwHtHvaSF%*xFF@kMv$5{tAF zZc$*|8nWdbbB(G7=n8Gv)t4&|JzM`kDBhx*{=&!EPY~NK^BEhOdBJh` zR-~S;o*9dqf8EQC%XL@cL|Fb-a_e`#PBUlQZ)v``5@n|CYbgo4!_4wj7{pOft*40K zx{GmfjCn7v3=^ad<+HwCx4SnHqd%4>zU+RLB{5GEdZL&E6LSKFNY38svp9(csT!{e z`5~3&BPb@wW03NmwZl*R@Ju)Kv6^!q4YfFsEMMvZv4@3*9Y6=Z$2j?zY#nb&+9HN+ zmkG+toyLjsxdS=c>`p>T*UpdT8 zhI-mhKoLz_;tZz(*x`8P)@xO5A3*Gq9N1UC?xIwQt6z3dM|x(t`l-s#!Ti+2Yd>UT zhXD9s<5fVlt(v`9^_(hj+jUK-2JfUPisk1~Oz?F=(<*CH;{7bfq46boKv`A_-tWlA zQ+%L3&z|c0Qy&Oi4|#*#T;gxC${d&NW$Wm-qseBxvCpsJIiyPJhqt`3urZXoP9AvX zhDu4ye*q@CBgzzQLUsf8>3n)23(R(pM%v7u)$VzDSKDO46GGKsn|}=E6oh^`IKDjj zRd)=Ng&NLL#6!~7E)Wa}o`E4`s*pyrDPBxwQhfY((c!zR8a1i|0bY;U4YI#19T@awi&HNb9Ym!B_#pehi*1v{i&d zJ;r#8LibQVPgQGScA1)^Tk&L`|wJ{Cu!Obhv7ls5Ei44JygJe8RvKx3t) z_~O}4mq_SkE;io;*FaLSv)o34*2L4x-_8_sKX~7&d5}Ys=+Yw14r{Os0S+Zqw%+!%;`3-!Fmu2JA_bRKv6CB^00a! zQ{x(AA~YCTrjqULdZwbIFc4Y@TFHbz z3v?U=UR>lPt1~#W=8x;VO3MmiaSUbCX59_!IA;H*07`Yp4Cf!NmFQ~6Ub}<;7F#gt zF3K1Bv?@30JASG_)wq_ljrh9=e0VwjB9B}6UAf6rWl29^NsAso+79yQ?Yh21seP?$ zZjc=zq88$K{&4w=*fCz0)oF-5&W_G*OOekEQ5xp+eK@w)3rbJP;+f<_Hj5yyUavcT zkOh!fs}TDbr?fKZJr*o(=+Y9(Y57OBtVJZJKLyo=dN($GwljGC-%X5D7;9>XllAR< zPiO2if>%XBa1)>`#1^N?|8!@*Ls1O@1hfl51Q?uwAM7o7S)nvoHHNJ#&yKxaCu{_< z6eVzb0NyQO5`rJp*(5LIV{kPx^Rb!u<9idJIS!y@hMz@G@z1m{+7V^9UWUarPu`w) zZLbzNtPdB+0dVT0Z)-DIxT7W5c57Iq=h} zlbd6r09Qe8>>u}S|8zI}YDG^&Td)h42)-+-`yH5RpLag9f3|EsBKrc!t>cM9|NHP3 zeFeub`p%2@oFdO&t2!5S2w1Y@z(pL8`hno1m7y*#nGOsWScbHEA5w*rGS6he0J5*W z(1pHfn<*dm88&NZXlGO-zB|qd=u}X}{m{#7_5rR6Vi+7V2R8i{6!2;|DRW(0%p#}Y zedOO^oPUdIcK`KL^WIrY%3Y9?8ih_YesInG9TM>qWSG*w&Ma__^p(drW$MVuHRai5 z!EqU+)?h|KIotq=Qy74x1xX_S{p{%VOT!Zb#OwXjDE@?Im+W{3)o~>>co+4@5si^N z_J#;zA(Lx_Y7+@C*-g9z7Je2PY@YNcd^fS?{XVCUBuuNIteB+*KRn&DVUJB0I(x1_ zL|lw1Sb_45TgD&d&k@H`*p+|a4a1E#eTJM$K(h$=So!*!HV0sYaivZDP(ts&W&7Zf zd~rqtW%_5XC-tg3y@=bYUhWXkTH0CfU4AZI0b;~U7vsVuI|1Q)k}DZS=c+n4bjVPG zSi@R8U4W5x1h1rg>lNY)2o8NU-9Epv`16l_CHPNS-Q~p^$l`tglM}MaThT25Di>R0 zuA4SsM{XFCB0wl_Y}MN-Wabn|Ce}8t&(c!cLc?D`n9M^{`wZ}DI&UZX>_b<*wOCE% zTg}9H9;Vg!-Ub3ynxuq2-`Y>IyB66I%NZjp1LE1`QX9m;GibzTwVjGawqWTw^mHCFQc0YE|bc%P~L!@~RtFFJF z&vR6>AiUW52Q2a)LAHDv94uD!!^^djlC5x-Gb6_@xd^9_5&O?=3f+LZ)0To-L zxc2n$uxe$sXb%QZc!hX59`1O1j>qrbv)(8f)b~o=@X9wO7c%&+Dtg&_g_OxcF-z~r za(-Z#Ss(vWt9hiP)u(wss-#mOX)M)UuKx|#41ltrxXSXFT}JDg_(Hg3QIx80@NZLhrqWVllwZfA2@N4|kj0O~ zfVb3S?H8!9`8Uqj``#KTg?7HgZFjSt>3ibEzQPYjhB}!jo2)I>b!KC+mh#N6U$^Qp z_PspdfqEu$Q0GRFrX4xlvAu4zFv0IQ|6)_?@x6(Jy5}fK&~ETMa@(PqHL-@oy$o@u z-NgeL8{IS+#DpR@lS-7XLl)p5uzOl6$6nw)gwy#4#DddtC_d43i+G-g4Bt$kRJvD{ zEa;k*yZV^A;8z{f#{H*T0X!oqE7bFVBF$u(f?<`rb-fX;^EGf~M(+p{(Xh~}4w%xD z&Y@-Guq(9Bc|K;(;2L8dylYKy3qJt$1sve8G0-w9yMGMmTvI7|&5+uK86!VNGlJ8y z)kI#lZ&~VBL;Z(%Moh3Yqd#4a`i?;mNO`%Z${agz_>vuMU1lQweqNR!_gr!;R6E1e zmsj!olRz*8Tb~mj-Swq3fbcMKeT;JF+Ku_!ZrS?We-eyRr$F;>kKD_i%i=nwb|-odLVt_1zDrF5vA>(f9&LGJ*IrI z=jD5G#^?7#UK4(82&j|dbmAq_ z=e*Mx4%45W>F(xAh4~4q7w`dK@LQZjCnU-1rHj*fXZg*`yapqSFlJIF=~0K&5UR>- zLVyskfkLj>2B0Wb-5yE*T`5TkBe$Th*hSoHTeVy93c=G1YS}^CbkEq4hEhO2a9t~S z?v=pR>n3M-CMT+sKcbx5lli)r90Y)F!t&9u$QMN~W_=2dC|nPtqs#aUu3NN{R59K% zefl|p--Vr#$#0C)_t$u^lHbq7)WuPUsf6KMas?=w1O&mFaJ6&~g|oQ|$M+%$l2 z8dKR1T2CAGmBw`o=LAW?U2{H7Xmh#MVK^+3&~!Vxikrk-g`0G{W3K8l6sKiD8V}Qr z8v?*Lxduo-yXrDM(AfIZvbxppz<=B08PAJ^#y_6VF@{d{=QGQq{FPa+bIOrXlu-FI z2ruv~+*ViyWZa}Y)|K5%dq;9+6#$yS8ks8>jLR)#yUiwOOj;*E45j`{VP5Nlu-Uf? za%VLlU)|;ozOhk0dogsXK>K?{!0`XBo@M5CIbN!<>|UQK?&L|XXdhF|Qj138&%b&Rx7V;yEm4Da(qwIm}15tL? zPE8JqqyyO-y(U0AHNj#Q!+<-2_W9}N8LXj|`{ome>XG8h+0cv7{ixgZLjW~hea<=S z@k-*&$E!o6ULuSI(G{zO9Y@kxl6lu}7gE^u2(%{f5Y)TH1}7VYkD~jo>{>O?=*Qb- zl)Akem3cg>vUS0o_@iCbbxv1aA_F5y3TkP^%R_>=BkaxH=V{hC2yPh})Fw;crhE3Q zw=^cf-O<^d$3X)((w1yqS-3Uqcj(vZI~2!Q1Yk=1V6;H=bXut&bnFQt{sOCL!`pMi z8)#t`vQUEZm@k6VUAR>-zc(s8gP-;ee9QX7LBxw))usDECzuD^5L^V3UrUaLj}XR^ z?Gd@=)vdB62~zA#5QUSEn6puXk&2}GMDn}u>lVbdqRC#v)L$L$|B?#+oH6w+o6b6L zWO!8oMInMseHpw{tkyrYV*G<}U9zzI97`&m`Q%4$1xXKe* zTbOl%DDa%zA~w+{@)xsYBAuyHsiKiet+!R`ySND}=i>}q{^T&zGlk1%^Y^&np2brP z@_<2ANy+Uzbq0=Kn$h;6x}7UJVlzR^xT5Cj=HU^B(+cdOzIZqU0vK z3(WV?Cu@XEcZ+>RBR}8#{oxFN6a^9I_x#LpvefX*8K&=KaXxhEC_8toiCx9P%Q{Pe zGrJotxNgBoJY?aXrLv6>vxT#I9AbE97p$9tNZDk( z;SdS>APF#{*kc3drNqoDLf1agC2h%kyMj9df54KHpLOqL2B?p^u!p8jht2Z!nyvbs zv$!_|z{W?2wE8z83VI=rK#@zX78saEHm3c=O`c}xlBKF_hS+(s7z2Y-o`v8i&_Z+V zB8%SyMDjN4pSvEY-`}+>5TAZ(Q9kPDE6pXU&qYt5kj9sIU3Zi>k24Tghp{Je?&i=~ zg?8ZQXO;JS#yHdldk-Q0cEmGoMmv1cuzP&MN@UwJCOak>QmT0115T@B6y=HssgXmH z?WYQ;#xE1sHosOwtMfGvnjwezdwkOK8z8%S5ODv&YT%)3XOX45YVjR67|GaKhfDCF zej@a>-=l#yla{Ygc%*Qg;$_aF8Ev$4`X;K+IH%yIwk=v zizdz`i!C4#VAO|Q8EP226GR;8tMEnd#0_dU?LxEVrR*0VY5L5NdUz{~$~-A$|6Rt- zN6(~Dx`9j(DUGURHb1$+;)F+rZH94Tgtl(0TM6(Qpt0+Wf6}tKRF{(n{orU*_E-s! zJH`mTb7fEZ-c*n~Cfa{1cL7IvA8}Jyc=AI@jpJ+F=AoWaqubc?(*l#IYf~%J1#aKp zV?+b4Y`)^=dt%Pcd)8UYqb($p+qgO*-~V!`mSrGB-rM56%?}ut47A1W)mVz9H_ynJ z5{rm(*oxlUo^sS_5|88Jq8M$x(re=KOr5LZ9a?Iu9*rA;<%(`di_+m*vZea;bKkme z@XF|G++>WDz+2cYE6pzEq`!bb!nVMPyCV#hUGkJS<9iI&+Uil6 z9DWSXm;_c=u+NC5iyyhNHPa05i!tS(AO?4pDa^e|X7thER`We&as-(Fw3nt)6~pm4 z)1x+qL?*~D`0o#Psp}@YEuzZ%$FZyfrC<(QHq9!FJDCqT9FzVWkN!q07ndwJO`$9| zKDl!0!oDT41#Msbe*DgxWHPv#CQ<)cSuBsUpy4;^)JU}ZlA*V1@DT4R;>G>VYHWt8(~bSGnCYQ>N_t$(-NJoRzy4I{pp z4J|o*XFqz$Cv)zf0!U?W@wd~-OGO*;LW zu>nk9W??KIiHuyrA8X-{dMnA=4p*FeULC-lxtYQ?m_k1mN89v0bm=-BD<7n8HikjrYJ~K=uaIE3*lKB z(LjcJDq^*<9=ummxcS9a`{SLDaVuZ8W3|ys+;9;=xURi-MCf{_-e^10J?@$E{CgEm zgCSHxfj+$Y<(~m;${Ak*jd9P0Apu+nla%M_$J@8*_sbo!@btN4{{1V{H`;+b`}oJ5 zyYHOX^E7#pJEVnw<>X$WSYQ1bF9$FV;Gq>@V==qK+hLTWs)!*Wm0pj%rR6SQ>@ghx ze3do~{2DIlt#y`vf2{#y0y0fdmSv79BhSG5Z`PeNjt87{?R;ZN_z?Io+P~?O;W!?& zD?Qs-_sMjg|C)C=I=$o z<-@18a{cFO&;EPy+adp1_Hf_GJE{KrsSp{FU(f%4$FG02s?uJJhqVW{08W(uzP!4R z8_x_DyWP>XUJX9?F{zWDr0{*Y>A$b=`lDs7v8AwX@+aYj3IFGB!X`m}*!b^0{r8nc z-TnKP;W5GUn7jO+zxDjzMc^s_pU3;Z{nsxEA@fv$O!((h)%qWphrWa2lL>0w0^Nes zX`+~`mA7?f8m#VrLIp?II!Jy>rCd#*&f&chwFekKxb?q)uHK@#0|6&u)-G`hH=6;-+<=}uxF}=b63)|=U;gX-_0rEOYR;sW^>Uy6N#~@f zBRgSFpTXB8qOgEL0qw_&0|t(_*$c+WkIGc4a&0m=YhGu0Df#|=SQ=F0OVHtwfGYrM z(tQ|9f%S~`(Kl%r1Br}#u!So85xBy@^z{_*u`T6cdIqDDe7eOJHCjP6(9Q{35LqP+ z;Dur6v!Q3_4#*mlna9dAtPX6AT^!W))6g-XyP?VS&lN~eix@6{n20Rs}f zbeRBTwg-o11~3|q@_?lecsh_?BbpZ6FU0IX4QupttJ#g5Be9Dykk+N^#-Q38ADbTffTfp_Nx_Fi3{FHSk zyD~#$5R}{E`f_(UR5Hj4t>x>fy0(B88GocL9t=`?wHfvlkA{;9utun9jk`!E?*G^? z4xz|a;Xj#web>!p;Pl?#Jr~f6iICjY^L`9ILz}R~Yv&P5I7Bn0Dhz5{@1CKAC#(Lr zMNZQV05>GdtV6klwq37W;Uyy}q7ZTi;g1*S&yIRK(U~CCU9A9CC=RXDnNvZJ&8bVl z!7uiP%!vied3Is?Q`>49w4v+zT_g=J=)JlND+Kf);1WLv2<|Bu*(3AJK~u)8Nik6Z z{$=LRo-8C<4>i`F{LTlEYPHEerp-J;?4@L?`-CU20sI63WrzGPx+Wr7H6HuaFa~n0;axErcr% z<*f|j0gxAu#T)j;s;LT0QOF&@H@W{PA#iT6Rj*hcyd0Qr5o?oF7W4-gzW=z+%8Ot^!= zT0nz{<`B#}v99vyeNF>rH^p>C`SpCz&9;u&!uL?g!=mN=;G5Nzf^>gRcj48;6yop! zR#BI^R^(=1N|YF&OM%6zD-C_5)9JvgN2wq_KcBb?y&3P{dlqhY*`B#KjB>%KscMfc zc+g{|_Cue~M$WImMk|oA1iS-~59*!wnnd&xdT=6f$U&;XQN8}CSDx~nUK>M)7sny! zZVzNbAP@%g00q}Fj?(ifbfAv5jMh(&o7X2 z4DD{>NfnBtw*2HNP%e|Fe(aV4ZFX}w&!{RcvQ;^b(g3u?2|k~|73_M0 zHwZ>b$;mRMC^!U>@*wGT7(o-~5r94gtO578cvOZ2Y`>5nb+ut|>&38}Eteq4&C<05 z5bpzMyYJUdzog+F2Ie6ab9^@L%tq$#Bx={JqHb|JutNam61P?+F6o25Sa2U1hrW<= z3V@xUd6Eb~Y1YP(>szJC1GhM34WgVk*ec|TbF;o%P6f}B!%)_-PM3zU9H8OuKiJoP zzTAEk|vsS{1@P_`mtj@tm(U~BS;`M74jyLPA`X_6n9M~Z#QehwM z#xxWi0GxyY=0;$oF>K*YO3nvnh7t1JSm7<7SH2r@7F$#i8d)Th>uO)1bnFu^R{(Ot!a(k%;es_0zknDL4tjv+^8g<6dQ0)zm2?ExCR5xw-&M0i&6re?q4A-l?`}X@c5?f8= z?8#1kYyMX~x??9FpNltC6%}-6+Idd_$alRD;3SyvTwTOHE7SWXpiJ!1bo*rx(; zR}?uk4Q9(p3(2&odT4!;-5Kql2RKbcf;pK7wrr#)Iof_YJab(LG!roR?OO;n;)4NF z3PO5`q2_>OBeXRL6f?Q`vgdDow+CkVm}2%g$UgeTFy8^CC8~Uz_UaaFk?D-LU1dNT zS#6&BdDqzUot;-xsLt&^d+qI}h)f`QcEVBS`1T5sM9fS>s7sd{zWWn6*W1>Nz1A*M z@i$vGu+FA>BV!Jrr_e1`961$9r(cwX*<4a)$5;gKjXFww;Io~89~cMG0L0x2$^I0) z8~^|w`v@t=lmmcs5NmY=r?fC|rg@Kmrx}&Ipwq$mq$l_8PTGr$Dn2^&yU-9%gFEbO4N(pSs-J*nMcXxloyIpg9}hQEqCwj>zsT}aOHSs!{4e-i~^MJATF@z zV@o?%cJIT)diIzQJfXSuGlu(E7YK2=oqbKDfR_hZ%8c+#e$8glYd}jAB0+SbRD$?t zj8*dR-?u26t{*)T(xBUYVRm^Cl(*g8FQ?zRu{%(U{dkiKdsVRG5U=j-*e|7Z;oTg_ zJ~cU@n9=YU55{Hq-8JGpirZqOx7nx4S8yJ~aPD&|Z&C?3qo-~z!S#FpOb?tv+gwg3 ztNr6&J#dz62m1o+=SiKW3$_J6E=`4tOng4(yI*sZ{WijkpdeO?9s9koBvvEdqmwid zd#TMjth~L(g}^2W_WCs3$YgIr0Oe1*V<3Jeha;1_r|A|!0eOXnqoG1ir=3&`gIX_t zk^Mcce=74Fab%;#Dq8q31I$P)ZZ34yGaO~$a|c3(xwqk)7K7V&ld0@dPS-bvXFz{; z8+|B3Nkf`Hszb2~09younR%J8_49lUn*lNnGjvRQNp|e5MCRy(_h1>3%&ne0wv20E zI}X+-)ckxw#a6GVix}RVO~0;5d8*#^67`Ej2VKv^J|p-@lEQ_3hTTp^&fb3&3V5e? z^-_5|F+oLu#Cin1CTy7r6Rn4X@th_jLs8;op}QgTt3^Evh$*wa^t+-4uTSf8^CL~{ zGv1>DFpRQ;<#wn*=2s(v%*s3;MC3z@dHQDBffO>~aj^Eu5YUr{)vI%6qFX@+aX@ z@b_5TDDiL9<9jlP+r9I>s5WE&(a=sNR_gT8duamaJr3%y;48MPywY6nqWZ(c?!R#_ zA2&P4Ibd4U!X)(kR=f%N+eIEM{taankZ|RYvd0v2__!lSYMxBRH6GQY$QwL%sX^IY z-Av)P&lOkhNL{VRWZw@7*cf3Z?p}fP*4_O()Z0;k342F=Lg>dw3epwMI7M6->~ay# zJpYPxMwb(IoA=gpEiaQ?Fwqm&s7bE-_}Y&Y<4qPt=5~^5o}}(}5{bnnp`0JOyqL*g zW)1WbrlHpBq`^_05UtO=8;7jo^8c*jx(0d^nrWIn$mgx4QXQI3A&MaBnRXEDrL-$b z4KN?Zq8`UI)u4K%d^W-h;@bg}DSvG_9FZcEOe2lz`|>RI^IZNTyVN8zwu77&1(b(d zI6`pmv*i?(M4(rCcnaCfn)3}d6N40=6Hl`e$neOX?r@^&TVTG9T3ECDc+qLD{Ziqy za?@1=w_TLUECDJ?NP}9VRiD9=b4_3%L$Xo$(J-qE7Ikt^z&33_oilKblh19vlO&Ef zu<9n+LzEf|w{Lp_GxTn*o^(6Rup0xkC$4V;&GOy^!0TmospHs$g#Fk3N8o|M{dq^x zK6wGYW+6?L$ezerx?oDYAN)!ol721hO-88$?PuCREVzy zvBc)BPCNC!Lf zq^>6C--k>S!lYYsp-nFnyGMnJ3#@Ms50xghiw%3}Bph$q)E7>nSz^&thG0>WvD+F!aF=6u63LXsVSJkgN(-;($~KlJUGS+O!y@n&{VlUQgm?ZB@^+0(!{FjO2A>*hUt!%bKi_KE z8tlr;^4>}eRrRUDYW(mH@CkO;c)X4tff1Pd{Jgh{U)cI1D`|Rcc>8!pE$_5r54MuT}e#0O=L?9cOsbg(=W0js>&E&U+4vY z^)m7Y$!@CV5uRLWF1^miW18@nLUHc}URGQhE@Hpjep2y_@gsk})TG$8`LB5wUe8k~ zGG~2KuCQn$TWQO>eBgEQAqA5cTj1EK?U&4~wZvnv3~#<*PZKG*n}A{9?Mi8*sd~3L zt{HY-DzC7XaI2aDvam3SH231Z_Ljbhd8dlI?{>Dc2MKB5Kp-pm>_mM|DH@ka? zr}?L`eI}grNXY=n*)YK)NxY^UikmPqP3SsF>(N|``sks%VrI62otUAr15iJtkbS zD)7Ct;W85Z_-(I>wsn%msGmKr5UbX~%Di0Q?aDWd&q!-(#oA>wBf4 z-4*?S6h_`V7^Ug@@ge1!tJqaBmrOh?eX=3Jc8eHeL!Gs;;8sKvt6sTpjb0P(1fowK zB}Z4lMii@^48Y4*(`$5_voLONst%^myVWo8e-kUu$C-7@nw?f%wV4}8_wT6qWytKN z!HaWx9OrkVEVJgQC%UlE(T=uZlA&U^u{l68x>5F`nExnd)Mi}=ikv#`CdlVUvFMT~ z=j-*kYtQ>i&h`mC7a9-Vj`XApb0GLZxl_5IRqp@af+Hs>QP5vuPlmf`{UnhqB#qsmau2R9SJit@pEVbb%Y_OQ^8Y`LIMStExJ*+@lAhw`?uC9T z)IGya)XUw)T{B+zEE2sz37zfNo5j77FDk(HIZY7pScM(@=qhRD@O43-TjuQYJQ`-W zWW5Po6ep>AW5r^F@^u*0u&c9~fSreT4qFY&d-mr=xr_U1* z`VvI0_ncpWft4nmD}R)hvvo`7`o-}us2{*>T^ey0D;dp1Y@-&?zSH$$zN&f${;64Y z0DREyRE8Q+a;#t45f44rvA3m8b8~s)e*1R&u$60x{cs;%f?e5kgaa4;2UOZOD9~>1 zVY9F=@r^oy-9i-wl{I}wj^SEs>AQc5gW`%`V1$n)0pHg>)_WrYgUH@%xdLgu5#Hj&J zGPctv#h^)I8a1siPaYHGBQ$87dFw(LVd%dh><~U_6hr&8r?#4E6msL=NL#?iFBmqY8oy_a`B8^cRhYvmx63ILlS}881>)|P{i9eT zvc!_#+0;fWV%j#tBA{?(F|yu(q%bpNi%7;G;}hJKzJ-G5$_8IM=LHy{ex@FR<2w#~ z{DI3ISFDqrk@4)U8HQI6aK`Y6i(A&b`OFq6Jci4=GS@9)W^?W(H{Dlsh#-kryukF{ zjlC&p4RJzT>knzZun+zp-BzCO81A|^-~$#`eoI0HPumW(Xc;*%))9z#4^7Czd-*Gz zW5HYqOaF7puE9E$VOd59H}o&Vuc zVh9*$7tq)beAfUjSwiL!U*CejP#&H@OcQ*+OMUeYeG|SMUa7Y%*rpU!*EJB88L`b`l@y9+A)AS(T|}R-iWELwpQC7X z2F#Lq;rEA%Pnm#@xUvgeO)ymoExGAdoAeB3gNzlbbz=?Ia2YeRyJz%X7(<3C@#p^! z_TDq7s;ui4R)T^^5+qBOBT5EIMrtD0 zf-O80lUsfK25Oh>BX|_feeq}eaYv>lvGJ{SMJ)ebcRu`3TH?34%r_&nav`&Ua>AbxS z{E5)d;&y|^6FG%R&+%nws3{*yK0Wdcn4jf87|wTl6@&5AGELrtfUR!*4@hlRJYs=<9y--mH9z z*V1^|+-a^Np4ZfCf`wp-O$mwL{pB zl=4vg?-UQ3Yi5?^G=n18fQQiWko}teXxsUHS3GoW8>^fh5O$ZwOpKa`mqS&a@5uMK2Cv!B4ko-QyUS`NiM=L0FkuvX?Vd?b zO!Wg>0L93Xlzjf$a=~0jO>^129LFdEyEDkb(C`P3tobTo~)}2ZzR0~#&|EF zO}TE>pY3qje_eRi9i_j*`W7=56mh5eN1JIz;f)(IKjJRt%6XOO>Y(u$F+zPq!swF7 zYi<4U*vgqmG(qU9yP{ON)+BL*cJ0*Q7oNtuD;S1ADe=`$OtOu(%No7h_0qH-%4srB zr>-^F*WG6rrDfOe7reyVQn0{|G*T}+To=Opbzi!i4P zGw0Li=po|_!0m^ZwM4T(o7gSw5^X4VuiRG*!!@*7Z3cQFyBGw&hP)H7a4 zc^=X2jGt9l|KMUTZe1sP=WILuqhmaR02}w8L+{WXta5nKOkqOb5sJoY)7dLlTt&dHhMREcD^mV8^kg$?k! z+tU(POYSKecciKcW|)8I%)2c*T5J~)^}Tr|a3aFCcfF-VpM2t2r@#I$5mX8~Ba6*@ z-S039VbDs`?YT1_CucIpo%Cy*E~>iyZ8%YS;CONkI_F(i>X~}!p%*nNmqHW~ z$RTey7}AYdBz1NS>LzTMD%@j4KBL zj(*fLE#(g_th_^n3m|gXjs1M+gYufa;aPE|Vn_O#buMG#THMoWJ!PnCTUG%QJg0c! zERBN5#M?WvcKxTxq*4HrfDyX&fsE`g(HR0i1u$HnP_bWdR(^EtF?}E$p}DS4>SUzk zp2Fj6XgV#VKbr-3Gvfamo6-ZPw0exSAAa#78^Qwn&a=ORQQDz>9>F>*=pJ@YhhC#Y zzkZ}Mk}FtTtG%sX{3dPxO9l_r@R1)XG@Jw_w;6^mzsjFT7pP!p(IE(R@s${vMkYVVMzIMDUjD9=#z3QQu55OlS!$kD; zAZH{=9}?{hwQU|}(9TpM-Kw867~^dpaNu?Fg`MfetkaR~v5j<<4Z;$bvRkKo;COBj z$g|hj_MpkKFKEP*nv+_VlpcA`Y$!F8>F^e9yn&mG0}WKZl+)KB47)YnfRvDnoaqz_gU&!eqr@yn3B8<+Us@sfb10 z=(?Emo05<&R1q7fo_O78EHp|i5Y2B;_KEfMS{eH2(c*pSQ{Q$cq_12ziw!j!zh86k zc0Ji<#(R5i9=i`yippU487a|_FSvw-%J198aS6e>6~85J6wYooPIjGyfJ8eVScTzU zLP@l9^X$*LdEViSAHt^NI&cz<%+r4Jth&E-5!K1N)P0aFpWgg|)_hb#W48%RYk*KLRIHRi33suqWP-nuC(?+-+>p zR_5p8bL7{9Leliae~4U|@g|(%Ue)#LSbol4?*meXJet<~O$2!8m2uhz7pEY-6Xyo% zS)umjm+$hgTnlP>dg8stphwJdVl^l%5{m;Sv|)Q3ps}Q-1l*eGhc4-7Vs1Q3;@@1= z#yR7adURp_)lVG(^HQeZ^4Ett4Q-M(9n9;>y_xUt0Ce0B6O#7B8=c*gUqS>;erjGP zQEn>h@JtsY`JhOjywP7o_jSQ?puS&Dc3q;Z4u=LoVy@xj7vkM-!MoyNj>pGH*-FM2 z&p5;AHu0gbDZA!BQo-cHA-TB2l-1Aur(HxZM3r_g9SgxP(;~Csx2hu)9Y)IvtKHB) zn1WjP$uG{6b2>4vawu#cQ|q0k3%FZ&gDF&oBHVLk-|C~pJ#Iq+;XCR6k{3^061sos z@juqymBGE?93$g4x<(!zS68IF@FQ{S(&a_Dmr(p9qId4}n+zt>O;>&JSgH3R7(2od zEF%!%NhZ4;=%?}FKF1`&a`d(ZxG*45pex){G!k(!g&K^X>c$or%x8|I91Es8Pi?M4 zVnt;}O?FB=a83yIiMeekUK@+%P$N3-r|GF%vx6a`3b~rpHF0ZK!bjq2dFT(51 z#;Me~+oavU#moKrHq)HE&`=e5mHx?32yPZKj0U-gvt;KakR&2dkf zGXi#6tJ>(tA1S+z2Oc>n!_|+!#Dvn5AmN$vYANKMy3!EpT-tEJ*^hSB8cOUo(e zT(I)kXvZxJc0ykVBVx*fT}GX=BokJj419d7_A5ABpycn3?>%M|9mM+{eO(ClB-3hQ zyn8L{;7`T4NSzw?@K^zEl6~=!vd_G#5YSRSQ+*h6;w?ffWDg|;{H;%|zr&dtOCzx< zRxomXawT5yPU-+LH^A$%L?JAZxTu^D*<8V{K;f0X>)9nYwRyTr>=Sk>SS6f@JIiQP z(c!}S2Qu$N2*;6_Hjt)K(dxbb%<#g0T{YT1^TGvXF|PH>1E9Zc@?VID1fw%aG&n|e zq0|>@-W8$60I&1X)-$ae$71Hbn385m4N(uVzm}}>l}mr56G4L_U+ugjvVu%Du*(%@ z@91X*HLdzfp0Ouv`6Sm`ZTcsvQpTWdbJI84)pI67BG1J>rvZxng0yVMnY)hh_Il~H z-<$%688zv(9Sk0=1Slu}`uc^I{9&9by=oSbBwZyrt>i@J`$6j%djU(Ppu_iHx^Tdf zFfn`mg5s1badZxC^(ZaZj`LlWqdcqR&m(kaR105!SrsStsC-wSeFc~j?A9XrOouXl zWNor5{dKsAYV{OJ;Yo3WM{)dYfeFnGPAli`!S5ZEhA#1 z>9cT!*5T$`;6)xq{a~5{4N)zc5gM%dhpo83SKX&A+}Y9Xt}08@v{F~k&wNTYvzSZ` zgjaSU3EfzgQSQf)u8U9z9|4fPFd>e8_63_Vs=7i|7TYODa$|)$b5e2LQf=y@q-~A7%3$CHd6fi^Zqxl7}%w`2kAQdsuGXe5@5Vv0rtkas(^8~_2ylpk= z)~jA}9{|-qiN7CQbDb?caF^VghWEO{5yIw15-jB$BTdARX@dWb_?_}`Y-L#5lE;Hl>^7deLE!Ny?{CVbNV?vm*GpI?-)>`I zDO8F8c;l3N412@j%eM#`<`ir+@)oLVCfDc=ilM_FZL>l z8R&k1M{ozG4!EfQ+eaJ(8VGoG#bd6)T}QaT|JNy<$b`%~h zQEXK#jO%qotmS#}{9r!3>tlHpdCNe;zit4nKKlRWWmU+-@A$OMLnQ55TY<0nH**{Ln$dAk)2X}@;$?tdEY8)!|9C`F{p>IvB#=5jM%aX7A&nJ8Wj4dup zCdXo=t$_siuXkbR$CEds8&0{dUe}X^c6X7rpPBCTMe}O;#WtkZjtB`z{<-p1U+TVl z?wSi`dkBU9UsnJyOWg6dzyb02N35$)B# z==Uf8_b-QJKW4i4%26DE+cDt1`YfoBXcqkA&qK1IIBa~QX$14(|MRQ#R5}Mzz5Gpn zM?OqQHnO?@^(QRAsO!Ro(F+Rv+b0jnuKLlh|LC13uv3e*VP*bv%>%3c*l!3(5|#;^ z80PK^dKRgOmlVH|Li`_VEF@$)JjSQe7 z{;gg3^LeYZ0c5b$e@=GtAz`s{`M=&p?kj6erxmh)hsM9QENC5%dUD}kzxF@&Tvs=9shhX6_M^%siAu+|FP^VA(P(5{o@4p@ z2`-E8d8(z|aLV0eySEkFxV-W2zwkeQ#Q$dt1o`Xh&o&ify-+ilGa#&YZ7)Ig?(~|% ze{ZA28mAwgGS4S5r9YB)mY>7UKf}>50pyFnBbtzX-IA*ewxW8XV**zHO2z;4(d{3P z_3tnF&%^8gP3r^o8T#>9z$8Vx1yDk-&qZ8X(K%{?(!@-?kvfJP#c#!P-$cx;_)Z1>C|nh|Boz zSs52^3Ni&Ahm#0574srJIQAql!~d^PYv{d&U-^bHjv(75|!pHA`t-Mx$IaU zC?4X<4@(Y#_W$lKxT+qQ1G1de*9AU>X}$SnR4N)}`GIHT|NEPPkAZ7p3L`K}&H~Rr z!QK-j6B`mA1EbXh$^$ZO2MaP>dya@&c7ee2D`d-3CiMY0pYK5EbOn--B#oOBCRtLDPmlk7%ibMig?F?2ZPEUK)z)WfI*nIgFoo%4bSE?Se?}`ul`tu zJ43m4Vhnm5;-tsOnTlsD5i07Rx>;w=X$-h5mrPWFKLj$rV%-k$ssP$7IG=aKe0y}2 zsXhU!tU1RZGOpYdmlHWyP*Kd!VxaCrxbCW=U<8NradXWDhC7$B-~1rY0zLCj zps5ZnGQ!drgB!GL>NfoY>3(1N1=v(Y1CW`$z@|Y&^4t`AM3U(6BEKiphG2}w;Ry4> ztU&1q^!qM&RDGEhB-m3Lj)hil zxCq*s=3gyNYXHfHGc&Rp(0GtEFhy1f0um&&q+%+tMe?_!-!Tdkp=JX;%R{u*UcJkhJK?aHh6=+?>Simzy z?|+4+KtrYZO4VjpJMSi=BH;y?gob_#br-Ba)x=ckVAxwVS2|Qk6gHs$Z|?L7Fp^@s zp_qLG*UpRjrTC7A$FR~s!5!SZLT?BSP+8~JJt(sGzy;d`HZCYPEu!zTf4!aty^ayq zgUAK?;t!yi)IB~4Gvlu1RRI$P$n;s#pm9+Jvuys!8sO`TjvRu$z>AANqiokQ%^*GO z=Pw6Nhx^x0e#w+uXYraqGKaOU29+*Y?kEmf#HY2yps+yLQ-|6woR(JvL_Z_-ivj4AaDTT|Hdp8q~@m5i=^-0l+vmC0BTjQTmMWs zk|n7k>t;Y}EE+(i55LsL)>WR>frJK=b3OIaP}=9wMc^pcfR-dLcpa>8Hc?UNIjlzj zl`pVABro{x?YA|{THV_UAUi~_wm)TtIPFV6kAWQl7GJ7i=1RALP=e$GBMRBuh_C>T zG4b}aJ44`Q^{pEotG@rh9bcR;Ow*EWPhQ%GrF&_2*6Hhf?ZQyXYSpm}m1}eVP$WXw%OGN0ZH%lDGo*i=qBUd<+081_H4MyfCI7xIG4o0EdZ=BxdL$E(3N+k83m4+t?LxL#+x8$=#dA7wuM>$^%~Q4gO@-!J6) z3FQ`yXgYYV&{&9syLn7mT8=jyA^Wx{A5bavE7+mFc(MDapBON122bJfD!%i=I8pL7 zzhl>T3$?G3efJG>aQ-m{at`P*6uXwP{9NosHBNp6;pg!El+OmAKgjPgN;;*VnMPW% zwy2b#prv^_y;fIOGBHD!uElj~{{t^TQgpU)@()Z}dw|$V{99Lcydw-NZ|lQZ zsg#a+Br|G)5G}ua{uyZV_CfQx3a0w20TH8gtRQi@%@M7?!Rnpz#7<)eKp7!AQr|6P5=C62!~mVM7iX=&`SL9LaHOYbOf)Amrz4!AgA&~rm_ zDgZQHjovJ9atGW$5ahfq?C5`-;#1}oGEQ+d)s?%XA!a1B9h@vFBCssnb6AqfX`=h# zz-(2n7xCxDG@LUn`DZbD<|bUX99 ze|Z5~GnB}w_(Vc1z}ScsJs>gO7!G{D_(^s`Z9b(WT7`6-b31O?oVT%@d)0vQy-C4| zJ4r)VqtKU$as`fp*-`a*XPR$>Q8#GronHompX)~g^7A=BHi7VAzhvi1oz#a&Sj$t* z7~&Qo&MS3|Ir9d9Ewu~G6^=iGQhnyxVx43+y$i1{IImuRz1GqiQlYp@2|Rz_KH~RFCHr4`S1T`~>*fN&Ed}&o>4nbyAXkPZP3Fe`24JGYI)QzqT^^&H% zr;=5S)#Lax9=oEZ^|Z7xG~J8+Z3i3qpn{sbA9VMmz( zLgcS-Y}^O?mvf8`ESt*D!4l=XJ1oaco0h{rZX2H7{B@S#HNz&g4@M^D_=zYwU>y{h z_n;Oc=VE9qlg|}i`B)~#{8Cb1DY7=@B2)JSNE@Pz!Pr&Xl(ro>-`Dabb*~A6=S%+U zyR%E+L{)n(g6*t_h=ozZMgIlB%%7gR3<>Ruo)y5nG6T6aA&Dc!)@DC2-Z#cu#GhLl zvUr^C4cK)m;tmgyXmM#11Q?15}o5dUf-f56;(huOA z)Y@g6=*Nfb@(SyhGk0yJSNBN1JhNdeL4JN<%@_pJ#N;uV?>L;qygdBH^!(CIM!)5q zD_bwOD?BrD2#;ym!=HMJ+2iVT|JC<5MLa4)JfB1u+`h!S>eHSpW<7ie$FUb2P9tYd z1CBWB=sw!L>Y(f+P&P>*Vw^z8AMv)?#Wfcw!l}EI!3Am?@9b8}PfOVE=IZl}kA{kN zZsc=eQevip);0vOZ3ysiAOLHca}EPdkZl++gNzaRF@%h#xnrBK0w?-(Y1D*a=?1HV zS#6&1+KxnYFZcxS1P7mWDkPAd!XMp)jQox4`FZ}U{or${@9i(N3`3|(RJIWPVncu_ zQ8dvrD5NUdTOm^8SwGWk(M(r9;oEK!woC7Vv<*g*hYFR6HPCsF5g1HMZCx2{{ZU9| zd&*|>H0Ql{W#GU>HMCB>^X>nT8!>w!WIdBkA8hJmdd%glNs{fz^KJ9X zn`-@Az}xf9TDZ^!WX*Dl>W(X{?$MluvaMK_k?~z)f8LE1sB$REXe>>P*JoeK70;FB}D4rjo& zb~nM$V!u0X1i~|t%8g(u&qz3=TojdfM8@y-K&dzuYK^qsJ?OCRKMNpftjcA@Z@A&j zOC|9y`kTtE^-IeAB;U_)d6hldbiJtidQz;%thdo%tW~JBxV`rt)Qg>02zmDrpR*qg zXU1i0WB(Daqg_z`n)S{;J4|;UDQsU2%yG(vgdK%DwErg4qiFnvs&pIGNF=V=+0bvO}QIe9d<#P1P`z&)oc^Hg^jgSwcMxsiq3E`nB$Z_zRs|zW|x; zTtX8qlCV=G%x8Lky+%!0%g!jKr++!Q11YFVdPYN!(VS}~rQy+egrv3mBjt903k>Q^ zZ<~y^vQB@BA~-W6u2c>Lem@D*3?t#Uhv$U`B~Sj*v^Z&;KPHVd)0B-HDVRu=mC$U$ zrU7c+FnYQ9RONGWqQQRRR>;&omb_|%3T{<=STSr}dgds0n#jJv40Lho>T{U?0>Uua zqrAK?LcA_N`+{33y_9=;umhCfPk(K#IUZG-?28BTTB%OMq4}@p$qph%-__8X5|DZK zkosHK6K_4gG93!}aLN+^_p6;OLTqcHT#YOPkrde@lEAUtGMcGvM9G_YoVY>%XY3&i zAftNhGxx|>@9`jv?D`T|#bx%BB%@xiBWGRxrvvz{@dPpfD8*jTRc*evOxvPzoGsM*%jK>H;S74?}L&>&v zMfL~5K4{H{gs|6ah>-~eoC~9O9{l)&*=I3xiqBDov{Fc`RxZiL6v&p+)sR^=x_B|a zET?%jpZ2Y#oLvgQr&^d>BUrgo1SXdwD@+OYdLe!7_N8MbFhTOr-EVu$eZWxIF*T9- z=~bV+iB?%tet4-IENUX#Y3=o3g4dacFhgFvwN6$exXc`4 z-@+&H$ndfPz!Ctlq$OAYD&(%2;xgyUefmD)j2r4O>dGUzwlI2kj`Rs=JU1#5RZdl? zR47Y%F-W;^7fym-i+`Atv_o|;U{hrR&r?PhA*>Y*FN7=IJ20I}6YmXLBFS^3XJ5f6 zg#n_&o_pPXn2z9Aq6A$#uk#?z&WPnA^9y#D>G*vo+h`DA^L>Y%ox#9M_lyW#Sf>YL zypLv@e0D}?y(7j|01K5z7}&zVBo(M?Uvk-6O!ZwWg3t~XG(t&*AHKs4#xba|>CCb} z{6XmYNe*@L{`C~~@Emu9z*r%NLr;yAxShC@eTuNrVW1IO05%t7EarOtv|=^;>2l`h zqHG}WWrx&jzbT>%MVeLY!^>%g$i8#?!dWd=o84xjI0;U6*RdoEm??K9D_P;Uuf+=< zz<`lkw}Kf>u&dDpAf}w9j2~%uRdNH+00Dus@x#qq zM{kz(UK}up{l4?S23s#dU>k_w!bqBB7AhJo8K!=|U~VAfP3R@Wh{WG3oHB&a?p!3f z;FQ}acE`H3^yR4#Dy{z3Cgr{0F;Y*Gt2qKS0Fg=C+-^R8s3gh+0q$4%y6hK}^JfR#Jh}Q>W zExT)qkeSyv-mLX`5O!85p7;77PBOY(pt56{U!Uh_bjj6i{8tlfkx?WhJgF{iynZRh zZ=l|VlJ05v=FNt5v1|aF$ESVrNpAB!Cr3Bp5FIg@O%EYf`X@iyDP`Wae#DSO*g$jj;jvBn> zOGEESFa>1yuUfdqk}!hU&_;m)fApj99=-t^IyqF&OJm0mV<&TpP40mxCE}DFB#fBU zs0$|8wzgDiB}1ykeBF0VJXJfv&Ou|XbO$^mQtrz;t-Qx_7{0j@XrFlHI8k%ZbBFF3 zFoK;W!!FE|TfDnFAsP0@Cx`|7lf;mEdlLuNYu8%oIM{;`gPF~v9uAHaDyx{dT>c8g z3uNK@<#U;?BTs85T8(Jjz@;&Fu-umt?0Bea)dw=1Zr(@|y`Bmdf2nTru5Ci|?okz( zME@C#U18t`0D=p?g8eX-JX&TWB?&zwL$^>mu)HIGKf2=!UJPb0f^1IjEj7A)wPZy4 z{wD=HBV9nK%fIf~&Vp@q*Z@y*U!E>9S5CY@13Hs~jnFuWM(?y<#TF$9W+($C{(1{f z9u1Ms_n&~p>D+5@6n!;QV^w`_Dxbki{n|79>^wT>>-Cn?BG)x)ARNtox0;w&kM=zj zaRwP2`}i+LyD33a+T@Swk_`D|CsMM&c?(JnB0zq*zX8pMTE)6If&g!x^)$q9Z+WF~ z?AWy)?$6%tc8S^eVmR)}R716+lM+i;%6x4M25~DguWqGz`pWjGxke>CGa*SV_)APapf*`@~Y;4ZUk!O!3yTxR1 z$AdK61Lb1M)IrQz_MHVd{EF!lp{B*Watvx=IJAbFKA$jdj_n2g1=nHwNf{#5LQ+S` zC)K&=hZiSdXO`<5)H$Q{cb-Fg+wTgW^$18se!3qnQ6Dti(zU^gAeKZr(=qo!1z=W+ z=cn}n8Ew48P|Pl?r8>V3A#^VOTKuyZpN$?Iu)9&ythA;upc4A@Z*IMeX{2fJ7AJTG zZdu~Sg6XPsL!%J346lTG zs>KeWV}k$pO6Z^qw6AF?Z1B7 z?|bf4+#9b?6GBBrxr1}9xcZ-s@+kFZ=F7>N)OcJ5RGKx`Pb%|H)@w6sE@DwNcQ?}s zqGfU&(HV@prLIcJ3$epMGLN_L%-Yuoa*&Zej%Pwd5O4Atwp16g>!6|54O#cy%~(mXmBO_2-i+Pjkp=NLJ@=}ZX0z;{FYb^hLkF*?Nh+6cELR>^FQ$eew zq2DEY_FL~!`@)VH9*2XdTwg1eyC+f9Kv5vG3KWABoiUm=sB8XmLpf zRrf3hF*}5KuC*3EtwY8J!oi~NP~PYgQ-hwWSn*pswGA$130cNk+IJ07&I(oL0gFQJlH#0`k2QI!u3X1KD<}8!W3$x#xdMcI%4-CS(QY6czjK1Oa_eq#4Kk0)E=E2yrNm- z?YR|Jp65S{iF?!8xHMY+&Rs^ceU#(PALdosMBi72dTri8`a(;5r5a}cF25+1_&L9X zDak}o$T7O*<3DSK>!V}A^K#gZrs5<}Jxu8p@wBM7_=YFF(7NorVLau6^16Y{*NpLa zB{}ZBsUEIACS6TBJQ95n0I}FuUmTs-`A(KdQk7&bLp4)#EIHjiHE(YNA<;c zT5OTS8CmbvisK;XS-utjzE4LbrKo7(hqE;iz7MfsOdyqDEIps~aTcZpHFe>fZZFgQ zd>dgsSkJ#lZkHzI%9FrNxAgPL-0-L7#N382xa!WGM6*Z^R59mPUf6TfEq#H(0`!o` z$%AhZ1_mBk;hvBDtPT6$-$OvV#6B1mn=9bG{Pt%WZmbR(wWl$5o6oGOr=B1kcn)_D z+px1<5?}IvyQPN3qOiXJPUCYUs|_!BC~ExSh)>`4-S?<|sc(QC)6Ac$t6WGYQdCOu zE(MmK>KM|fSkUsxB^)808^UxjF$4$gP`%&O+%9Eohb}!G+qX@&uWVk>9U$4-`3gn} zWD7?ZGK@w=dcXEIvu1B~W9yGPg+jykImx_5=QCtN!7~>IqGt`#uoN9Xm$n6PEP*i^ zRpZSpWpb~u8*!c>PL=@^Dph)^;vI~*kmGQ%bxQh!@OA3b2GG;pzJL^HeI$Htc<@pK z1Q25t$V4rFs-irOK?U|%r%LFP&_NCA^QCYvpmBfAxJ%~q-7aN|D5Jx?H;@-z23v2s zZ_FvQntW)=5#u8SR|yQ3IQKGj?C2P0xO`K|nFymL+?lAx!0F^v=Fr9?fqsiQH>uU15FJ9zUeVIBJ;&g}E}R;s`a_$te(FBi zNHiG^e?L5nXMy_J?c_*N;`np2mBzW}_MTm|EjW{8rnP&Xq%sa{(1yNrDzaQQ@Q5;X zYZO}6uP=-v=3d9+;&XRxTs*kD|MV(*9Snx$Hg@3vAz{Bq900In$x16Cg<% zPW5s*HA^necPK22cSS>`fv)9Y{p-Qow}s-^=H!W2YuK7}PCo2-k-nMm8ioNYpX6t* zJASp1!fOVze%6!uq;>$Y34d`+EW6RgkgzXzs_yw!m>G`g4U@kTrz|kNlnyN#MNBdG zaOXYC({$YE#>h`>pXRB{cf+cUZFSlQS9Ai*>{Cp1=~QJ4y$Z5#v>mN)>KR(8@#gDT z()*mHVLV2t`65s({8MXNI0GDm)tV@sLF++}?RF#Iv$28*Ch@IVvU$^vq7_5qM*t>XQWUDlD_OaP&5GAc)ylJF z4CvM4C&xmmV&$+!)bd!p3b&V!14A^pcI{*nh)HgPFiZEEtwRjkL*#7PWH2cGsihv;QN%j>JkVsS! zOOC?3?QGorp>%mHvWw-@Y*B_g>ag-q_RSIupQSl_ZB{9TuYU_I z!vil961p=pnbSrn5x?>-8n4t6Og`2cRHilLbD6wpW!Uw*H!RJ$&g?GLL?IIh2SvuCn=vsbf?t)>3A7XMg|_Jfla(&8t0cwPZi{B9_P z>jY!1%4K*W*2~_5mDn}7@4YzW8s{e*i7=@fikaFOwGMU);Ch5oi+}v*A4UnmD?UdK z4Szg04Awdi%pWI|qvKi&FDpV2&P4rw;iftLCreK@_(!^P4_@GIuU(>$IP@btUR6~E zZk3=Le64cs-~OQSL-6~cwR0mAxl>jX$&{(e=1+lq2Y~QgBbm`zgf_qV_iBQ<*2uHt z`2AkT;OoP`1mu1%Hu(JT+tUR9|KT z*o9(8(=a~q=-=nqyU|5hp4hcNpYEavo;b#O{TBEcmr6 zFg21HmP_modA-RkdVUsvfB(m4uexVe7-%-ZOjYOlYv@b&zn^;*PV-30Y4TxXTiv7M zA3Gn%{({+-R-WE7FO;$;&wcgzr71&q$HYS-(9Pg1fD1na+u3&h-ZH}NI5-@Oz<7sU z-XBQgW##3K2X~+!bz$QA_V6xLZQu590}=9tfJ=wj{;wZaQ*eWzBb?>|veehNUix2x z6WDjb>rSy1HH868C%A!={?R3I;P_B*4*C*)Pu&(j1Ff;u(sA_nZe3g6Aap+LB%5NcJ39K6&r&Wkn}WHz;o=C>5Ts;VC8@* z)fI_3pNUDaBvDHY)Tuq}W!#zS=Wo3b0wOCk>um||pOU9wyUZtZ;?!ve3j-RL`HoPv zIq+ZPo&%nseYsj>2v+U(yuvw;r_ zRegeY;aSxfZlni#u_2t^5qJ&oXj?pBVje(29Qxp@l3CFr`~=GOti@AjuR)o5xss78 zmcu|U6+9hkHmk$Ybx~k4uv)(aSl9tj_vi%-w!bf;@g3j*TVw^Y;>T{{SNU`b$=0!1WO6V zfkedY?(9^Lm`>FCvfWiAb#6m?_vc)v>H{I5@;7#+%Ao5fu$9d!9|C>Iq`;Y5Ce!|< zq}~iP=5HDb0DTq~?&BaVI!mez$FlE|4a)2bE`{K(l#(qs)|;aiJRb7){L@u*egJ6OLU^2FW#Hl3`O^y=ZKHs71J$VGC)aoM zQ4V@N24OM1K8Isv2uV097aSVayw?stExeNIRz(@RO*=6&HTd{|1d7V>Hx}fud!49=j(QgpTM#JGT!A;)DbQpdI&s z*aJfo|b0Mr?~qh6k+jXvv>M~7+j9s2VaDNeMpFffFi zS83AlvtV<@TAP;5lrv-Cw_0rQKSZn~yIzf)`kn5%iYe!PX3z`rfO0 zie4S7q?dvzbDj|ARqHN_!rCcQvbq{&RN=-8d2$;LCi0n7l_RS7uLAx12-0uj&Uy5A z>?6eA+KfPtg-PLyLGtxNp#8YoV-HlH;`mN1VH=Jr7dBaMXQw^P8;BJ7bGZe4`UyV! zYH62cI-2id6>c{pZiw4m!N#F>_wL_^)5Wl~Wn!WhC}~TUE>|h7C3C@pPY0PyxRzNU z9*1Tuz2x>)gLe~x+{7woLc(#xFPzm|?_?(J?Pj_1F35yhG(l?XXr;r9% zON5_;KI7+7`;q5f;%AcU=^kgzM%x38vBfb(SKcE`(E9yLm{4hk4yHI0Q@y*rJzC}2 zt5XRmi)rJB4|3j3huc+P(lXYd0S~DmzL0w83Q?{EiEAH@st2)&zxXsbo4Wd?9)qH5 zBb-t&??}vxrS~~ zR=`eufy)ehf1_ze(qW?JjJ!Dz>I(0}Vid1F8mynZ3ia;S)*=!%PRSo3E~w(i4$(}# zwpEu^g5lPP{tOhb#NGj2eSK@DbZUz3O?ea{k8>t6wcN%pY^2&bo1*w+E86QP-{qN< zE8R+J$^{eWoyw6(Q8D9nzi z`L+PxE6&Igz9A?1^{uT0m!M_LAicJqq$=fGjg0z^B++JgJOFmyqrC}6(4jdm@>t}Z zQQ6&z!db9R=$0Sqj9pUxujTi>k3EFu;KAk$-cm4g_sA2H3K{}hMlN9>&^(odW@9$3 zpb^WR1!Q`wzvkZJ++1KHdZknGGQ{;@z6cg65s2kQSp>uSLzUFz&&GI+N2-s?u%I|2sJDhqH6&)hh#IgTi1~vEFg+#8G`}(G$vn zk8=CfEmfJeI|asdz^i1;x)DJ3YCRoF889W%sk$c|21aiUj3D!Z`Hlrw6d{5-Wq)~* z4S9?HiXWHD+PF;Xqo`#-50vt<;-}?iB&S<~M)=xrJU3GFd{RnAD5+hu9#E0m!!(3% z(jF#msFq{H2lty#NrLWVY zxFeCouUJqR7A3zJ|3?T;3~u?^D$xq7)W<7eGoO1rTc?_V^HvD|ZXUw+i=RS5;re@$ zJGzh8SSjqw_b@?R)fRKXZ74xd`;G-sDp%S|FMSzWvqG35~nup69;g>C!~dSv-|6 zIGv+R_xk+gbk=SXX#$$h-*9p|bh%(j2+ptft$JJ>RCLbMK7+!S#Eukc~$e1Y7&4J zy}jeYM{iQ`KNT?4E8@_(&4GbR*z4y?DAfsh4*vq^d`!M;lr~o0e-XNNC7?Fy_!uo& z2s8J*a(Y&{)fJ$;EPdbGaa9V~xL^Sk{Q~StCa`MHr8YACp%`0yA@jt!BYR3=ej2AT zNNXO?(VbARfQ8iRbxT$OGdI^zMA zYkMSU^KDqVdAOQ2>LJ?>FjdAXc!K%;xwG;bkuflUkP- z+b2rREHDSjXp`)}Ry`SEMaSoV<60Z+Q8v6E#Q^S;smKMyqcX=95)}24C&Pb$?oQL{Wfj?{*#P^zpT%@5Xr`~q)0K7&wo1!G8l~w;piXAZ4u-Hi2>*kj9yih5lPI&z zP4PNK-bGD2N?)38`8%tXWwH3LU+SGa?y$H0?WSI_sC0G+-G|dRE3dwwKLz5p z$78yAvI-fVJ&fF<(xNA|QfTb`>syrQ*9#%vdKK|O>PkV6u+v>-)K$!m=CQzm12@prjZ6f}?uRo(+^r z?3wtt%^I{0fZ&P)r0XuXukzLbd%&E}3pU>u4D}4BWV}e0$}oo!ENdmIhd3C@a;bx< z$oPu)8&0w{3oF{=dOfugrO0`nj$a?k8zKvoSV&k1 z;-KPqbSm~}Ugjw2Rk}j-&p;}oHv#sh?JxMIWy60+IG#40j(TZ{FC-IV=e}A_&ZMLu z5TI@&Mq9!a%}Lw1GbuBN(dZRg?w)#K4b)LhXM1s$8i)?M)hELo<X3pBXb=48#>IyuM*b@90xj(}*(S~_sk)jHo)8QCBiKutc)6J6Cw_kW z7QJ=i17ixkemRZ*jGCiPkvVDJN7KGZAP~NMM4?Y}O zzj%A^c&z^~ez>9RJyIyEP-&>FOOdT{m8fKe5M|Fu*&(ts%4N$Ig^W~086}~zg=7>W zq!Rb@{Tbh{@9+Nae%$x{*Jt3m-s8N^d7kHao^xa}2VaJTeP5RurfmoB(klMem7>xEfw~(ScozdypiBq^+BP8HJa}It?T}rzCJ$b zQCp<#6gFvH9by#^Vn5(%fM z=H8Xlbu~mV9+l`;bFE2XdG7(gx-qe{&dvg^IcW)u&pL~=lkf(e;<8?l_3(Gdey0Nu~DZ{jM1reX1d=S*cmK;JJ-FLxoCT&)V$D z*0XD*oCI0<=F+|&Upuwvva3#T&VP2LO6J=nGU-Q;4J_=%@d8I3cF@KOS#R*~P`{Xq zDn;4t$W3VYKXQxe2B|?>mBUa%b`4dnI>b5$e0o$lf#bV}u6DE%~5Q z23u1mqfLHG(43Q+RTv?!vKHK+a6mT>+-1;bu&}i!T^|JBypmAHzUExz+n|un9Ve5$ zY!Y+ftkip+8da~cmK9|C8I!M-8Cr4Ft7Y}Tfi-Vxg?hKOxp*n2H* z&lh%%)KD6enmqf=9v(3`Z2O@=ft}=$PNfj%-}Bbm)T}vo@A3#LT1S5e!c@PK`F*we zCZ{!O)W(dBY1Z*xUaQLYZF}P&tvEt9wpFxNem*|G=If^EggRMaja1n*5=GAKluhBn z!osurlYe$g*f>HBbLlCYuVB`x@BH2C3It!zpb0qb*QlR_Pc!X61$&N=k`6IJ`~#(s z_O2jZG|zMTCR&%9oNzKq+q^&)p{&U<@% zOY?o|%PY-h)f@8EtOP@lyXc^x$uLA7{^b>=xJ_OmdgoK+j(ommd$*?vks9sf8@VzS zxu3K8yHpBj?GgiDsRVsjG2fMqIgP!Cy)Xy@HlEXzp>eBo-%_Jjjb7gKaVKVzf%f_s zaUQz+RsDj0xL&GDiBoSEJ)YvYo&URN@*ln+*#fzaIRJYzHkYgiU1bg;2R@xnS$`+z zXcqT@Cqf|)H>GL_jgrgKYj5#v;5<7Mk~3hXNE*Ff3M%{96P+Rxt}hZP?yTv_3GEWlD)`K+lv_;dLM(5^UB&4B6~mm zsDqre!K#!{D$sDhy+Os&MPe|1AOD1(8!VaH$v7c3rrOyDt{t&11^etpF7(`ZedM<( zju;Fo$x?wutjOQs!rQ?Iq-quTLUr!#UmJm7$6=wS%Q+pArk{6T$ouW0})o&xVSb!uoU3HhC?A>aWh|Pw%XT&?p zLB;j|( z)h=l&hpJnF-;+qL+k2`!YWj?v z`<*)3_LByR0tQ@PzT3WVja4xXbU>g))Um-7!)9?{5$O{@a?b|zsGMu^Vdcy zFCL*_2G!Z<&GaL|Ei!+WBX=3do;Yzrd2@vfPe^^V?}DK#$3cFF$dP8&$2rO{QQ1b{ zW2n%-sGw;Uc6rHhUTAOFFG$mh2VGb?T$lNfkFLPxbmL91#!e$UR%p3dm9 z!+}Dbq_G;>K#ua7qb88evQ74g&4ma+5 zdK@sUbPANl~+dw+>@b+OTK98;}Xi#@=i|j?Pq8&7X7b>G90?wuFC_n1Ot+-XzRU|%ye(v^f^311--beQ~^-uYQlS9n` zov&TH_U=R-jg-Ab;mg1>_D!`W6m|Z=`|_>EPML*LC*1ik}t!!Xur?<;nT4Ng4eU+8IzuJ&te-lrvHoEk<-IX`f6 zFriK+^s@iF_$i5Z0Zo(Ih%R$lp}W3=`=?a0AMxK!A1~Q!a_wV&1!uwyiRe`oq3gf4 zr1;(`?kynspPLG9R6R*bsF^v+LcE%Tcs0o++Nnm$w`*dq>MZ+(qziSn1V-+@veD94 zREx0#v}%;DrmB}hv6B+r*3mH7>iYFJy;K%gUlRgXDo7jpxxBC3@gj1%=>zwxerNVH zEU@Wlpa0w(^Hyv@>-uei6tW+x7n(c$SAwOJccOxtips)KFyTN&)T?MOQRN@9XSZzG z0%pbUDXZJV-;9x3qPf0an$1JIppfjyF;?;m_y?%^RCLMWAA+=zU&e+ zzLO+bbFELqe0}S9E;q$qVzb&L$Naq}A|@DaS4XW`S#OjqIZCdnbbtvypZ|7n`_#9? zAv=71PA-7L$v7780Qw@ZhSl_PnqlXr)YWsd(fqsD!dD2eMV{pz`&{V0<0N0X=itD= z>fsh~m3XrldO!WH_A-Lfr34_N`$ZiaW@$Ab-YbZ`RYNPkS=n9!i@#17BJw6&9>;Zul*KJhKuwIqtyr zB8*F5?Y#dumf_DCR|QmdE(SZ-T%IU)Ft)v+uj=t?b485(J?Z@iHXSjKOOSJWu)SRF z#Xk303v2TPo5%u3k-eq{yH(6LKFi+c==asZvDM6#?rPh%@v}iF95uW)?1-K$eh_@; zqAk+gu2~cy_ur;gULI`V_uvFGv+Rp#0h&3%RbU&x`q@`bdIYaX6x%Hxn0 z!+e`GsdWhVvh1?$J<&;i*>?@{On{Bs|nlRFO1|Q zQcJbKrA&3hh;KP}qrn44)J!XvCEuUH_^?=fKhb{nPrg(h`$ZX+60Nr;2%zsyL} zDSk(sjFrBGo+a=x%b!g-^ucEuNz6%h}xxJ#=^p~D!#MaF;mXfhJp1X zS&*6Sjld=4hx|<60ZH_XX%4j8egbbEnca<|-}uN#01b0I>mk9t*B2K89Z=u8*F!tN zw}~+bYR0I={h=|7=o2;VNwz7V@rX%Uq-Np`)D@3h`C z&8QzswJLqCC8cE2?~==SJ8jS?Cnl%+nWssa(2uf7jF_Uxv~^VNVcMXCYtK`s zOn|UPc3-T-j*P}o_IiUuZu@r6FSXN=sh!N#ljo1;4U*aF71yE}dX2xfS=(m!jg-qp zp~?qQon{gYWs(e*bC|?<8|~MZHx!Uk`j3n<|9C&Ir*_Lr^n8^x)8Nf!yRRL4_X{1N zm+^jVe3=-{ud{diuBucdOQYcy3SZZ#QBms}s+@*^aI4YVmy{OwndemGE&6+F@`i>_ zlH*-R`pekK9_97{%l0Ozdy97SD(f%Xhc*p3PLid?97dXNJv?=7w~>%T>?`T&Dt6a3 zC-s|n(50ScF-W#x(YL)7#kDErA0sn~Aq`w5Ke@nr{Onf#!YF~It^sz5d0Nc~1Gn&g z`=Xe)6k!v|iZ;+TDzr{m#-n|s+6#p`%aM@rw#=}_m@w<{LjnttcldREo`BHtmSBZ?s~A^I7~+qA-gs3YIkocsKbm(LDXO z`sZzu!1hRzL5DVKRsoDW+oblh%nRuH#9Q>z9?mT0kw|-wBEsD4Y_yWsM^#n-b9rPP z@O0os1jGEoFc!Ck&z;Z0^W0e;{u}4E*hI)Ai@&!_cD{U=#@M$-#(K_}UgGG3Q7&z* z(1=%tfs*abQQq9Ts@|#RT27v1rHbts!%QX=v4H{B0#dew z!Ua2zs=TZ{OxE-}T5?q4-d)Hz%WqZJ;6D>seWU?Cr{Hyny5=tiGPPJvZ79vI;SJuX zpj;5LI2iwSHP7KanT#hzN2haVX&S5}3HT?Rn4^-_(Lj&u6`9{niB-?FIDCN33 zbbXkwT6$2`HFCav>C7A|xkr9TRz&T`KJk`-47r>RYUa(+A5Nsa8M^7cR@isX+tYTm z;wbhzh$Jvc{0e$XH4J3S(YQ6I37oh;RcdnC4i~6uX0M&!Nj0AJqM1f9j zn>=04xs(YX+si+1pC#?GKB2?S-y3M(UbJ zp^K|5Lmp07i5hQNBQ&J6jfR6oAvgXGIF19Dl!B>`0$DY#IrD$W5+^tW&DF#SU%POF z%0&?bD~3}A+8x=zNHRwM9wzcAQ)Q>_rJ5E^v3D3Kl$vt&F{`F!1VWWW0kyZ6OTsbgwC%juo5xef& zt$Ayo&d#@(R_!Q}R31T@|aH)L6Vrq~m%?%xgkp)2@G^8D;)(1jW%6jBN*0o6m~Ug#SB!W1RP^|PMkQ+ zHnElC(5j}$fi$i!`fg=Q$=^{#*0KpAxhwg4*`^AgDQ1rt>Zv_&(k8<4u(NUq-)s8{ zl-tJ=q(i%;uBi!R#WEavDbtsGcDIONAFBsLV*EvR6Npp3@cr(^;nnjd8uU8iyIiTn}C1D5h*-mfmHvagx)u!6q z?&})E{%qQJbfnt*S#|5Y8?TVe!xp7a5dxOEcKttYW|6mNk;=6*Ov6;SN;`ZCyri_V z%K1yoByW53!+__v=A##zlMX9hPIl??wUFW&_h)Dpx?ug(*=9!fB)z`Bsfv?G@x!!> ze9j-J)aD|0+||as3RC^?I@KyO$$6R`izBQz4nI#YVVmw zY~Ob%Z6r%iaKWp|r}y=suJG9lLyy*1urwbp4{0LX2gMA^cq%Z7d|16BM=bmSK(GFZ zuZga$7bXtHbD3K!ICr`}XscH)k2;Bt*dfPjE5t%U%6bW}G|B2A&l-4#{o?2-q;q*` zZ6#@God4BBK4u@qPFsj}m9d$HA#VSZ+liBZYfF@83V>VwLbdA)MR$@zzqK zY9CDlXgj$pCryhE#mPc2U`_r^moy1@2rj`dL}ME&A;+!%`-9j=dedcI0m&2>g0$Zf<6cTp$ z5E4z@$5mC7U@c^PWQw%=XzS3plB-<-jpCsz0O`_dGQ>A>3^Z#RBGh_%F7Ij9BnMhT z2n-yLzg8ZorI=t0W13nRsOU6n*N1{kK$i+3%ZmFyev;ytiMa?(uUJ(76^H-*OgI`T&_unfy6Sph zpC9W#_Mud+b>Xico49`@BatIVi@wDO`I3D~-2VbZvcb=nlslmig5ze)N5D`*UI(0G zStj$Zb6b0HN+F?fuD{2)(R(DN`MM#YZmy?(1E2ynZF5AzKc@Y{@M-t*6nU+rYvMd{ zr}#itzyG{S>{*nV)yUH{K~(63VXlZO|NB+f zuEQg5p&XU*IE(%azl@BQKG zM#=YZdI>Y#KzzEZ1co&Hb;+yn=@n69|Bt?Mi4ooZoA#L>!$cS)cAMUr2^1*(_oEer zD~TfkBvsnh2+iro%>~vXcf4ji(Xws94jp;cE_!>u6<;pcMs)UOLIG2Ile5WWE4n|? z_uK;!sU#GPdg0axZ@aAIXS_+y6J4Cn8~0nZbQeIfajxA7h*Lm7U@FZ@cyPrdW3imv zkI@QJQc`)uSXC?re|87VVW9j|j5I{eIm-%+wW46m6X)ZpKAuBl&{%ahu>*|I_x%>- z3Bs}c&l6S-B|*CIx~Yl&3#KhDqa~=n3DQwwuHcn#A0vd+1|K$dLbGK0rML1Cy>pPq z(k)W{xrgg_oB`u~k6C|lRq}sd5Who@C1f@_dtv&_TMo60vpK>+BIU~p3p;^(iFk-H zS%=PmLd-m{Ehp8v3g>5Fr4K_9H zz*Rli58)S-4H&%>`#zbNN2P)U_=W>G0#yfc+@8Z`7#UW@ea9;wQqnc+Ic>xX4}Us# zd;9IYIC;+{Q0LH#=#7xGE{0wcovJe2nUK8-Dj$%LX29k@F8ymyc z+4*^{+>kBuOK5%U&*{{lT5;-ORAV5e0nwv2&g0Kl@1~=nDI}dLfJN8iB)S^>Le5sKOQ+LgQQ~I25+!m^0gCb6hL35+Y6Q;>!}L=3!bVgoK0WnZequ$% zbb)tu7Po{c&CI7)@!v<^ra{JS{9e;-oGH>F69Qfop`B3P1tWHwzm?nUO@XQH1<*-!@5gL_&0 z^T)YU)@jr$1E=p@Mw4hIp2{d8XWiynj2=G`u|cw3IwYN=640*J9~U?H87r=LgU}I@ zD(0xpA){uQf%sAFF4Jzdsn*cWeX_mw*@7hCx0{_ zFyCfNzruS)EZX$oK{$Wyc-z*d#jySS6Av1_l8w-|2RJQ+NlxRNkc=Efti$Cv^LWgT zYN9k)*a$V#)(m)*g@;(a^`c73wvRXX&VI|8*|E0Ywlqvk5Z~=@1>ue=h{>Z4yT|At zNIw=ogC|>|0#H>f9d~hxsKrk9cuN~RzEXt1USDcIq*~$xQTiYm;Hj`*$Jkg0XZv8W zWbatj3a<{=8)b)-63Xs|KdCsVO1IhtD<_LF)2OxtFF^kKVwsH=JSJM1>b3({MerPg z{p?Wmk8E-TwqMmaUV*X!+R+ z{;$IblA>rfkhc)gHTa%_Ao+te)nq&NFYNS}Xi%-CU`VHJPZ~qQ(YQSVe&V-ofZriT zKcEzg2V1Py4m~2{j=!P@#kXdZtd5C}A;;9b`9Mdrb-!Fj6GJFwvnuz{nw-lzneunH zMs-=bUl7|?#m^8Jwo&@1S9<#tl7ChFiN|om<6Frty~H94bTIo5fF3^e$R956^nF9V zTtdblIao`9{_chfWR}M7S3AolL_5OW3ffjs7Z=9Zyy`cjjO~bnu3OcI}t&kiEUVu(VQW!1dY- zjg|6AjC``%_tLKXn$2$X{k$E$xy=-8n{_@78bdN1x-(IY2QG^t3YyMCI`N?0$%+7L&UiQ?B@5`&F6=}<2x=oK zDMD(Y(Z&InLTAv!(hz;Ei{~5=nOAQo-@{n6vK+W8b8{9dwRTpS65E<8hvA!#Eo0x1 zszeaMF8mnN8zdWKZb|MQVVgM!2PS2Ak%g~ zz#g~nA`@HGw&Sv}O}JE7)VTTiSB-rrFo=>G*rpMg4m}rk@x^1hwH4PG=8l~#5S(l; zwbrZjN84YF*b=rs%VTmc=NSaxL|7ZDr_$MVfYQS$X`s4yoqIqP8jX%83mrJ!h>oY8 zo(-i){IuD{FyQI#p=+{@#O%62_V@3~+k)6dKJk?yrh2O~p+V!QCVl*`K?no=!>W_b zn-k)pH)y|u`;{l|w{3uDki7OYALBKRzfixrUtq%CtKd7fLxECRS*hZinRyYO*U47N z9iRef+b44-QMAUuDemklvln{26>;$r{enI=kj$Bj9Nv6M;)%gouX=>|93+Qbk?9Dh z0A28G&W7}5`Y?fZU6cgw?lG=`fuWIeJjV)W|232cjTq-6JDM7z;&&w53ZZ2I4X7%` zwX|k8X1gERN?EolLj=`^)^MH8p{b-QX5t2hQoan5eLruZzc%*OSdGA_EGp>-r>Mjf z{VL!Bi_Ux-fIEj#yhy07u0~RzmPlX(=mfe{&?eN25C`_J$O3{3;=Pz>bf5{5m@)lp z)>6d3{OXTgPGlGFR_hqC2JqE=@O&7^l6ov@~^}8b)wC8n%&`UHTPJE8X6pT`RKpo)2$0}o# zHP_tdzs5_hyBd2}lW2qzsjQFPy`>Z*KQa&;#jignrUYRnf|;49uS*Mm(2bQ}AoGS~ zfK{1*raG>8T`w}ib1@8_?x@<}NI(s8KWg}r$|7%jGuJ@XCg(YBatD^EFvV2wq zn|k|9g!V_4ZR@|3Vrop;EFjAaL!`~KKCDHL-FdDRCeU~WeGV7~?`D0YrKJUj0Ei58 z)GHCWi5cKf^8p~a;xO%`NZA@cz z%7K(zN~{sl5Eb>S+)L8jgGh)WuQhMrm+*YKPlvxu^20g|&UM`t&N~h*LzgbP?+A99 ztX~`(8uC>^i*hxQ61k4GuH#hOh%3rHqt*;Kt(~vy4Al;@ic@1S;+l$nG|wOxC^1u@ z=f|J}&kx(4xX;n4v2&gWyMLqymkARfxqJh@q3~>Eky}WnrL*9yX+@#Rzpj(e(7s_Hv6ITl`i=hgkQgt zr*;|D+670Hw+h##qhVwaaI?$jpxcb{XO~kr|@Z5&q|@SOKukQ1{3 zP%_;IK#urC$RIcI&}to_$d;rxsqzc&$+B1~+pzLHekKPV*=N>B#U6(V{*t}@{ql%> zfnD&|_t^%-amZgjY0bo{i@{pFy`+OzU66D*d{FOA^dZ3;?1C_7PZ9!z&@W7v`HY7$ z{NgCiR(LsLgYg-E_@WmWxqJ@6O}IvB7j6*p4^W!V4`TO{S1l~klHLW97pk^zRG*x* z#q0@XmUN@tc)OVNdb*%%*|mLDS1*V|o+Ww`IZn~}=n?eN>+DBc)K`vQtB?8}7PzNo zc6Yy}&mv1X2qL8f9OiO>PaIvd*LOIHzGtZ$o)htzCiEi~l*n4Ye#u2C%{UEZl1;r zH=oE0LLJf4;-ThF*GGd_9%qlITIdffa>tvS!o(c56j_$-qBmV)Xs&QXV}P|ZV(|x? z!%kT^eKR6G8a9lF$;DE7#qo6%?Il#M1T;w}85ORF2M$^`@#mtYszIY=_v9>keoX4F zo|(j=k$j4Qt73%kDKvD1+xQNW2QOTDisT|ygCz%I=$uzXWs8sGf=s6XgpoPlU*Hnzp^qHBl74Pyjgf`VdpnAqJ~pRCqv zcc|DJXrwR;5Tt7ssUJVSmD8PEbSHf zlJF!|26*c?7dJuSBJ|@@LRnPrIqCtjjyCM6SMV*{M$as-LSQPoOMoHUG$Oc~(RnMY zfNqopw1Yz{mP%7vWJH9XY$(fGVxR^Ls?D+}~+U+mr~I_d|qpNFWyRZ;6SC zsOZJ4rC#S_pS}93E_fSeK3OcSd4N>5>G@e{(<5RBm>evGOV5#Ly{GNQ##QW2d_&*#yqc}pHEbbaLImlqu;tYc8A!%U;*!8qW(qhFa^ zeTwdnDkKOfB+r3+RpO$H1ay?!&3;laQ<-sRFv~z;iPbzwt6PB#;D^Wv}LXBzHNd zcU)NV93vaSKC@{2s1-%OFEm`KN2*`V*i~vB{02lx$>P+aH~Qqm)pA-APad|kjxTtA zrJq)8oL1C-fxEE{31Y7%k9A#tf4|!W)s;lD@&l4UPpq2ji?A)&^{iq=xB3e@2%S4k zn|cMthpHTk3cil=- zxRX-T_joiL>7qnqE*=P;ONAT;VckML52=lFR5>jieB{fFz7&$NFS0qMS$%lQ)oa)5 zn(Jm_*WQQ9z5d<3y9(y^q1{B1{Z9;4|?E!Yzl_GjQ{} zeI(CFyvO0%^k`K^bt=EEVff_4ME-HVc%vq+*K$|a9D9aAncGvZ4NL(XzI(+8W!Ad_ zg6NF5WSQ3ixK-z9Z)$5}|K-Ou|NVQE6>I`12f+8i?{BA!jEs<}nf)$o#H`S>#Y3YZtOw}tOd8!*(>D7Xk+xV|3i~(3jVv}&iwnB zP&D-8QO#kVgtu~bEs*>L@rk>aI1y}KqylD+zOu%NR^K9F8Ysy+84Y-n{>3I@U^IHi zS*Ee@6ZxO?F*yPkrT$}PMuHqoU8$r3lEZIYsR4_WZbhT57bkxVCKP!Q91=?=AOz;A zbmUKA2m`+Ztn;?iq7Rf^1ENT$rDf%*RZwsFvh;Y{@}k#Fo)Ql z3~pw?Ts5(q2-Lxx?`Vqmd{H{0{urEY?^WgcyzX@~LS<^HX)Vhb!0nS_Rv&)&-fD(e z7_HG|7GV)LK>7g1OG)z)o5m)0(gH-)2@a7QBRXvyjhkGgwpJ>bIg1PZL|M1^wZ*IC zGYm{jsyE#y=}T{{4agvm^O#>7o}Q3O79Kbx$u*3_^D>nZ`;k0MZMC^_W_Aa)$XcRa z6&NaNpJ~w)xA(%%_a9EEjNBC_hF3}O(Yr1Vk>&GcCq@IP{vrZUw5r3CrsLWfNJmV? z)HL8?%U*FL6_X7f6tFubDBrLh;s9hoDhTzI8KqoDf#cfIU?({+w` zG_g++qv-(d(kJ!`3x7fuv>DVa0D_Qp=3b^1UT~Bg5%lPh)Fxt4Sw!heAXdFRwEie} zkuUJBBpdFK@^y*?)k1l3cwI`;_j&;%&B2#}Sj)0R#KNwF5*QhB<7@_GKnFJ!!lok5 zq(f^Z4CyF92*6-iG3ABy$~0!bYos11D^vTD^tTjnCD-RWFFHht;Bf+ON4x=XqW{qR z)~6Jb%8CE|Geqt!@8@P_9Po#C;3Hpz^6_xyVH^Q~1}GJ~nNJN!$^j49f`FPLt(-DP zX;-4S&twD$sfxB8JH}7c?&*@}GkX}E=6tLBEgIRr=ZhH~!Dp&YjAN}12S>V|EZXM@ zaDRxWS4@y})5uLYY!{Q$CvrW(Mhr<#Ox91vOx$bIY`NFbYoyF{#&jiP&QZ~Zbe!Zg z`mI4ENgu@`2Xe(7MEF~zxN-$4)w^BEK`rr#6r(ZE{~jLTA&+AVO{?HEMn ze0ILe(p-D`H`;!De0?WA(=syNW*#IX>rv}PIM)Fp#OxOHhRAgeoNR0+`u0F*sFG?> zWDhh(A!jCH$deaVXlX*r>`n=OqUColC>S8iCh-4GNOs^nu3@wd4tR7l{4YKr7yrwG z{c8buJtR;nsXJ9j$>oTwY2CIUBO{(zycN8S7S(mj^6s-VU_;-8t-T|zC+Tth*Q}Vt zM;-VCzFvOR5HNaRW^T^8wKQTS64x9h@3{qap^!aZHXa4U3C2J!#yizD5~QawHw9J9 zn{NO^4_AZ)?l7pBMF+(@F68<|A5}VrBkzaU4VH#C&9sE&3ZG#STi<{VFyarVOV8AZ zT3=)2wpMuc+oyD~%wXxtwv2)M_tSkQ_-*5F%H9h%qV5WR;{wkAlpy11UUrLrlB&%& zp{%mij;<{&mP>vIiZo;0#CTfi;n2P_GS1`ClHK^uL#WB^ROHjN3Zy%f zrVjFt_TdNy7#4HRJZnt9%^v`ngX$4H))d2zO`(c6ImDt**Gv~Wfsd{jum5fU9!OIR zDpAEFxJ{!R)GHx1zCqFuNB>cv#K$+tM^j~6EkwTqw?DUj^aIoG{!_NclSB5AhYg-= zterxp0W?5d^xICNW+!~}1)|Iaq<-q>(IA}amY&RTiJpKyrNn9gAP-#ADF+s zX@%d5k_+1+-;C1aDF`4OalHV~804<+vt;|^r>gZh;>-gzsz2c7p6kLY{2y00BFml< zPJa< zgMULb7FNO;3O7b0T*dguECD{7>{GbNrP5 zvuDrjcnbYa6iv^!zV{ZGLOfu+Av*Vvpo>Q;{<=95VXE8Nu32@BtOa#Of~ z(x-BvpTuUZB9ppE9toiJjlb4g<%9WD->qAm<>D+pbMg!-aK*0LyaJQyjrSDj)!j@> zY0G18BY8pTUMaVDIO6RM6xNkWVgIJD;#fVGz&wV|)3_c1T8|Xg_!P?C)i3I8_ZIk~ z-lzs;L+ifB=dM=n{yNc{jey%_MRWXZp?bi}OKk(>2mT1UGPeJF+Hr^GZxZugy8+^B zt~o%TfZiijVNAF|E3VIV9Y48eX-YpE(DrA#-5)@6;rH);ROwQYFK|goJ;HDf^+b5@ z2GPT6$qAu}4XmybcM=VFtNJx2ZNyyf>@oIh4kN-fRHfE`iX6#n)2({C@yc+6%4&fkWaZXpmTUbET#z zuzb=l@G-(A+e}TchlfY$xrmL=ZW`{LbiPj%)k-mcHSNodLz3faLD`2nTNDa z)A{ud8lY%M|A>{hJZkbu8}XiwONZq|$3S`BxOl}*B%YzAfx}b69Nyhdq4ve|=R-&) zUG^!N7m8W#Dt?EG>Q;juTGh;^Box#tv=~5T|EqPvbvYqyM+>7C2kl4O6CVwi^d3w2 zK;#v$W#4e4Uc?lx9cLH{Qu7s21ABEQfcuyA7k_6w%v;VNP%o>wwSVGbb;^XNN5tO{ zIkdR$0nJY%u^6c^`A(JB4%Us9T76ep_yV8`HW9MNK+U?_gcx$BS#+2zan#$UMwSnC2tr6*ikDmC|JB^? z!7s>X26esbHaeoM)}%gMz#(jh50RaUPF*{-Z_3imTIEoapEoihh07M-zhY^(?uj4Q zMfOuhk05AdsI%M!w)xVx3~+beTE@(Wj^o5#YXoJmXHEY(u$9_QJxx+sy=Wqx5hPVIrmn3#=WAzBSeQOMpx8Q{U3Np~r(!w2z zrrXfVx~_psQWf2Tk_xgAp$AW0CN?$to?_&cW|=$9=bj%4ie@hyE0f2Y&+@R0u;ya-Pp7f_z7jm*8O5 z)4TvfNPU^JKkm@AiX60Cmfl0}mrjLNyW)S}9-fff)vFf_sD`(%OFWr(9Ca~9wYgnw8~jKIeSBZw)Qz(0IkyLt0w7FxftJ=BZ4FQ;TlWO#FRXv1qD9IPFR zvR4@!$&^054Q)qePO>v--4ysi@q=_m zUGP2Q)$cYtf}KkhzSg~d&6uRgcY7JH%OQPLBR{+Lery6x3~42QUBa#~{tT?{kaf*D z|MXC6(Ru59On}=N7LR#t@7%sWvHf4DkNnjD6{X}I+t<0bU=oNhF|_3_I}a-52U|;g zr=Q^+MRY*WG4UrA1l~gc5cDc-OrQ&fZp{t+x_Y4dnTsIv_pq4iU|<(a4%Fh>A;r{J zVjqevwGLcRj+-0E0I9E?d*-;LPO-&X1Wlo*X|#%ugv+mnR5A&z5DEF%C+xof)xlL%o`=rag1d0_FHwZBnE9CJ)_oy&`f*a7xv}= zERpO7l@D+VP;usdz$SG-)a~-c4>9r))q%QYHmRDtJ5six2B~r05 z?t$HL zT?WwO&aR(fq+166RR5KK7WNXNFa&?acuYN$Hh&d|$i0ZcgE-A!-sQ#u2;)1Uh4?y} z@u*gg$k7+AH`GzC8xE=ctstPnXVAj;CaXsXUgDzm4+wY(tejTiB&@68DzV|d;nT#& zOJA2O+n&94l=Q3*NFb!RQ!&hal$ty(Aq)=A!K7CZvzLkT?9v|q;qfnDc-{>Qz6H-$ z?nOH8Hbf?L)%dfZJ?3^IiU~;DH~gbdCFcG9R}y>RFG=jHb$?4@3kZ)oX}aql!j+I~ zJBc{{<7O}aEs3T7M-od!gx&`IeFg|x~4eQz_K6IHa2$*235Jr91S85Rgq+@zjOdY7-f zU5wG)l)+Un;`(;S_^nC~LSn;*ITXc|oY*BYUPTIQ-Y68mC6c9i`H%kj_n!S%&yUEC z=t~DUUhCVv`@Um-)qL0G{HhyM7w?Nnrc?X^+0!Xxp$S4fAJ`G@!X`)#cagnS97Vi( z6QwSVKWBXgl1Z@*|i^DP#@dxnLD34_<6eXWOIA{ zY8E7>#fNUF1%9s~mhge7XwP=F^eJw$#JA$pS$V`-$wUSGTzsd$x|-?hJMZY`!J(eY z?8~5SC1*ysu;DwEt8H`UaFtth>fMmqZTow66Hw+GNVi z=hs(}v$Y2$vSdF4A`tCZp5C%7Fu}3m-^(*;Aus<-TK@TT`S;Uo_JabaygmPXIp0dQ z_xtCrFHGk2=R98W?8^T6QDymeKyg%{S~_Kr-tw;z=(R5*mpk>+KJXT6wR!jdshA2I zP0XMuS15OhJ;C$)>za4=7Cti9Ayw`9R>^l2Ka>-k;5h&9_v7}%F|G68r+`PRPO97R z&l6_Em#p}%8@Qxa^0fbd-v^Cl=E9nZ*}mwuF3bAj*~LbGJWG2U;%VUmr0r+4muW9= zwvytTn4Qi`YLk^EUR;?4ab?8MuMe93DBAIsd|UR|@?f{PB_AKb+v)F5x1A_PM1}ji z3Q+QNdFiU|OBMYx;>s*CH(xAn8~OVJ)g{ODNb$!LFuDxTH^W)K)<3vd%R}HF15!UQ zQ4F~agi(FiOa%WV2NiRR5@`Lh3Ix*V8@&Etoy?*4g9`$Nkr!D_#;jzFSjFzAR;-VK z=3xLRTU@8`V||2B^V&1g*`P{l2%*5^YhYRQF`{t*Bgs8ti4nnwY$#!6q8^~~ya$V? zq|Lqq+yMK}p9AxL#hBa9Qz$@IPF7roPiM82LCyoWT%L;%ay9^K z)h{F6c?S~&h!dGlp7s9U8}oZb+}W(cSa@LtLU@`xlV zXY36~9il}w2Xk@@9&iX~Cp<#s`C}v?ZMyoNa4hHc%eANnpuWZoeXJ#*ja4bu7>tsR?SHpH5WUGqLsjmf&QyR zH4+F1iEjm(@?$Pw1=m4VyGO_F>~GMvFzIS=xVzJNS6k)@wFQIgKZgN%g0D2eE(pr^ z`jruit2*Ca;Wl+k$h|a}QtS^@HHxgf^2V+)tb#AcdX=APpctN7UOYM9%rFQFw>DA@k^4huMz?V=bm5C@jpz1sgP4I6jPISgD;E>z0^*?s-1p|IUyBfd&O5(5jqv_*gplfZ z)IwQG2x+i7Mo<#vi-#yo61s-^h_zdX+Q`K26yhCZofN21-UCi(tqQBXf8=g=NI*gp zUqxTaL{4^l=Q*~Q5IJt+GDqzFW>?2~wye%*MSzErLgBTHZ6xx?9Xc}#*j!ycdK z(^%vjkHZF22N8OqZ+PX~2A?)SThxl}=+o=+qe;Gtv+ZtaTj7~hb!KQMe6nPZX0WU^gqU)4s8YkwV zyO#-uh~IJOYB0I-!N67JP1RkS3R+t}S*OAz%T$VLD6d8w@XY+K_eZv@e9pzKR#J zKbeB@r2-R9I9N`b{t2zBx|W%K`!2HJ*bw!UV}a=ut5jX&l|CuQvDA5eG*N0mbcdgw zcKrCv`;aZh7T6mZOeQkzckIEJvqK8`> z2dAf*MXYy+VEhodG^y5q&tx?C>DQf=>Jk41K0=HoZ6GzRA|m;eOfRSzPG~>AVy}-u z23r`cK@;B7bMYq@OD_DTxb{uEeWy$n<9&AT+_iVJ`)CT}Od|VKKx|*fCXn(k51Mun zk4;8);#2R-8Vt#}lH}r!18ZN7)5Ek`F0RA3B_Ku<;dE}>mWg8gGw@OJ1I6X*Pue;! zix~Qiz2oj%S{J&~vXmyM5V$Z$o__s7*>n)!hbByY#o?xzZkY4Dzb&fi6UPh18*G1I z1O%@~pT`h6kfqz0*>bNq8zJo0Oa(89Aiir2D2B@Nbf=zdu>Ua`s3cu8IT642!ukgR z)a6mJsQ!0@Z8!Ns9mY+jNzyY5m>_n@G*5s1(U}WA+ZZJ7{zeYI-p2zG%3LfY`M=9g1@mbi$4sV9>aYEvXTz<L;d3aG4FTeJy3XqL`}2X({rthR%mnV<@;4GV6yx4ST@58?T$UP@Nuo< z7+3}Pi2DEnV2EUGiRm&BuYPlR&L{=njyi(1geGz|IO26e@g3W)Qu(`0^wz#vz{;`R z<)7Hr5b~l|TQj<7aSk}?l6Vh5xRc~LQx51Wne?sKwcmL%Fze;!s|+vE*FOcTp6PuD zBWrm&wJXj}l{Abrw1jK#Ei!2xbD=IsrTj;IN8%u8^sM!$?1)$a8ME(Epbz1Zb$k-V z%yV|{u+JtcVSm zpieC_(dl020kKCB@K|Ya&_x2zquzzSfe}P9WX!Q0wdF7{%(-8iG6UlL#GU=L;sMV_ zJBrdM3)(4)>lF7S0WjQ5r4XE2JGplCHH!u{z3aqeY5$FfJfsi3t|9`sToTT}#1+FF zZ80iB_uUW=$0xKQBBDM$MJd4jgFeO+98}}p&)tyVc>}50ImtUNit=cQp=2W6@Y)mM z2=!n&)?Z&?Y2DxW^X!HLD=qF_u@=m_9F$~5^-&nr1%RsK!ba0qcN_Oyc+i~zX=CzU zV5^t?kQTa74{h@kDHXVGHPeky=7PoGDR;tIvV?2|YH(`yB*903+3LC_)n{Q0-u9^l zcef|A0mt5%Ea|&nH_#>Z)(W8-oF;uI-bc zUo(7hU(5i`pvtpqyT_R5ru=h;(4t9W+1}IunbtT+aXZm(W&f)m%@E~iI2bZoL_HxS z3$Sg(2EA~D#w`IjKR2ITt3x{h;EsR64$V}mqKe;>m5?;>PIGw>h)(VgR@`r2ntD9j zdi09)m2dowT*QRx{jUF4ckdZZ=f3p~??@yF(TUDdmJ(g`9z85ViXd9_-m-L}w^T$4 zOAnC{(TS2^2@+i-TC@lfmL4UAXI|%=eLwrY-}l@5et5=n#vbGBksT~ong2O|Z5k)O zhxatrWs6r52lLy1%}>yLk$SiN|2t9r-7zC`%s&e4f2O9t$2w$!`^N|Q|31k5{bRko zolBsJ{tPn{aIbnPC04iHCTbGM8`oQZiRc%G1JR*T0WxjIhOsoL1NZ*is@m@UT8t|` z_mj80kQsLd&g#Dg#)gI(WGKL#fMWKD&k**<;~f5Q{(C@NKoL?y zAhmGCDC4vvo#w>1Y|j67L6Zj{>jtWR7_>o%CCLCqwNR29mW-7T{>N0T^~|{hdVd%- zAhX=yHyDN9>DmC%y!-=c3VzLbYUVu>s5*Y*cp}Y`EX$g_^XssT=yhMjvAX`6XP|p0}CHH zCSFg%6^P#IGg*?LJ7S8xHQPb0SE6C1h%L~ zx4|Y==ad;hLgy4YF-XhtAP!3P&Gg{o;)KiK34$IL*}{GR>Eig?$Bu^>{)Qn2h|ud0 z9knD3jXX>hhj46#DpxLMop-$oF5snY=u?704nobcI0t7Hg(e~}Pk6%kL?fe!uF*b+ z^r(~33KTBY+uPtIG~Y2|gM(0$D02WtUVm6m07uaDUp?C*H(pJFAb;&!bSzo>{QVa= zkR>C+g;N|M4>THs-#-$P0c~hS{U^&{ianW`5ZV|fB~PoMZ@g2G)bti#)DQ`uW)kC|n&Epx3Yb08fMk99d!0UL6#0r+p*x_`RCpOd&xsGouq6Q)pqrVO9xi z-cDc+T&?W#61`eBc3QOgc0CNnu(9dA$DUplIN8DQHLXGPE+2X(cn+K4#&`={uPUOr zVl$Pp3k=0I_89{x z0XT;E0~14~Tkz-?Tma#|D~fhHcwLEc7I<8$Ym1i9zrqw__8lhZ?jwMK;mCzBhhX4M0-k^>Pw+YWQI=K|rje&i3FEH+?a)#Z#lW#2vEKONZB&O;BAxGy|!h&fyZ z5SW1hh$GzJatFM=VaB_Q4gSdR|K<9^z4q`U>bo7rNyTC|jwDsaUL0G2naWYDM6W9Q`4cg z5c~5veh}0?jbO=M>uiA|Jp9j(^v1#lD!1WZ!U>z`OeixPm@!5F0Ox z@XS-H{I(WZ=zv$qL*nFt%_USNC?UH+J{f46%*}Ofx(dJ&85#CYZiG7MIRBeNQvuox z+;6qWpzV*we*g-2Al%k`i>5uRUU7)kKp~R`n^^~)e2U>h`FoC;AhdA=t7ZYDqKvb2 z0EaqP4zKc%?~mXAJOzxeBb{59z^N|iaoxt+>Zk014Qc?y>PLUU`Co@nBBm>E#(i3H z%neNwFyV`)kmrI+pr3*)-)ME58{r!Yg-Mol?&}4}{Cnf{HfZ-iqnFbfS#Nb!7aTB@ zn<+4$pq-5qb@8wlY|OAGMW6=ezu*?G)8J=$3=e>evll2q0$>5suaGKtXkw+4(}r76 z$m8P?^1ZYqTcV~}bCM^mzOG$x?haP{cuKHk?n0fjpv>jv5lk~9OPB_%JaYrL7X(E& z8pTfMmtWTU2cB8<7+dvK3Y2JPEQ8>5ZvYQYE$A56n9o%@CWR_MMzVS&>Vzy<-N_2~1&$*8r$e6cAj66Q-9hOX%E?$k8wWF;3L8&AzdvN#MP z>SlP!t>F2kz)MH-zE%HC=ErReQ>62MjRi?vQhTqVpyjmldnevJv6yC=A45KQQ z-a$CSbttPMKh{2H<-!9xzYaEwKp6)yv2l*DeVe5bqUO!FEK!x}m&aUC^;{ZywIcv6 z!8;bd-m;gR4F@ceWzGKp#%$u+6wmw7aJY`C7s7KrXz_sKH&}&I)~S0GXGnXZi9(Jy#NUPAdB?egKkye6n9L;Sl36+h9$V<_8=_I?(;@i?wjJ<}A5>nkQ|n86 z{Lgs^U=>jCQ(6YWD&B@v;7{TGr&Br}ZUso<76M5lbfSSRx95~9_sugN*|p7kYl zL2r#06E@9g+oOW7S%sdbMx=Df-Gkc+|LD&esA^2W+}i-HqbM(vj_vk4BMs;s7lz@q zc{2cq|3uZ(*-PqB_QA(TeyzkH>#d>RCH`hctBvbGTWVV8rNV1%FVgb~Nerodqym~2 zzhE=4h7V)8?yD&%!8r6=8G1#U2Z^A`vt6iRjLw*=}vCA+#laNA+) z)D3X}yM4t8;7L}%Or+yTJDZ|Xx7#5=YFmtU)M;~1gDND9aN@DN9-aZ74(rxG~ICi5PMz5(t< z`KKi{{~LW9L>pJ}3sRldM=%Lr37}Ev?uCK5>8_Bzg3?wuck5m!x7R?rXl_awXvLuR zfCnt%7Z@Ha1LlYiXOHkc61V<2pfE;a)zvwz!HG3k?P!=Qy${q)vuoOv@`Rz%54b!{ zy_-O@)qU9oW@u6Rgy&%1F%e+w>-YG%q$syKc6DB|)x++y$de>7hC)8f0$k00C2-yI zH@x-xhu-2OV8f{3JYbBNfc^c26vKwSwo@E_DJS8X6^HSp%+~|%UAaYLaxOe%5Zs%$ zy$cDX6NF3s{wV$hj)7Y%Ni^*W`eQ_b>p|%Bdc;yR-O&8?QA~SqYE$#A;8fq9M<)(n za+kP#cshrby#EwO)1Q4_e*xh4gcsa5xwVu>|M}aNmf;ZL>ZS{*()w6MVcCz?Z|H_9 ze;{qm2X$yhvSq5*fv(O4O&`2%KzQ52{t0*w>H}S;X+4K%mc=I{3!oikuY~*fEu6Y5R$7Tq2)&;;i*8$cv3fPue?`Z~9>wJ0SDX{4g(;iUJ+A^o>q`PZU?OuZdw{0Y_i=T5E$u_y zf*T+Tqc?*!NXFv1WRy4Yw1_;_c4r-Sk^!vGmqspC#CG;drLE>n5R#q+)m|=W`Z3l8 zln{EobtoyF3QF>acb|OVd#G!&CuQvwD$LXI1&h#a!_t*i%>el zr6aP1{_(ef))X@~Q2@dQB;@MQx9(!P^)LL7zW~SwGnuD#Mv>v9*dHh$_YSUOUtNZn z53n+``*JQ({bK}xx&03G7HD57Qk8ueNE~|y1aG{mDHW}s5On`1bT*7>--lTUl4a^Z z6U7sXtPRXvTYh#H39-2z>jgwALe1g>BeCv)A+2qw0g<*81sgnjb5+1c)tSIn6J+@x zwzc6+?Fh8wAoDnY%U*IzLnE>AU@^;C55T+RkJQxa@jJahiy7R^f)fZ4jQ_|L`8UAu zkZu8rk{ZB{Wq{F@RB%*!+;;W!QZpf1|vO8F?JO_)6_?=x84aM ztFgk$^nwt}JfPe4BDb-vAfo{rl>Um&jWT4XpLWLVw-=?i|IJrxK6XM>cCj=_)i%9M zIwv`V#4EjrE1xS*ebErS9c^2_5C@QO0G0!Cc6NA$w{2Sf{8c%GJ zWMq3q0A5(25^^C}W<2_S!iCb4yj zdN#6QxThrON?+jt8EA6v?cWn=T9uHnfezc5=6N-8xy4f{zMpq_4XYqq%NpSN0DL9^ zMRuEZe20AE8#E)3nQ`s$LeBrb8qmiB%k$7@7p`?Z+~o2&Xgr1}GC~s?$DvP&V-I=? zBU34Dm{24>Pi4N zw!=ZORS-@HgL$j>O{YlDtP{hFf~A?hqF~`n5_ahJB zp?dJ7qGi`?%Tvu2E>S;zSh#-57|0psz;|PSI=FZKsO(}_2&cwW0ND1h4ryG0y8>3z zHq8|-yvb66H;IE(ChHA_&%Ogn%`r&o9?=Jk!;Mg2e3zuJI-$#a)nR3a3owsjpQd55 z!YgvX{0I$pzzbLqM2JsJ;F$D9CY_5za@V5pGk4Z!$y;EqvVi{A0tnDApzpFheH6oJ z$r%lW8=k7wGVWmJ=qdPl+AqNcZ3zyUyH&B}`=WGkTzfF|QkB_I|vPYm0ii>ru#3o7j>_ zB?qi!ZGW}GD`z^ldmTB>yTSzF42P5gXh}B#X@IkPAVvkc38H3X8lJfga(gRqS`g)e zyjwH}eo^8zD6dnXVO0-!HV5|%s+a}v{D3v5kyyagK1SAN69J8i54R!Q*FC_`Jbs3DW{}-S?|luG7iCO&1$3(2>1!N;3lBljj_#_%PLx6i3u;IBhvj2AZJ$FT>q z2~8N(W}TP=Kki%L)mF7M{>2_Jd#owiT8k$jg@c;xH=F;I+Dky-lIHI|2n6$b;HK_x zfumhI^ukk;)E0PN3*r4ty9IZlAP;oW?ZguBbZn&r!-%LS3zw?#ps2yvkha}`>|y@x zA&~==7{Ib??!!e1{%V}zCc1&wn>{S$Z#Bb7r>42UornboJ$pJp(XRtpP%c!DsNHpk z$ztaO5Tjh}aIomfWq^$CtwEWfw+{vrj9uxIds?EEH$EXpIpCtc>Gs5$)Ja%qf|Wfl zhbJ4#M(aE0=jXY@$NUOcu(WY11012Y{YNnaRQ7a?-!M-5CASO?Kb9^?YxMx^_`Z-p z4JBWjD`5MbYCE;^qlf1ExqHUY`2%%5RP!n=g2f6(Co=kj3mFR~o`1}tDw9Mv&>+-2*_E}N0q6@BwVE$Wu-egyzg3t1Ji=qH~; z;W>L{StQJ-V)FRy)+yY}*aN4W(8-Y@xf|GVdug_r`iQ!h!c5<5H}Z_D6YXdd@c6z>rZ!eJpFjJWjehsAZoShq~u^p57< zbcbop5KAt$;PTi-u2bju7<>!jSS3`TN#oNLN#fT`LzQt`$ zxpfH|Zwpw}=e|srSL0LtTrp2c@LlhutqJ4&tdHn4HC|qQ5BlwPSCq$o2$%_J+rKCA zjNP!P)fhK~3`oLcAwDy^#BYxFm*~5G>&qb$$HpCE5;qe5Ix;^%J3^JTGt@Xvd(75J zrBdL=jSHNcDbc3mg-@yCujpHPtB>XIEs=(U3!;_8y2xx4Yfm`}$u`G@Ix-q9s^+7) z*#Dg8Eyg`vgf3`_hH0L4C>p_ONKDe6{;CP6D?Lfp)+B>qc)~}eYRw9Ve9F_0=_}h` z-DyW__Ny1iqno31f5_3y{ASXYA(r>9__6KZyc9|l2@e^}& z`0p7`9p%Hq-RH<=NLjT=N7gWg=+{W3gnN6c-HOtHF*_sZFw_R=;;Y} zdjaMzYwFb4orr;-nrGPA0{%GCIq_)duIIM^wzF}(iG|cz9~jhk+vuZyyoorzW@#?0 zD%yV3odE(Q>oRgS`44W~^0y=zEyMrZa@&J;w4k(G{QWEbrX{9IXPD1^ev4)Cc+)-` z{{BQS@zw*=OnXSebY2%EJ|}5%8qjJs84uP3O?-hSuJOw#20j2U)d{XkW+0saqD_3i z*NcaCwORx>1MQ6aV}?Nklz-1#0Kqa6^L}(We5KK%|2PKpyb-5W=nwixxzsyP7%>W) z-)Y;eJ|6r6AY%J2nelGCJAX4yS3Tg2jgdmWs(z47b^qh@Ng15z<%qJE54nm@ir<4U zj<0psxqFImbd5@aIf08ziS`ifz=z3p8gGAIe=TbC(E<}e*9E;-AP~m)zLL9?4J2vp z6M3iy9nJR7lE)t-qQoZP;k0g56AK0`dd|mAzr23sGDq2!UgdWuJKxY~3X7T3cAiz5 zn6hPgYkdTLmEb()r|GrSr*OV>^iIJ@1Vi7Qk}=Gtov2}#S5c(VUpk!tvc%tEJBOWg zua_Hdgh`y;ac%5l5mD|5dv<7q(sbg=Mkrxxvj*1@Tu_GW2JMnjffsh`C}qow`Rw zoLY2V4H(8~Qq3p^nd3eWI6A)B&w)Hf$vzx5XfB3v3Me6xy41Vp1M{_O z?nnA9b^o<=&;I6`U*a_3wzI6hK;v~)P;5K{l?lJ%;TOKNLHS8XAJ^K-s2e1viaUsW zwsWI)vQ!Q+tBBeverVt6KV3CSl)vGxJtKwAamxKD#u}=I2s-)Z3Op%TtFaQ9ai#c` zjW85p=Cz7*7nyf%n(ny+1~ST|z;yD>lc2ZrFdli18&qjaNE(}W=na&lxM3qln?3sh zxND>R=hdEHWG%%LAIE9cvu9&LdU0JnAT-9E>o)29kJxhkQ&CL@*&UITF6fjCcIls_ z4M^5G9i`LgNtc`i$a1WrlRS@ZM{n#udo;#ln5uUVTVRDB0N%rMQkc_7_tGF1ne{Ks zjo-1<#-F@*wBMx?k|Q8_f+kzuKKPVNxLE^E?+Frcm z4o+e!;-(ko285>b0<`N0rx=%$@bUz4WF)Fep#8^=KA9abjZwv z;JcDi(Zs~(Kh~nC^*9S;rEai=&OhnUW0Y?z*5gaK-c$3UP5Qwq%GR#f-&Z}0SnsuJ zdrQS3%zo7pv3Xn4)pgrk!bLL5AHNUh6uLB1l$Glq4?4BJp!JheGNZXYt0XTy#Jf23 z3mdhPr?@1+t}Vz_-hOz|AfRiRpRk)xp|(ts>F?-V(pwTtu=AB#mJjT#ao{&ibOne* z0PS?+u7aiwU>UplDeA$X6`-)`R_dknxqtF|wj%NAQ#M-mNN*)ax?!sZESQct!H%t( zGK)I(K`J)Ubo85^Gx2gkh;)5*1{8zuO;4bS$=^`^+)woOYT+E40p-p>|Te?@Jz&9_O__o|%)9~<8B zV~Jk{$u!$REbCVPx5TPz8i_S2y8dJrl22!cWMIi6gDh&C9)3deM(=OO=bbCMJhlKn z#f;e@4A>zz0;j7T?}svaS)~$sWgf@GyQ_nKltAC0Zu^}m9WU*yKV(TQ-42LtB^5)aiJ2hInj9J;=~| zZRfS3#Xh^m$`=s= zD^U}WHS7*bE{I`s0?c3R6LJCv=T95R(u`mL+>`RRBfUN}a{Ow%!MnuPEuN=1G5*S| zp#sd42d~UM8hPoadE0|h^RNY>H5t~=ACh_MPX{isP2L=AisXgXK4)Ye_F2r2WB1`8O8$T`6*f&d5h=|{ zfT)Q2JM-6DZ%`E6mT(@-i!kUUkBPHs!CrxH#hpRY3}}TNo3sZ&VSTc|gJo{}zNn#1 z?hzzm{_EJfxeqPz21D>;9Z(c#Ta|B2bI8rnuvgkS!*^c1Y*i860-2 zd{UR>H8YEFIJ`Id)*0i8W=R3XOca{MVxYS@&p3iPYp!Rf|HXBAyL@X`Abr~^!^`8zgW z4zTxK0;;d)ZE9E}73rMPwQ_sqilwNLs}QzD%W|&a2j(Y2&&&Q^vbuZnoT`G-)aJ@p zmOZ}Ej>b1Y1=kyk4%M3AeSP#5hUgFY)Z~)n_BBQ@W3Cn1q)LnliUrt@pti9>fw_t!S~n`~--Bw#gPF%}^`VQ0p6+*hHVj zVrTUFcmoJkPhsE4uY*i#;zK$RCNb^X=BTwns;NTOn=Qce*Rk?vuvXCN>nn_VS@?y} znuVOGrTusxM-3sVN|JhRDm2r1zcxUWp?Pe(Ur8nr+x}bAXAE_VBjKB|Xb+Qrm0UC+ z8?}|3=bZJ<5f79*?QH>kiZ)TWl=1w^^Tn$R!KFYSY}KYf9spU^aR#yqJsr*(e?4*uOP~DOhx8GTO0L&f0d{B?4LIgc6wD#jX`rYCSF9o z?U_H+foZNa@TyhwaS6q{uXUed`QQ`$RgRE4CXr0%jQ+*0;jHTu&&Q?co&Dv(+JL|Ma-GNL#|{z7sfuM_ws>w+He_Do zME$ibt1{KpVwK-lKL%?vmD~;4=V(1&{Rh#O)=G0kdKsE*8DFHXt zuY8@JozO|lEXVA~4-XsP4y^fv!=z=D*^xd6A00F%CWg+FH2H#y{7%UEJa7iG-%+ z^dI5zkAsFgO#tXkg**d2Zi+%pQG<7O-x2pr9xg|v5SR8RdtySMCv>;KsU&`89hm<% zrmKJ{z*eCKxKma)C7H!Oy-ZwtwIWjAJ=q#N(R|uG;Zl{IZi!NS^|u#@JvJU7u&>X> zc7>UQ(3ulG=c3>wy;&Acf7|Tw!V6i9LZE-~u8olD%SRx;a}z6q5zCHOrS{So?$DTL;!uR>M%rG6yo@%%Tl*=irUwNpLPU;?>foxG;3$v zbb;a6Ij*g{K!t(Qlv^DknRj+9c;Sw_Q@wI+$`nv%G={S)KPA6TyzQC@Kj@p2e)!dhiwp zrN2lXeq9!Sy@%MXy9zcU+cNH=a=MesurM{)yXL7hjtg3mI#E(`vRl0-E^6{0F?LOp ztiuYUGt3Kc_{6p=jLRQMt5E!kFunm2!fpLRyKChFv!h0@nyuu%O#r%F5400#F$Qrd zYJXhDtDdktuUuE~!%aJ8n6-OTpNt&DbAM&{g|F)o51^V0z7{ue z?c`xe+^sCqroQJ-w*VG?(m@vZ6gJbQj?YR@j-2X?q$rs9uD5RC?|Mxj+kuVgYWp`@ z^IDg$5@@=^Fq^L0A&(QeL;zjuA11X1{F~TAxuAotGw*@6(}=^#ie$vVf~!A&BN@F) z>1qr1!Y}fYtBQh@48s6fwQzp{8^W2Gl4nqH#w*Jq2Oz0cm6t4|&f)S8NU1M4wW{K; zTj31TuSn+}7R6HjDM2EG z0T(}!pkMcp=_e(fL`6>e@}CTl&if^b$n^wz*nVX&@2V>(=HBzr#vHlVwZk*@)0#}| zM$K>j(R_6jBOt%WCfLMW?GgJz_)o;tdpdv&TcKK=qV`lW9~HqZ9mP-|>8POu*CLQ_lbE0ok6Pd9Lq|(QBtD zEy(6;Oz^sOb>(U1k~hoAcr$;}@3GX;3lo+h~KXi3Ikvdkuh+ z)ZDzxum!qYXD|xZYxUSQ?j6TNLAo$UNriay*#qF?IB$Hu{j8k#i#rW7;p`2{D;?8k z$~oqYPV?*R9DckUtLSShd$$^FXWS zMe#k*n{)f8kDpByIzjUgJfIgra8dq)k9G2WA_EOhix1%?i|v|lH=>NRk=eOv(xe>n zGw)~Ahh{DRG@uB&D{j7@XoylxJVzugW-n2ra7oiTXZ*WUB7Y0|K!5upx1=qe z#F8p7>vuxme_RSC8U&3f^_AFQNHTYSB*upm*6hT$5#<#Y5QL12NPfO^CC`kx4AzL5 z)tb!;x$R(4o=3Db0FX)R{YBW?HYz*G-!zg-{J&i0aBHtOkP~pU!lv zLI+r%ew!JHoj}4q(ongZ5fQFgM*+1XfHd`1`v;n;2b8A@yCepnOnl-IF$-%{(hXY< ze-Ps?5hkK0NV7)Wyfrj^a$G~@_NQY)pBJ|MAU$rWr`LrG3AE>Y>c&QWrALdg=h(_Q zI15&`^>a?trU-9_!x-943hbIAly*T5Nf-=+f9KkI*_M|BQK{&g54uA7~}(a2F6Q)}0cY z$>-KDch_fB#8sr&cB$K*@d*1GT`*243;YJM4$q2ssZW?@t7($X9(3n7t1^lN0|hnc z%`VKz4XZu!m{dXO3_r(8z&E(>q&Bv1)`_o4alSMAUHO;lg+1*9?|U@_>5M3`yw}p& zQdy&?KlPh@fi_p03A?@rSqjoYZXOx)u9&UbK|f&rb} zgXm4O?_v{MPkGacgb+?3x|TV>J1Cf49evn97c`{JK@p=8|JY{kPk<+bF)%DGp=ayI z3f$%I*twv8-pXo*vdNoEevxFLoy;SO9WR{CZ(di{r{#NxRc=_K2)xJOGLl36* zehVUnQxlgvCBz8}_-Au0I1(3hufob)yrb7EIZxJ(&%fv&5ILJyPSSl2=Vc)6O+)e3l8GekcyBV+TS&C^f-SeX(_dK@O;u84UEQ>lfmYww%cGc7 z3KRQOQ!BftRt|yI;|kh4&~31}d8@pwyxu#;pBu83@X1A2cKdqt*l{mjcpE^aqwSgE;rwP zF{x{;koiI@HK@Fj-&$cJgM54xhY@G@3SWrOSuhFQtP`c)jrEFf zDgmTzu;0Wdq-7EWp&sq$9S9l}=R0+Fvcn%UPXxLOkNi2nfW)URbT@=WMQaGtR-I4V z?-W*VQ>K=#H`#f5i|r=t>^L!DC>5odq1>$%CXZcpBB0%q9vzc+J@kK-B=|N<^ZtPu zIY-?*b76aEc2y29NF&zXm6g$YS(*JuzFk^3b9c@@$F9q&_gFO2s2yQx;T?- zy{QCUp_v@b+T=%x&qyDKFUA2hDg%Dp44K*@bY14PA<7I8$p!e)5$tla2NJO0PRlZA zDCziOxjuU*l)vhayTYyS3pkfri1(MYUyl0r_N5unXiI0*_6YPg45}K06EL0D9Aio) zl@kLu8gMxfxpFq^5g$9PSkGr4r;*P+S$?lfdtpv2k<`)~PxUr)w33!5*s;H)UruwH za<(KqvUwcP6nHK;E3V^)pB$1%V<09?(b7=v?{i#Zp~RqFEjmvXY-!qV-1UpoB{(rx zw(_3eVx`SqnGC*6%>NGwj9FuwO+hzBq-GX zSZOup}{f+>+pmy&3((kRas}|sM|^(rP2yg6Yj7K z@ycP7Dea4)7SRdr$W^MJnQIsF+D7BBReBoq9r0+}n(V7FJ?5Sl48E6LHaZh%B_$A0 zC(4=s^5u@%#bQjM6Pkr|POX_v@BDYE`6?mNRLAFf45!Q_zn?BAQy)sU06)CY^BPZw zFR|?s$v!&D8yc=!{G)cI^?8raDPAPlU0HXlp)G%b+cS{kYNxxn6q@ipi+w z1LlLpuVFf}@Ww)sLFoy!Vvdf9u7KXmgfpDNaK?g^<4jnfzO1C$U= z(avaj#+e&C{YBmPOc&nrI?j4BZx{uv%IgW)y;Yj%F{cKvJ;El?WQwf3VtM=yq#36i zNkOKfHz82|#fKf7#|GpR39-k0BSZujz0t2YR{o0o^(yE9v~zuRyE*R@zS`_*DJoe5 zSN*a4=kAOA(yF=rS)KIrO*_7Ao{Dv)9{h^Wr<)WRHSM19(K#3NBY_u_c9cEQKRj7V z1O2Nj+xY8mpC@sz^rRH8j&oAV4P4AzSe4TA)z9)+#4!e4cl&6);;@2S&UPAvtQyZh zEovtVWFkMSg6kw(+>UDotZATU@m3I#&4rasFDZYE2qTp6P)R4{pI=vRE=Z?EgzBGv znf&>*dYtvdPlory7so%fEt?RF$-CQe%dQM)F<*H2v5uyg3ERrWC(lJEa3e;BPa~?E zQ?q$#cd*O)m%OA5T~3nc^Sjh{rDtzGI7ro!x2DYUe`u`J`@jP2sBF=oX$$>b@U<7*UKWG_t! z8J~e8dK|#n1J$uIhT_b$G7)Fbt%SO*W2mrb>84zAZ$aYf$<(Y4pR)-uTx;ieN^lR_ z@O>ZqnQAV9+j8@YX|igBc;i}(>R?){63@AQJ7>I7A8osQgae)hv%~jUm1zrQ(c`@U z`kcyz&mZr6*koA!EhG9NefA(MEv{`Fhj^fj0!~JF273!uoVS>k&BBsl@SSJQ#He`f z+woi(d%O%P!_RWVG6&M*g_Y{~#}B`MzKZ9Ic7$NO{ronGw4+dOErY;|oa6Ds<{&Yb zNY~Dx6fq^>&Ep%$hH6aUeQ3ESrRT@-fm6oIt~Xl_3C;XKB-3UGNg-0}AG9SUopAeE zK1oBp=A2ZMIiHGEe_kt=5Mivs>lI71vguMdIfY+S{qKJ=oMG~do%f#E!L^eg5C)s}eGF|6xKJzV_bgoDJ zh~&#;=3gDeLL+O5V^Sj_*5Q!(^&C=`cS@y|96)cqvoalY9*#+(O-$n%^{9Kt;)s!W zc~DbOPk^pkT)E(Ev6|C7f_nw)l;_+-^%oT?(k_XUeP@(RBuub(xEvP}7I1S^AWBd_A;dHAS# zS=UZP%3O}~{|%DcFx3a9bsLY})cMTL45U6;7AVN&3*YF;Di4kYDS=54_gc7|oE82r`I8!5^_-w{yiRx+c5$Jq~@}sRul3QexPyGC}T%w7N zc3pwc)_6It?UR+>+?bc*;5xlP)KdT%G(k!4KXf=n##)3V=0!c`PkS%)t3VQ%o6oTY*7g>b-5tIVuR^UfzV43T8s z=6GlP(%mmZSaXLYQLKKMYC%N~n4K{yE6A#v;EXC`I56S5X2F#8>fHDGbR6zjn2iDl+5I zd`2C5--ioNthuA~E=GrV-asMZt`6ego4WGCLhf>O-^|MJlhbQXTX1RMN8%}@>zP62&IXxbcuk1R((#=)Qs5#-Y?p9YpIZby*ej;2x)5dqdo)GB zUJ4{YaVnF}$Y?lkO9N(ck3+?y>!Mb+K{}6P1#V;Y#%CN=&d|-3%cN5lpuU0~c=sSa zX)G|q5+Z1H`S8t{Ln3X2gu91@&9#;0Z-oh|t)Rc2M}c{|NY48y?hJ>r1?U-I$e)mK zs1F7X(-p~Z0MrjIMdndUuqS9KKBT>b6;hK=LSZzjOSsH6x|<+4=r*tCxdm?lcqQz?miC#!0InWlHVV}Kh@zIs(!T2jpq4#+ zO8{u+Xsy2;2T3|gmmmeA>`6b<2?2IfSbgQ5C)1d!nkEOzdaq7j>r+coOpBLnL|$HW$qv zsP=y*l=*^|D43B9brvv5%svw5L<9#E*NMw z+^##I#oh!XOMKQ>NtY4nEAuWA_oW&d5CK_%6MB*f)xeTmVT)M zR45YG0gj_nP_2b&j>nA06I6#=W@XYhM z7Lg3o7nToI-1evG_-9jWkcOjA1yPNypA=g&iUViqfplzJF*Dpc+%$uH^(_LN(fhv; zUTK0v=8 z5fA~9*O`+N;fKEwdtRGs{)QHzsC$>*4>-ukg@)SAVom4L)xmV=H+UNF4tB;PZv%va zz+N6eL|V)*U;J10UHe6Frblm-A#YvKz-nJY^Ip!tT3Sg-pH^kR8!y-^C|nXkc`zEtoEc1c=9E)559NkI6C z#aRbXQG#>rZbL*#I*d%SflzN+qc=FGTB0t2Ea5G0HUDBuhuZI7aX0Vb9^?V2sd4|Xrl;8yYa~f?& z4s~f?^Rrr>=0}qL9`YPLDy%)0i=gBYzrHnwa+1Q|(_hmp@{RsH-qsAlpUomz= z54e1#ozc_-i0*q@E?C7)*$YC@VFSzp+?SrZt;en}N;#3Z1KHx8nfDCmuD@8lc+-lt zMq@%3kA^@HO?(SV8E!Kq!-8E8d=+|s|9;o2zjTirS(v`KyPHV0`7c%V82eYm*wA`Y z1KNOLu?Zw8PscayPjkg$mamB;)YpGqg(QB*FCK81!c&*vjK-}aQHglD(!kafDn>r! zXVMW;sg&v0z@kzt_3x0scE}7wa{Dy>kpGnQ6OvqDZ+Z#*A^eQy|HMe}l;ZAy^xtxO zeMwpOUyl!fOaJ~diCWqa*sbnA<&AtJ_!{zm#{woTxT5#L7LXe-Px|l3Bp&=T9Fid< zKSYb7M_xw=U$lnYN$5QD<6#|x1bqP-xn8H!&eoVfp)x^xs28094|obTk=ytgZWcIZ zNc03V{3JM*Z?zWw=Wj#MBc<~GU$m0oc>|&T3zSAsKCmv*XjgcpN=?>>Pe9-!#4XN( z3lE$RU^Bu8-pxWjs)!wY1PGhT9Ls;GZm|lvj<>+}^d_y5m8N~aPn&)kog_cD6_x^k#SxTw@<_}az6 zhhJ_54U~@^9@UKeB*=TJAyIfentvx*o;s4XY*}&}!DRU#=6oEYhEI&wjDoA|jYLxp zV$SzFl^Fb;bqN2DC;dmh#gT?S8*+Y#_ znfB)4S6T_L!w!EKnQ3by*NTxM>C<}Y*3U8p%fl+Q*9Vh(@M}K=W0ZVfZWreF-s_K) z84Zg#UDrK!#m9eN!H$ogT{h$#5=zlZEb${{{ck)x>DLP`8f!UkMMm#sB~S literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-81079508de.jpeg b/docs/specs/management-command-class-specification/assets/img-81079508de.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0aeba46f4bcff2a54999ec8541eda7149699abf9 GIT binary patch literal 66164 zcmeFZhgXx!w?CW$0YV4~1nC_@06{`8iUC3|CN!l=2N94CDtbb1(nALg9kJ1*s~}B6 zkuFGYA_}MoDq?x#x%ZxP?s~oJeE)#o!-6&QOxUw$?>)2kd}dF6&iq^kAdK`3^#DK+ z0N_UZ0sPzsAn_rt7cT>V06G8waFX_F7Xa6CyX4{yaO!4f4uwe zHUt1b4+4Ye;4l^tm=OeE0D{1D^Z*EwjX{_lD}oBqk|#HESY8TYtD6nCrfP zz7wD}m{&vY>*-2GBY7a_=TdKkxAC7l+IoFrr(f@+1N`o_{e8|)Yh?nm@z$DOufTY& zFqD^FS4-wXtTS~th2t+<3@2BApz3S-e)26hD2Y?`p^W^a-zUxdTpxnf>poA6{)4t$ z)>r!S6pwpx!^^mYX9jl{R@5xIMlwVlRV4#BVvM7z5i_~K*?5Q|_mkgp!F&`jmd2@b zNATJy2>k8nDRCzQ;sp>>a%Pa$>eKcV4_96cqb zwEtCZROmP{!EHzJmllt2t$GV8A1RLu;kx;huk*l`{#9&DYLqKR)7M{k#V{f}l3!pt zB&5RCCd`z^*I~NOY|AyeDx7dumuQv0CH;SxXV-!)L-}1j=FHBhh6D>7!p0DzaXY)zIx; z&&^Yj^hNpeN!nFX;f|u085qU5I9%d66shNXn|&c+e_Q82Z0w&SkA6s_b3W6@p))FK z{KAp)Pr&X?PANt{O1|nHh#D?j-xm_}uS8;eX~Ms{YV=EqcD?#-x&oFTlj?WRqi;7{ zYJj^mo5&%%Jw}j};h%uN*MWZ+(*K%|H1XfNZ|q!v5Yii$bwq#Aw0s|wfjM{~3||FtKLPrh z=LsDT^S>Ape2kz`lotiQTVPAI*<9O#Xy?%g&}*()=xw@h+_+BBwB^3&UDCK?*5YN& z=MNS}#VOxtCIHIA!TiW{{>bilDC4i868r535r@-COh``DxU$=e&)=oUpqJltNaiao2ijwR8i_>ItL3*BF z+!7T#>2=7YlOSh6{|`mM3N^TWj~rK7r%M9kA3YeBru{SN+K+|T{BQLP&mBz;A9dTJkHAB$(08C6|QNCNGsBHQr zPDvdA+cI~{T(@hyJ`c<7^4!wT#gW`6U*|hkGiWVG;$r1rr&<)n0+s2N7<^9{zB_r# z^TqCKjTb@EDF;o5_Zq*ewoVz{624v+gw9C14GX{qN~gMY_HHr6ML!>%&hEeP_8^&E zEkLcsUTR=)g1>7@-K*wKn4}awtV%Ue-yd8EO4#mECR}kLO--!u=Z=hMjQoh?9&)L4 zMYY}_AVEhWzyyXh%Eze(W$bO4U(H@kak!tm#8+Kp!k9<2YNa#s>3VF^OSiYIy)MCp z!-vL=K7Z}gUa4|##ir&1q* l)_tf$>qE_fk3an@L7;ta}5RzE-QPR~e>q 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

    X#A4P!AqI5OdVLu49CUopSTT= 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-841ee8d357.png b/docs/specs/management-command-class-specification/assets/img-841ee8d357.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a1d748a9f53386de58f727f6319628dcef7307 GIT binary patch literal 5585 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-87cfd2782b.png b/docs/specs/management-command-class-specification/assets/img-87cfd2782b.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c022670e22453d905748b4eb787b0df2ea7c74 GIT binary patch literal 35665 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 LbX1F#Egt?C&Yen6 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-8d4107a922.png b/docs/specs/management-command-class-specification/assets/img-8d4107a922.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9dc62c660ed5a2e392a64145226e098e6851d7 GIT binary patch literal 1909 zcmaJ?cTkfF77s;0nm`c2&;@~&B4rW$h^PS}2!W+YSPX<_*bxL=`H-rFH9%O9CI?3- z3oAuK2_P*91cIRjjOQ&zibkYpKANaB1Dn0Mxw*MN?#;aSn>Vk`dw;xNrU%AJPWres z3`~3`q$us{_kq4*b5ippf0ovh$_if4w1?{ek zQzq@eJDFOQ2#;eoWH0;b8DqPn`Io*)k`CpW*xxPImVPGUn2NDHB3cEG=~=$kwvuAM z)Iz0gBkSScm6iW~U6j`&bJOV2s_jzO+SAxmoYGCFFdy66vVMExFamCLqPwsx)(GHx zf`2@OsF%5Ze`{%NgkCLNm9-sQ_9h*^cact~AK+9Sb@M9h??{NIE=^YWhe~$t z?(S}EYzPDbxcpEThsWbVP=t?4OHsqog@bSw7R^Ox_W2HiXVr=QIt^z{jOf6K7K5AvD@)9oL*H` zMJAKC*52INUKdIFRSW~#Zh95noqqkAIQ!y-5+8>~qg9~sDYu}Y-$ruIJR2S!9vC3* z?Nro=Q$`xw+rNHYnf@@>SMqAMC%(0(XC{<2u(dLMhLU7z&}4HXF%c-oxw)|${5z=4 z^b|pYD4j;5)z{ZAEQIOCd*;O{MIVN4`vlNIwltkcBs$&K)Nc+Mvp^z~C)QVlOKY7f z$Hm5e$wr)^HjhnCx{t{7X5gJ5=Kp2o&Fs`imB2_ zug0>7*>e-%H#XZX<*2Jwu^$SB5)%`{56xSP3CxqW_)|>`#syfO9nY26*jh@VP>PG+ z>H=$Xa{;FLqd7?Pv|&}VyGH;IO>1#=xn3!HceiTodF}rFt0$W@M6!O_+udEap!I|p zybTW#2j`GTWLpgLk=zfk4=uMy7j8zo z(Qs7c0ATp7TZI;{r>AG}>D8%@k)@>Y=Y5k)KT|YH?g(}t$d|O2x6Hfv`4ZCGDmZtn5tD>Fn-|yj$*h*Kv*qQSk~h8{~S|G zfKdy1W*IU)|0iuC1`MtIcm0Gpn4O(%Vq&tCJG;DG_unmNcR~#g=Dq$i4M0H8KeQ%( zh5USdk3j>x^}i!CH5Qka3b=>T7&SE~D<%!nO=PZ*ksWlIRd5UY@4?8(NV9;R<>lq# zk`kQ&(k40I{isVXAucX1D(c9A3-vZw84(_SduvrA#^~H8*SVxRBbcW8tCW?M)h%hL zlei>Eu~#s{Vw!-=oEKRb6&00ewNzJ7H9JF$bd5l$=G3tbb*Zde5AOjrt%+7K1yo^l zyX+JI05SWWF-1jgd3+|5$-1v4DJl6uAv6dz9^80m_j7$;Utok%i-`p3ePTkwX^}`< z)-xIKW{qNBu);pm<@3jXKJM;5`$uo>l_4Pg!z42zDvHG^C@5I8J!%t^knm%UNAT;L zh%?ifj*rX&d*3gdfTRlZH3k=@0p@Y1QhwpfnHg7Z)Lc(}$9I|pS?qc9V_)!%Lqm?X zTK6RWL4J>g1voQQnT;q8>*d zo5hcF;n%IfYE?KTg1K$9EhTs5MypzeH@diS*`ps#-L4*1zhz&JG(U{2~7xy&b z36%usPa7F!onOTTQEk(S9MX} ifC6}nm%fmwrVau=;_DjlgF8YVg`piW4viP_#6JPdI=Kq~ literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-9d7166209e.png b/docs/specs/management-command-class-specification/assets/img-9d7166209e.png new file mode 100644 index 0000000000000000000000000000000000000000..a9debf9699067199c91f8ab19f9429a84baf035a GIT binary patch literal 5566 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-c30a527f05.png b/docs/specs/management-command-class-specification/assets/img-c30a527f05.png new file mode 100644 index 0000000000000000000000000000000000000000..2edbf3697cc386e49ef180f2e1e17e4b6cf49573 GIT binary patch literal 5986 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 QZvX%Q07*qoM6N<$f-Rq=bpQYW literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-c40eec3abf.png b/docs/specs/management-command-class-specification/assets/img-c40eec3abf.png new file mode 100644 index 0000000000000000000000000000000000000000..bc877b6b7a7be61baa5a806cfcd67c3ad703dd04 GIT binary patch literal 6525 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 literal 0 HcmV?d00001 diff --git a/docs/specs/management-command-class-specification/assets/img-cc66c4e9cc.png b/docs/specs/management-command-class-specification/assets/img-cc66c4e9cc.png new file mode 100644 index 0000000000000000000000000000000000000000..09d769c3829751d77b2acbcade030ac0c9aeee61 GIT binary patch literal 2473 zcmZ`*c{tnI8n!pd5Ji-RruMyqQAtu#ephg5=Sg~1+8FZC{hha#ftf!K-`~YTX;IR zy1l)YD@C^hOfXdkXFcD9wT&;9U{xr&P@~d{v_SY+}apK;2QvP+w{Yd1y=H}+- z7t?pQg}nt@3p@YNJDuW~w$;o{5v?t7x!el-*hV+6rQF{p-vX_~uCq#2Hj$$+Zi;y8 zm&zozOrp)ZCy*bThwOSo3JogM(&^P;!zg) z10{ySD?1xe@$m#F`QYCsVe`Ky3JA6UzS7|YbZl{~x}m#*>gvYF$G!SpITz@{R}&K{+0>x4hzJjGSpd#1 zV}35~=cJ?{uzI7mmMj2hs-neWu^^znZfkbpHrJg!;u0;a^>R-2xlmZwmZmVuvs z0xhEM6f38<_2lN|_z2{SbW&|ii4F^H?pLpgwIPK>*4&4doP_Q ziy{OkB`1GWdz*9cd<~Ons0~%KL=8O_;+s$Kpa}B%&Snf@W^HXP8lNL}bl76CIoMGjo!#FS z4L&CJZq@y|s?#w!U@_X~#y!xfVg*_44=A#g(|xVP%J+<0_x1G^0es>;K=<}hyQ&Zi zkLj?__SdjIQY*$(P4@b(C?VeT3rD%*B1(OVm3~(aJHK_*?cFB zChvr#MtLV%1rdp{kiv@sV&66EVb2Ck;-g4JuwWbO;n98VDu<*vb}w>lNo%2SnQxDm zy0Iaz8H9Q-w9-2Sc_)o5(0X6;L`r$1B>D4fAgW7P9<9{vMj|VvN@s)%R>5YOa~PqV zjIup$!xYK4Pa;D|bgVFhfVv4Q z0Wd%H|E$DGVsHL8Y;jRgW)n~nW|Jy96Rp{V1)`)F^Cf__jx+MTEWF>*F*p<-)~=Zq(&A;V?m1c-e9H!0egF!<;qbp#RNOvV9xedR4LB$0 z8{ctpbcE9|-xpmia~gS_RGgHQv=y(%0}{H|w}tb@ zepQ&d6KD^Nwg>CEU;DvRVPLdk0aI#@?R)jAi+QLXN2YHnSk(?$Bj3?SfkC6=h{fgE~_;qobqEDn<~gT3C%QucxPnYG@c4 zV>LCk@qM37J6V03&kqsLNk1vVzWAzRP zZFy?+eK67kn2BFrg}#LP2N>*!xd$XybUU=bJoCJn=FdZg> zPM74J1ZXmwIj-xnDn8zgnMG8fu~UG;Ih3~%ZW`)6G7#ZYb-o|s93*dWE_1R#^-LM` z**Vi6Pwt1Zh7*t@siwH)HT4F@xXdNf>LOzx!n?iw**PrcKKJ&D?urR)pI-UR3+M;z z1o76zsT4TE@h|~n_@{}bxGD3LSqj>yWFX?+^73+Bc`1P+2$C5QgDF*%lHxljtCsdKn%s?Wrr;4UUq70;NSR@$@bmg!=-+jGnRp g1nhYWREido!jvVIm{JHasSwJNeVwvr4I#@ICCQ$IY*Dr__AT2CWtSz( z*iH6jVr*j>W}JJd?>W!8o^!7Ad(I!vAFjE~eCA%>%j^Amz3+Ph)KnCX9zJsz0)ZS= zynpWz1hOw30->`xxDUKzDpyJeUJgCGujdSbFxS%l=pqG~&q5#)@{0FlHDAQfCl~~C z$$2kMUvq!^dbvpTxPu}$k3|2&*B1hc9KvPf4#To4?;UrSc$A`g_(^2#l|{Sn_E)2Q zSWX8=$MyQWG%DcEF|{3EqR5owOJlB;H1rndhvbJej5B>C!iSy7np!$8>oF3@OwYOX zlOoRK=e?;}72c%Wg|6XsF0i!MvWZ06N^gf%lflbp9}-yb9Xi5(@XeDXMKS4pA=kkR`*_JilXUW;g6AP^ivt(7I;Zxm%ir(1nK zYttS)b23iH#i1Py8x%eB^JMoCFr1nxkGXgpW&Rmf0SAq|WuBF>BWpyPU(`aWKd{Ut zKvloY&t!USjB24VT%GS7Si5G0HQpVp%gM`((1-~n4Kk%isUp>)v)HGLNeVrO=ug&> zVhFN5yThc-Z!}>q%xA&We>`(}o%BLduXVN5YqX>6)bC`9j#nr?WLG}!$M4e z%koG8&p_@Wu*IZ$s{>)*DO9R`9ocVrJID8E4Se_QKH{)OZhuxUDZLxLEm7<@S?*nP zCBo~Mx6tl{^_tIY9VxwAQHmRDoJiBFF5xnsukhr%Sd(#vMV9}K9U(qy)nsY8s`X;0 z+@c)Amk>x&%WEs-r2myFT>KAm&qgZ~`1Z&7*A~e67&g4Qv_<*tI|+g(fP;J#z87GY zZ)Mu^^@tL5e4E)0LehR@8#~|| z){l0mrDSkwFce|`e6O;5O6)t}qvSZ-nYupW>ChT03f9WS%{@|V(`%WCypVb7Nl=+w zpNZqIvir#A&o%!D$HGsYZ-#R_j@2IGppOr{$>n(Aj{G4@-nK+ItgKN|B>3aUkJS_s z4Lc zIqFLIx5{p>y7d!FEghe`4U>Xin^A%}sB;F`XK4IOlI3=&9pvl5FWYv5B}b1Qt=e90 z3A?r2h@}i-14zJU-;i5t;|*catU>s1j;1CiW1XqWx>$L7b7bk7jS1xzV>Bya|LxQ= z=jpZ#jr0-J4kcANT86UP#RA{X)7_zN5fMdJzZQlofD=_d-RgH)!dJR$c)`Y^=@@aj z$DioINzBc)5jmx5mikybdF5_fWxE47*o~G?5+*ZbsS>)RGjD(KCm~8~`_DR5hL=!l z-gc#{HrP|Or{h>l+3YV3X@2vjkW=6GQE1DupeS~_{ch03-_O@x8hdhBd;c8UG4vB9l)A;%JtcO7W-Ed^IgQQBzw%_RZCf zQQ&sxE1`b(V=}@;`xRhb6A>s1sj>0x>y0Iw7i0d5>BrZhlFzMLqJ*-vv&myYFg`s+ zMndm#G(uux`*;_k%*lLZs@2!m*XcyF0te%DyadAx`Mjz zg$270FV|YTT(CS+<=LByfF0l2*!Z@cpqrSNBLA4eJkyGOgDC=E}6CE}S|!0`il# zagejb!BW-jY~#lEqwD4oY=YYNA2^ME_xtrr9gUF6^FBZE@f1g*gtPnySbA$umQG8Y zOLXwP6(?8ZVhv+%<#KbBkby7)6AXrzv!wvUY|o=I!7AUCV7`(w(m#2u54)w_4T4R( zu@b^ULIOz9LI$qXZFj{O4(h;564Uut?06zD5BP(kw)2lTDaX1*)0+}n4qf7?BF|;T zi919^90v9X+L)JO$i})5a2AEM4CGY^4Gs>zuTuzshfB)!+XI?~5_h(z;hRmWV>WaJ z7+uuTSl#>Iqd)xfz2~dRe(!h;tv*t`y|`1GAmC|0Z`<0 z6uA_&Rq8zTbF&b>b)AF$G!CEl>Y%A{@lQ?s1|T zR5QG`=1V7kUYgaf;JetQG$wKcdgcsy5{A0;!y3>Xj?*~Q%x8ZQ^v*8@sE}U41VE2O zKPq&EL+K z$hfWaFrgDwMF<#xA=j3aVO4zom?I7X7cM9jVEAN2L<#_|Nl4_&K+FKbQr7Y9C7An0 z+Ceal<~#YA;Qf57J4<1x?MB|PKOBS)^PBv3u3NUfr9wUb+^mareN6FsueT0@Jy)-Asz(PQ)I&ab^5pvsz%j(_ z240is&awX>gTl24>|94~hwpd|kULASATWj|>(ZWUjXHIxG6Bj6JHqSyuf|IEl?em~ z-ThaFy}4Yv@Wfg&0hfJ}05h)C4J8$1WBJEI#76)-dlzC&0sKO{mKF zd>Y5@=P>k59diPueA@ZKcYf;0<6pcK@4b2lKv+2xz<40OD2Qakh-(+frv|bK){>b{ zUAfppevjr8Hk}(CeUgufZ*sysK|-FLr@XP+@@0{^iiRab_K;5u1rh6p0Qmzh@t!a4 zRgs4`1##t)jm5&3Uej|YqNtk!iC#PzimoRnTiyhaCRy-O5J?DOIzo4+OBHSeXcNGs zbJMDdOKv6uO^CzvCFlO2d}&z|(-qHF!%yaDu$vNq^| zU8+CpG!_yT#@<92JZLcpxpTLedY467vli?IKrYPtNzM$yB>3gam#uN)VF1fQLz~H8 z+?ObT!o zide~;{-uRnFaf?U?l2OJpb7?;esdvcyD=SrXjz=Wh1J3E_Jbu4B{^ohY8TFm+3I4w zDQOSm_*SFCPV@sL((A+mTm@Ln-yAKP@10!(e2?1!89m|kVlE@y?3`fma1Z%mWuD0XXpDVqWd4$iZV3$}GH9{`Z(Wxtg%c*)xa_ z&|H8;%)8ECo@|k;SA|nnrxQ`eUbre=6GDp~-*jetj7UM$s9etP>*r<|57NyF%WNUzXAgc!eK*(&I!!Zi(raaVZ@ue>O(~TflsQ@kvCBiNxBlUKjSr%UX zhc_SdTrHo3+8&2STT(XO$eu7xVMg%F}d$@*-*P6Dkc>1jM;nKZ{ z8*9S{Ay@6Yj%X`K)mirLN6B@-UPs*>g_FG+ZusTx8u3I zmQ%A`>2*s0E%Xa5LT*yWS#_b0Pd!^0l8{KKqXEWDH@U8cTnItq>vcL1SKqeFwOLB! zyU8DsJ2ICN8AhVBU<@E-=Tkr5_0N;3eT)p@rl(v#GG;n~R_27NcC(y<5cdDn&XZxK zCm76_bl~I8Va|amN=%Bq3;TzFFWs_t>evyFDf+&o`5{0nz@wzaGV#3a=ukU^*ydlNWA6#2q3u3^i*c6r{>k30^?0C+%v++WNH_yf0X}UC z`qEYN%Aw(6Vi$1HqV0)r=#G?ho_F@40difUf}rfqjSF)|p{g1sL^yed*Kr#Ni=Du6 z)Mg8UI>wHD0sNZyVk|%bid+SI`k*2!FLo;inuOuQA@Ux}n$YN=01nE<6{!mk?UtJS zaukiw*jJ2sT>>D4RXS11Z2_R6oLD%CAJfh}HlA2FEs4=2G&pX9;Lk--2;v~#K!HS# z`mujibSq+_vwW^s8Wesw;T#sOl8sSKdq#)O%wT2*FGo z{KaAtAYHLRnc0Wir<56Wv7xW6C=-5?PTip)A)p{Vd~gZH+OItXOMX2j>(!47^WDI2 zPl-EVDJAiXfG>ACw@a@BHKTM44iq!s-G(<{q0zsolhKH%i->x)M^|_MOJx)R&ChZ?oYdB2F8NPxMAXX%j{X7&ea! zay7+PY|hEO#qH$qdoRUv=8kQFfXy{5d$fu$GmvnX*_?>TX~ggnS~~b*zOuW6vc5sH zbfNwqYF8rl#-TAlq4XS4S2hroIh}yY3z~B$?Y%)T;%cc+Vv#^xABY6$^G3Q z`p8ZT*tG#0!6DO3K@tnP>P;k800Ov)aax)ztRqeyrP%tTwJmohWY5nTaSvx_H1Xc*f*w zTMy1YnbESK(?uO7DeW{x2$A;5r9rpW*LCKY}L1Ajs5Q@@^l3wdGJy8o1 z9$q%6LJ!Nz0JfR`%9O5+sQy;r6yv^6KQK!SPaFOn{o{evhz@YVsM!4wyjj zSEB=sCsvgW?dd7P1OfJO{u_w$=d(7sRVB|x?~DsLkGjqH?trw9U^5{I$Zi8>u>$I+a*D7d3eW)WwZcSc?(n6EvJLx+n{UI2 zB|*d#{Akh^&V6kDo)R42{u1f;W^h*#($Mrl+#Lby7XbZ0__VrX2 z&%L=;3un;Ynoa!4;WoGwApwDWWz~iIZ=@r?%mYEpE#+$4{z>}8deAW7R1;x<9eRs^ zKCcTMVVbw?lzUJe{{j>WWzTJh9?dnbYF3>BElD7R+rCA7cMAY5;=osbTg0AIsgwTG z!rU?*YnjAXklRVyUDwa2o!RaG`k>w+|7l%6ezP}bMg~a$nJzMm`DKAh;QOfU+HeBaO4g_l zk8~{x+9H$VlKCgUmRj}xa=!HWjL{e2$v>y|R%mUD>|)YId1T!zDfsH<`d(lmFiuKT#rNNUU@*z*6?siys0t+eM3|y;dy>??9Ww9X@Y%0 zIRj8M{KAxDX`0f3brBpO2HV=XZ|IHCbQJUZ^Z$I-0!D zc(a|19C&+geoSbyyxC%+^GScVs6I-tB|anddU2GHr^Ce-$*)GP@>3-P=fekI>4kJA z?B`8Z6wx?`^FITet6@q==iyBLAu4=w5Si4l)C4&fdpd7*_K;FyoOalNW5e-+rP{6MdZ z<mo*4ia3dzsct2;!V3e8yg_a6J3 zA8=`=EY(&GIkPKZn)!b|=6)i!yWZuY+T$Ov@n$x_VBnFp63l#^gzVxMV zQ@cNP)$^4Ua7bjPj1TWCZfX7ckz_=25>qN=IpTa7&nY=EzX%#kv{X(@!zIr5Ih?1@ z?YL;Z_twS^mkQx5DBRlJu^(s(Ocg7>`uHG5-*#(uP=vrJD5`OL45?7Vl zV}L%-Fm$(JWz(NLPv9Fmm>6g%Gkq4aQ8&QU8gsp&7kNO9JEC=taMSlR4V?1V?wA}z zOuk&6Nj9qbi&30;7}Op{`R~WA(~fxnMm?)0Q+F}S0S7I@u5&c+Cu}j&FfYv#sa}$# zUopPU>taQ@sW4J~$+)HehH_RqR@GqbHTEJoqJvvb)mj zc~mRD(o0#FAJ1ZOEoYoK_L!8@(N|Kh})Ox-*8)(z~ zj^;2xDfzW>)R8$}I*ueI`Rd|hgG`;B7e>q}f8LF7(rq&QT~GOA%DtaC1ah;SV{hGa z%Li!N6f=u9{=QC;U_x_Uep!Lb^J{p?uyDO)95}Zepp_YAaWwu>x_5LO|5b;E`H-58 zk9Q9p2 zhZ~gtEh0|_=RX3D5<#(o67CXrcR)6Pg7QdlCMIW1dR4e@8Gt14xm`mBAxPmBh})j7 zV1*nL)`kDS1kP#)InqnX?o^fFGxkrTI=@@%bn&#K$8C}M^i`{{c$mqRVcQJL1+6e{ z85MSdKkaZ9`|}nKOw86>Da*nXOu7q>Z9$kp399-^p4@hGY#yNk3$YHhL0&z!MVKIH zPnHaic)z~q+Z=V)72o&f1RGx7WW!jOE(TY0yh_)Vq%qTE>w2bOG;#SlxAdRO>Y4}8 z2qZ1Q%`I?=_cRRUf9EnLPYv3w@*NQ@g{K&Ii4WMWu4kRHmA;Cof_$zFYp85~?5_N- zxH?1U@FmqL)w)>@TyKN$oba=%ibg%&;zsprdEO*ic0`{*6Fa=qNE!}Z`ADnWkK6os zRg9znA)!i-*rX*L6U(E+{>>O_n;6$#fSFINR=V64{HRIlq%$z@ZcH1MP~8@!@D)!f zeEBuu~03y@;u{egsx}Vv( z4`&6|)6*Rs2?ZprgtO513{AuHYyHm7xLX8!8Bs;hH67?5id_r_lPR6W(;>cU&<(l9y9K! zAxqN}7*(s#4peK4t1)4rSaq0o|EJVc#GyhXc4s)*S}kGARYpay;xL&avL;{_(_UV% z!`w)fI@4g?R*-s>FLBk+sHM9zX*SQTojoumlrk~e!4SY4GEdLm zlve4~XgLmOqJ`Zqdyh3-PASGx0KUCXO!8kY;7&(*%61T~u!Q;pn) zBR^&Plwa>hV?wXL%_t(Rm{6Fr6Q3uBuO>VEJc#%9E%rQB;#aJZ0LVn<`*=-HYszT92AKR)jCR=V%Nq?u+P z8RubsL#dbf$n+6Zdg^zwnkr!8-wV8lUW$Flpft5?>EB8>5-4uBB%ElhKGDJvZbUZ8 z7Sa58nA(ZcX|V_v3XBqRp$sDB`lDi_GAe9yI9o}Fae%Vc$hoWZS`c%!uKS0*t~CA#ioh|BuwK;V>S@pAHhg7o%)X%3gU z1}0Bcey}BKK#p8p>~;9!klkL?HRsLZ%MiU<0TwzhvTTMGoF`>Q8wZj+)Z zu_2FIAGw^|BUDcb4VW-XdSv8fhy_Z=_-f!|g zNaJBo*SCbYA+I6Vw`t>==)&b)u(_}3Zr`M>QcxyeAAZ3VMGT^ceBLEpTYNvj-I?9l zaO;Nv&JlNaBSXVkuHA(TfI?E~OXF-?^q@w7-Xf4+iL|=Nyeq#>g4K@f$}c1h{-k#0 zfGR-#7mT~|>;LaTId8e>sg&$gJjz8s>R4FM7@<+1ML%#3n#Q)2MDnDt9 zmq0=wh3vDFUT#HKx$?X(HC|FTE7m(jU`LCB-u7%AIi4u$XCX+t76mjjBSWh;?QYcE zK48e$Y}PzXWQ{xmVS3e5ajL$bAaAoOt}qB?x^VQ^4PaEOl1J6#VSaATiKm7b!1z>g zz(;;S<;fOC-Z_MW+O6prnUobrNfzC8bZ$yXiF?#^(B@%~F1G)H1qPg`R_gkh)=TY4tmKs*Z>|oHKcf;MN~FsRu8+^4T!%eseDMGsT{Tu%Gp>b!y2F zHTJ!Q|DG<#%)hTHGo*CPZ*4AMcc_Wf)pVnWCm>3+Km(@a*TYM;*j4c3%WrXu^C4W^ z*E~lm-Pebl+xz--bu<`!IzgDyti_+$s)K`3K`TQL1KO$f>k$Whmj8Zs69+wgdLtQ5 zP8KpKc`jiDnPJ=8(!mdo9*Lsf+&LV$^C?99F#b^dVf`%UeJT zx3=~*@e$;<+n#H`|0$7y{Jikbd2~s_d*1|n?KZggM%xddb3WxjyuSKhN0tnvn_;P!VOW78)`lyJYt*tF*If;-5ArHUoo7noc68z|pDz|9Yh`+kEN51mu<1TUW zRk#t}W=saI$#2&{etJ(RvFa`a@z{qyh~ZraT2qIc_DD+jji70fs_yLw2a4ub1mK#q zY`H46*FI5j1?>|7v^^wX4xQ8D-3o@#A@Yk~yp6zblh}T&VJYbdR8I9Uro{ z&R5fSv(XM~CD~yEqJ)wWt%f6F0TKsj7f4 z`PBCm9omvMA5rqMYn)HI_{iOFhA~emCP4GwkE>A+O`6q8_oXvhE^BnuHRIBeUHu_{ zR&)|7R^l;uq4F~1pHnH7y4bq}0V4}O%FNm8-+R+NhjFDU;Zr*2@nnvkf@mST{|AE! zEifmBbU(OjJnwY9U^rYXVeVVdpN%wn!l2Duo;R-l-Q^dSQZ+1lk$3Th%ujnlDfuU8 zyZHZWyO>h`({?#L5dYuXE;8Ktj19Qf!se-=+CDf}x3E;Q)luY=hMr4#mCp%MHUoaT z_~Ub?$i)KyXc*f4U$zQNn0Y?k94%;xP`-o(&&n9>-)Y~^><%>+8d=2>NuyC8(930;M|uV@J`Tn>CE7;!^cMa3N(?@ zEH^_Ir!f;Mn9rWog=YSpRop+cx#_}Al+h={=6uYrkhp|$k*qVr2j?sQ*gU|NODWsQ zIcG`|Eo@zQzH5n12CW7z6r{R_%RI}&|41Bg9{5!OtPTmfb!FJC)dx>ReXz=v@!3)B|90D@ae>2Y1Z{reyM=z!a}SL?tn z5v=FBz00A$CCs}Hh*^yxKukJihdqf^0bBWh%MM*qENG$x0B%kLDnFHMJR{_H0DL0? zOUs%8jua$@&>mYr52``j?n6<3`8>m98n7_A&>lB-hT-Pb;6aZrjG3U z%&fq*_w`H*zRI#VVQ`M@_9_p(B`w3dB_nPqsgFDia z@>ws0LPsi-?bVQVMaysS#yIA^LZwxN=?{2Jnav*SYc~1ZR7asu%1Ywp)9Np%(=DeC zJ(Z8}zyIF)dF2No>dzDM#oabWelPDcOGs5wj4w_eRo8_oy#^MP)Wuq84wFMHx)we8 zQe~Z=x``AML+mYYWU^xz71ZTV$z9f!Th2~AO!A~LHDD0yCrI-rJYR2`1!EO2Xqcy( z<>pR~&M=z@RPJ?m7TEMzQxKHIOm}A?1OQLi6`G zQ(%Ae)1nSMWSqL*cCm|$vl~7dj=DPYv92j9U2rM>$G1L7j!3OiA*b$Cf?4j1F#p;A zq@!jN*}|=#yw@XU`~IIEac+^@bm~KkGqFuMuk0x@cK5zyw!P2IvK7l`gT!`GbUpD&xB`1BsQDxq;{P zL<6n=tn_;%#=hhqxM9-1YOb|nl9dhptKA-EcP4o_-sBPnF%$sFz9R5=Dbe!rIHzXgEgQU zE2I-wA;+%j!jJ7?-RbMwPuHXMz|{=JkE6TUn`TKl-9wrDzzj(`x|h!uCX|nTlwo0Z zh|gdAwXg@jni%>2zy-e%aw?QiX$K%a@RaD4;a}gMSCeJV)AZm27|uWT73u$2+#vx8 zUP205-EJJwUYGf+C_ie36GiA>=a+)Zg?qY?cnK(MQZl2hfW1$pp%kr=866`&39xhIw);b%Mb`~QezP{#pq-evzY#cdU98N-=H%)OG{IU+n@LU9w^3q##^21 zxWjcI#e$y4Mf_~@9fI}j>*VbBwvi!U>}(mX_GSqGU2WhW4ytat#Zb2Yz`$#tby zx|SP}F7em5BNNFDe|O4SG0!vr?>3b|AcHvZ^c%GdmskL zzx)o=krnm-hsVD(4tr%B+Qga6Q>C1RoagZI0dCZrN!Pv}5r3bOEVWe}cc3_5)+0d) z==&sVVA6{+KUj=FZ~Hd*#SA!h^*sD{-hG61Rv>M)_S1y_f5E}4edH+^j@*$PUW-!M1njO1wzQw=yoh&xGU_YEI z6;zQNDyxr&aNo^N&bwEJ)TkKO#Bg-Z)nseo`~XqVxvo9*H206qs=)|eyiW~5G)R){ zhp`s?vrJ=ET>Fu{biU~$ZLKyC6@nl>#o<&(EG?Q`}js2Twi#C*w z6bJpph@+6oy9%tV7|V_QyFO3i1*dg?Q9$wwIH;H2b;tku?Z9$fRDJvR`8$XA!Vo+e z$VpJ87TI4=O`1Ogay5x{=IyIj|M2AbJz4d0xWq^1%kRr4l6mc_|7;PK*2B?^~k6g`)SYwEbt=ZswFtQ18_I+`T)6|$}yiLRPEi{?cb2>W^X>qd(c>VYVZdNJXy#EEH{%$YVBX+!>Jm% zwPT8N3U%>Op;8PDue}OrxS22IIhw5XJX_b=obZ&ZFL^Ekh9YFKi3sok z*!pP=Z1<(*`gZffwN`oS&obDY_O`Qg_NW+e5G|E}X4N;{S8NuQ$axQb21Lu%tk1jV zZ|CGaU26D@<B!-$CoU6n|N@a_$xQfkoyUD&;I+u zKgcmF1mTrgSG6+*r9D;cO$Q(&V8+AykcrO<=zQFEpWb@?FRDNvRJF3g uVPR}k8G&ClItIFU0SibMK>-nv9*P7|K#(FZ$bd9KiqfUm z(2EF2?=67z5~PF{z8z=Y853Pc=e%eAzTdajnOXTGnazH7x$AXb_cOaayCcy4%L+;g z5D^g(bO-zk?e;@*&|We!ax&7rtW4}|tV}E{M>+Vo zjvhaAf`x@!?9`dF0>Z+=>|Ekf=L9ABgoFiglMqo*P*CloVx*>K6g(F2qGc{tHmw&&wq&a5R;ISk?*CT+y@5a?uYge5fkqr zAtogyApxTwgZ~bZ93VY-OhA_GkeUJcajV0E?m@5jp16=zL3h1%i9_hFwFdmulG5cHH*cwH+}6}GG`e@+*u?aKjjf%%1KiQ+$x}}+ z?`J-~!6Cnez6|?4JR&asO+sQ)^4oXsvvYFu@(T)!Dyyn%YU}D7KD4!Wbar+3^!AOS z#>OW;PfktGpqIa_tgfwNHa2nlB7%tj*w$Y=BiPpgu&+HNB*Y}-xP1}raR49U105FX`3FkAG`te{JmV zef2?9#6;lohz~$8Xof$dX1uhZ;8Z8o}|kku~KgWSIhO(h^ED2KOAur(O(T}Ym1 z7vfgmg~oI}4-?hxLU*_2cA>b?UFbI+1UglU5An&X#6c^9Xq-UZ5~VBQ@6%n4ck1Wzi}ad7h-~CxgOhvS}*TH zALx*nZUgyWSxR}0Ihsb-e(}mK>=?|JrzRms_R zo}+28z8YB7v|Xq+@Y~1rsL8NUsSod;=(bpC!QB3RODczf&3KIy+4NaB#m~Mjv|Dmv z?ejX`L3ZTsLP3k*vNG?5Vf~BJK0sr;5Z>Xo;ytjKlAAb?;F@n*&X*nQ)iZs$3oT`d z?G#O+6&m~d}aZvVB_H(J%Ku%wHiHwm1;#SZhJ`z>_P@&K!TMc{_%|}s^?+6 z6ME}_;O{%sG;CvOnZI>#(CYKYph@J_jXD>@fZSnq_UEv1T1)T{DcCM_c{G*^`OPf} z<4ah2rSHFU;`hKZ=!;Dg5tY>~eY{BpUtn3hSbg3&9m6u0p~5jsB}W#0SKSuVvoR2we94J*Z*DPVovYNh`xy`i; z9d!mbKf}JMA@aW$aca-}YKi`)Yr|OjlP#G8X=RIZ$~MTebtfMqy9`-YT3l`|eskU; zZ(k$o4XbydwL>a99C`nqfIs9dJ2o`*z#b>yqK~~M%y9x9wc#Z$G>^?@oJ@2^0RjJn z92Y<#wkVRY!P=_-5drVfc9APB>6pg}_`@yg5B)d+m-s?uZQQ?eU!dj6`VR!00SLGX zkUe3XfIs-h0{(x)WaSO-M|GPE1CtfLC7-kY)nqkJyy?($HvwcQIY|g$-#}U!-}rqY|_JDiuYnJLA#!I=f;lgymqCuv}#|wQsGQT7{RP+tlwS*~0nzKdF-2jq0RA21EZDYMg3S$@7m`}$S`d#K5j)?nDP6%!F%si-t#-ihq=Hv6m_ zb)8oo6{}%hu1rho?zvHSn}_VnG!KjgYxZn7e^!+thWrFrJP>SVnHbpb@J%X$iY@RIe^iC1~tHtGW z6Td+7SGQ2XwI=5IE!niI*+ojT@wbg$YsW*x}B%PyO0u}39+>=PYgQA zXJjeRi!WE{a=1*dB{TbKa7+;_T)O-d8G}z5AKam`Z=mSvfLJ%f0d7I&n+mr$j7>S~ z&ecuo&bz!qA!!Dt_1HeGM#=ZC@>(drdi(s*1?*h9;@g3yU1(3;gUt_aXIF%sooO{K3Qd1~rmdWd+MG#n{!C+Fct!KgwR8lQVbK#Y z#h$tg4gZeBOxVQGEgo$z6N2C0oL%YWTxt6*w35yQ4aE6=MAN4ik$a0!Yrarg zyTl~(bj*gRyyameC6s~UXE1T4b2sYZA9E}CaFNKAeJVcEc_rOO4pTL1?r=Nsif0Dz z=Lp%uyjJ@ucn-M{k&H>&)v4*QKRLNHt?6PlHh8(qY_?Y^$Lo#}_q%?Fz2#hsR5WMz zVD;(}9-OCrhVtFI8u4L8JCY;Ft%>49(!0pV+{AjB3&?TjHpJW!U|HhL&8+dig9|S} zGHhRKbzw-6Pn=ONdYY{aMT+E@H0EUUNgI=k-{>p8TwS=79`1mes>)+>=Kv|WhBkNVrz#rk{UNELKq2wy^CmCa#+Yj=38-=!6t z&T~~i!Duj)>3Vh+(X$KDTAom^?w-qgTX%l~iT+fDPGk2f5?f=h+Bw-9^wRY1*2ULe zdyO|T6_ZJ5E8Wh2s9K8Ic3*(aaU~=kyD7wY+n_AsgnCVoSwm^U|#&8@kF0gmJDmRmy3BUJl6=@P_=qpZSc=T`;w z2jxr|t-U`5UzqF{PeV{)S}ve%1*L=FoN#2WS2@?gOcr zSG>ee7`*tPuvfZTqeYKzNzdC3Ep!D~msHQB4@_%n!oh|xfl;5@jw5Ud$;49<60=to zI{8v9VvF)!=3i0}$KM$l37|dd8(rc(l9*s+z?VHTFXL{L^s!B$xY*dtP2kg6axA%C zsSKkNeyI1UL&RJ{$%nHecb_)*U|!0=$1E>tx2z)~F?c&kf_qmwvHQk(NIj^qcuB^4 zV5t6Pbirxait@1@Csks^sPIz84ppBRmK+$Q8uieCB!hQylcwuk-Bt+Kp<6+SvsYcV zmW(SlX??%?r@T4W&Na&uA9lVZ4i4R4EUJRp+O4DviL~49LJ)kcYH{R6>w|+?N^`*@ zWlNeDQY<*!HVj%4omI(^__?nI{#VH2mh!xcN*n5n-M(3~OS=%#O0X6tC~pW~tWK(Q z-Cx>isM<|Q@`#5jP#}Ovx+-H-hsy(dq!$yS6j<#l@bdBXEj2a46U{Rx{FY1Jl5?<( z#f}ikuqBIJ6;CC_Aag~H_VAH3PDHM3WCx(q_Au_*dvtkk20g}mDdCJQyHLfFKGe=# z*gh6MuEY>2+NQ+8;!56Es$cc8n_iEhjhA0&E&0srfQOM$Gj3v18)R-gx_IeUS82^h zdi!M^ohFw33dPY%w@)Xpax9S=5sdPBo6u{fWwdD@Z;?+QlHPmbuFMH>mH=52;-G1n zBOu*~fNNmA%$au~V$?2#N>Ql0)t-B4yGa_`wE$bx{`j8u;~{+*{6xhjO$OSq+KF=~ zFe*uNC#l}M*{=7!o&3g=J&)c5T(uh#!5ABk4l=16fJ-H{Ev|erz7tYRae^g(h{FSF zc|Crh1!5~D^h)04Lma!%)9gx7t(0V?!OPcT?@$~b&6;xxG`wMk??uhS)%FRI-a5h& z3Go12M}=}1`qUJU7;(|xzGXJhU*%{fl3Q(d=FqW#OFc${K_0YObYJTHx7lN-+36+4 z<8I&HIBz%ETY_k#A#^c6L|rm(sWdR^GJ^6Htq9W$Ty7_cB6gOgz2&9 zX5TWMxtFr(OL=NHt56PO601cWs$p7b#{Sv7O^za4v$s0c?eZ2D3u5P~#&@>uVLI$` zDj0#d2Trt47Uu1=PnmO>Ur@X~!N_TUd~!PUoYZCjH}P9^()P1x04!zRYr*|10y0OLvonMOkqTE#onLa%R8uWf$e#5s6kiT@Fm0_>R#CaPwSC z$&#kK&~dJ3z}?vZj4h&oQId$=yG+PLLyIQp43nT{{g;odQS=wyzikxYV2_Z7@p%<5 z;%zFH8o3A2Ai31N=iLs-@o7c=T(_#4E zWB2%S$L=XW>;qZA4fNtp6$lLEG^_~1{bb?(VBbNn@bi) zSl&spztsxyiR;jeqP;~XOnhP{Z9^la`;{4tCigjPzpmL3MOS=VdOE-pQA0)_uT_sn z`;ptMt4N1~0DLT!y)R<&>B{dcj}uKfWlF6+3qMF=S4Es&EBXSQw2MSZHkx6Z1IyL9 z3+39Sy}I!L#SO1(EN>PkhG&#>dul?sNZV#e9povj!i^ zX;md!<1sv_Jof~-MAK-_*4S)shcLFme(Rb*ULq-_MH#l5+xEz1shQz5s`p^-{99=z z`4q-`2J3@$o^@PCr*|6HanMwWqu!e%#+^Hnb4TuhD90ihL^UxCm}Y0~nx#pvcs=e4#TfGrcQ|M=~K3U(ZKAHIxrbb zGbAhh^p5ZJLJ24Oc&!pLOVWx3t;BOq_X6pe*kG$-!-=nTx!msnuBE zp?w(hVR&|~-XSK8rHD{cPXTsO*FzG1eRd^#8+1VU4# z9I$e1jKK800---=6Sx??*Q2G(>K*18tJI=HpJ#gR9^t&&uVB;udNSHcUB8-F^uty; zQ`?{{^BH>UrUN|dtT#hXw7=llr?Eu)Y!pqsmOpAqfAyZoke0Gpf?!>72FWHe!#H8eQ0PZU1a981RM~l1^g&TR=m@JE57mCB12SylOAh4`tizsRIvuI= zx%-|c+1)JgJ74*(#wusr=*6|id*3*Se@4CmR=5y;Ce#Q&Z{R0uE?a-VG#1m-fx zpq(oPGEMHDUZ-SdM|{2`Gj-7{2)pX6m3)gb9-<=B5%nKAGUv)UQ+B4bG{EZ7-aP-C zUROqJR@8C~yNcgIJhYXFW%2@W_0hnKCD?#)9ixJkS!Z86)B#&be*gv6F?C?smef<; zX}vakc5G*eK|=GHYR?Mu`^TP+8C8~Eee6CiXC>uOjN=`As}u>Y_icNmjm8ANUp z$uNqpr7g9O$p?hKQR117D5@zNUZm5wFB|MMe@9#TDOP$`huo`-rNt0+1Eqh!j6Y>& z)V{W6k0JwOJzGJufO`X~c#|Ln8HGId5(f2YW(9Aeo8bmgX%oSsH^ZTmf(pbCoWt(3 zn`HCs=*z;`ne~W3x7D7Un&P@}Q!7T3In19Fci6qPY&@=H!EU7aFqGs3 zak*MQTkBL*Re|q>CZNAt@I#XtQ*Cq9H<;29SUm}-Uyvh!vHJ-+X zsC2IKNUMtaU&!U%hcfmr3xwoaH$q+ZU%uUhb`) z*A(#@mB2--?tWnvQpO9;1Cioi%I){mto$r zWbB0(t#x&}aJ}p8xsrb6^Jl64Zk9Wt4{f3c(Dijk+31#1%9%6*5V^>l1^(k(>>(37 z;hi=}SDQkWb;Vg-n6ES&vP$A2+R}6N)brl+K4YafLr#BW@Hp&n^guVchd|@D#8M*) z<|*C2E1IK@rp{W z*jk$w3vS|1l3W>FKHI!Wv!~d@)_z~EKhNWF%WaK{TJT$FFUPi2v|phu&9-0ol({)$ zz}aip$ltD}&VGwSLgUinJt~e%8}~dNcoXJq8fOlfB_hP=Ixv(o`&uBAgWC1)Pv4e1 zL?>Q#oYY{I%;+bItgNCm>O+eBy z_ah`4VKH8=C(y!OO=B^KALk8`4X;U@t2_oQ+Wxu3I#eI;wAw@@}XM!Ugvg%3y`!Yjw`fSJ?WPUkfOZ|p?4v#;bmPH{awg1 zX7hUJ4BPo=2?T_3pSbhRcH`5bnfjZw)h~D&SBAax53Kmxf6>nD&M~oLZo;|@`xCajD53guA+Rzl*fv8)Ea$ zl@P_i1<#vUlg=Lem_WU`d06GWS92Su*U(`K7L&7din5wo`1l?)kU@eeHsf8d*@b9& zD{R+7R7i8w1{9-Og>)_v`|Y=;Xi;k`?V7h>YqrY?I#DQ)=`*hTAtQi-wbrTzo}K_i zPdX#Lch+HZ&0jR$IJ^E;Xm8f@j1R}4Q6EWPsPGM(p<0W*W`|~ZT@BgIdm=A1MlDMF zfJ-p{OJyO4dnckDSZJu7uKA$Sg!DUBA4^w%Fm6j)<`YY7Ee;Bms=ehsI_&|soa6UH zu85ipuTLW|H4nDMmhKmhI`6oy>lSAh7Ibn3++F)v$4BMqLwb`cY<{uL?L1+6R7H?K z#nSR%wm^Qu8MyNll$Ber1AxRu0xi|zCagTGYk9pZu0Y%2D!dj5#%rUT;)atKK6b*#jgHLe0U<@pgopt}DlmOR9HHXvrN4j#g zzO3yu^f6q1f)XjO+kBxyyj32f*5xLpmAQ?d9|2qXZAm4W*b={Cb9hE>4DBX&3nW2rxI z$GK60&(DGCulZi)Hhvgp@mso4Y>{f=xI1xfl5HT6M2=d*hp`7@<}5cJZ7HsWfkZ%h7vgJ*SvoV>mkUG9AUeQL zA-4<(5C9r>EML-&5^_UCaa&hqGX$~xpxBq2*n1ax{&p9-Zi&6BAvT&~`AmaN8ja{t z@gj>u-raJDSqtRZQCr?lwOO|*c5n@y4Q<3QU@ym1^KW^9MR~>U-G#Et&g??Y75Y)# z7`2@!wDHyu<@N%yvXsvk`l2$o_#8I0q%moSJ&Z7R(ZsHMASE)EGL*q??1!pQR%q8Z z$wT|MOfqu>7sRCXUm6wk=KC$whlr0cTMdD8_-1kq4dY#ilNQKy<}Gime{s5pn`HZz z1gd4dgl=OH;mO`ROphoX$!MP4=4qRXr4`0DW3qP^NnIWEM>Xl!*bfChU*%L-^6r=S zd>v+0xV)XsS=&@%Y=1Glg|R8#nsEJvG^Lzn{ zLb+1JP22?gW^IHUNB29^`qb5I2FJtY=Hn_qH5LqPxM~KE-5(MvK7M7=&%Dm5`>D(26>Q~u#57$eWF7PONpXL(3cWCS$T8{LeSW(|jf7SiHi^{RF4uHb zWEglyX+<)6v>oqHT86KgHVg-?+mlZ>&zEKcS^axr(3VxSjb04^ zI-elM$pM&XpsTzKDc}EJJiX2qh-%Z@SyXSyvCnCn&tuLG%zu$?B4R!(y-*qDI9Qy= zqyNp$>|EJ^mzsPIo8w`}25EK6%CMP!qxFG*D?Ht_ttxrMH(Had;Tx&Lo$?D z%QIiaLtJ86dZBzrd@w)HtS2P~U(Mab|CQbUR@De?HY@s;clG#^S5Ds(xZIqwfq21| zc;OdGByax1`r0|;BV!^N-w0a~k`-8NNi_eCM>=xlhQ>dU#XvfsRg6&Ma=-mYKZ{zcXrZrK769%n8XktN(9qvJl?*L$ZHKf_BYIAE1O6=UVfZ1e z(xex1jt-o6+)H0*Tv&gDXLvts0W9my=VHpSm2bZn>8dTnwecHe$*eyo&e@Cbl}R$$ zM#~(D02qtdXq~`JQE6#O?4G*~j*t{hCkZxG+6NUyTWz9!sbhYjUiIU%9y{{RYkRll z9Th8@xGtbc^U@sC`}-f9A1#u;tCt+)VNPz}wQAmbZvGbbxMmN=21V}8UhzrRJoVD} zRddtjw;R75y{AVuS0HJ7m}sFB-;t-s6(aWFssk7RYdjjpF@2_1)HFAvi{q!FHP-S{ z3=JlY8@F^T<&lidVh19PY*!Bxy_VO=LS}c&jg@2;dn|NanTwzxdDg?ha&~0I14fx8 z!?J_#)(BL6a&pS}iZyTN)P_PPW@3{4xc}wbAvqa;* z0={{p=7!i8m;60st7vHUo>+?AM@QhWXJgY{TY#u%<3ycyhuJ}fmGrPi45k=W8#WSi zM9ajfG!oSXl2z$`is6ZuK_OJXH-9=DEX$R7Lx#;=-gv6-a~O(MoPXsxhTmM9*o8mp zjhlVuOqz#a5{Yq;)?uQbJr8KsVU3S$f*}5S4M;(m=^zq|tx}u^;=oA@=zf_u5u2h~ z(57qQF0>zn_BNG>HM)>p=u&!0Y&xPEw#>2=v*T$5IDtIxpegRS62ux1z+lHD05Sn< zNXH8~lhUEdLG9-?#td7Thujn~o8N>cam?*wEg*dCQCHbHUXN^ZgM+k=wa^*tx!%bf=y2iuTdg#P-`ey=6C+r!Z*gV!7G9z0k@4<6Wyft_%^oL71*&;_RMy(=|(cps|_iAz9d?i>fU^N z<`5h0(igH6fdM*>4zUe_hm6}9)d%x^;B9i?w$5U0w zVWW#6h|9)SW&!A*F3py%1>=mBiw3cGW-4M+-V7&vYVy$cKigpOJT~tB0M!o%P5<(g zy?BA~5A{qMGSx^DmB^m zg|2Ang*hav#GLG6h(hmlUawoB`#AOO7`tpa*6M?Dr@aE?xj#62oRx=Mc1BuAxN0Qk z^{e|j=1ob$Bx`?@b1s}?E#7Tf{QN)f8-{8m6DrWFw zDwf7>W88QAcS39oX?t9DA)$GT*(j`@K(6+dce;c|GPqJ?6_R=gu2>#n;f>%psH?S6 zJVeGxGp$=o0j(JH6@l!W2H))JlG>~xmQ`0{wn%S-j*OxyZsM4(hq-~6OSXgBN_km@ zTT%&4IYGLElI*i=^i-6!8+E}7ds*dgFV)64CYmJfL+=?>a#*!r;jk}wRxL)@o$yPlPZi}Vy_kj ziYid^94dT&n7W}i`wPuEk?G%5$za|kJg?!`KlV*I8PTid4|7vEo>gLwoOs0?Ab3s4 zz2+fK1b^~K5CgNHg*RfadG%u}i!8BEsM&KIfEvKC6>1{bR39QoR7!cRr2KCCDxpP2EtG@yP-T(-o>;uzvX5>%BxrzVWgG_PnDc$ieOG?t| z(Np}aHF$C9g%}@9EYncpYGq5?y^`_=rZcyiWr`oiW|6)obW^dCUnp` zB|t%ZHX0ak2&^+~+ie~>$CC&Q&qEPH4`D(an{gr+bKs30Jmprmi=rLpR7q(xN`hM{ zKt#jgs6=3Rz!6&JN3!f^Gjwp!6@pey%p+F?lmok7D%sqVDmf6h7o`w%+nDkk^D8dm zt^(xV?R`u6-l78!ly>r6guV>clJKm1A251S!4A(qy|>26^Dy+C`3H7kt7U`RNo>a> z1Du?B0%V~=BBs9FKOoQY>9QwBfIL!w~BnN7F>bLJLkzeR4>2IM`-U)K)wd5jA zdt>?gnC0!|%YNy%WJY;8j`;^@VblF^Ti9wm{Kps z6H+P7pD`4ciSWit-IC(Tj`n#)PsM~Zb%X8W8cIv@iMb$d%BqgA3=@EJO>Q%TlBh(? z7UhiornU&qdVlLWpeY_&?Kb{&KI!3jJw@YWk>WndfLFi8v!n!Vs~o!bLR5C}IQp}t z?gwzE{{CfA#;j?nt~#fJiSAYhE8V{@ex^ED`JfUP zKdS=J$yfC4yPpdI{}EAdQxmgB7YO2#G;q291DgH%r1*)B9S|6N;3k&F<4;(R#+5KN zv00B(rmH^LOzv;mQ4VZ~x?o@j~M7 zZSx=4_&++}pT(|!-5P%6*ewgL!Vfu4ZjQq(fLBsB_*)eA5a=(^kRe2aTr0?~5IBl3 z_g|6-OlbvjnHXGOW_kiBg=cHv<|V{K{t_`n)$lS4+IYv)5EoZ#;es?m?fB!GzW<#- zJ^o%S&96^N;GV!4;3Y+F=f5f{f2$YWR{etYJ#^|C+rDM_B9j%OWGYjGA| z`D9pO{gMFPmEon`g~){v%e?Fl(cU{y4s4sH31nospFqH~3;lcyYg)H2a`b#>xUD&3 zvu)$iDLc~(o?k5TUJT!F;8>_HuO;V_w0N9d%f7Pb6CjA%0BJwoif;yiG6Q3k2d~1q zX|ZEz?gOYnOS*TAc9X~ife{C(V~|D)wyZc#E;1 zXc@-I6E^eFXMteSdjr7?M{dvu66$9x4T5k8{@SKMxIs7s6z}X%iLLY1o1%U`J4ttB zuWG4Fly%dzK6!YK*G=V)QbjGThc)2AiOKw3%W9`T|S&~lR&Sl7du1LS4Y~PJBz+9WHQH~$jD{OwGee2qG@Mg|C zhsWvWReO4tn2)lJ5W7dxECUBY22`465(MR8*q2TJsnxJ~+M!;j!Xsm4&jQ_m3Bfx=Qsr*YqaOM(xXojaG z9Z`n>J*~<(Y&T=)a0f&HzDp8R&mn7q*I-y}61*0}a5nn%rxIb`zS<;$wJgV14j-T4`$~C zsw^*lx0~qYr^Iv)DA&+?BN9!_HLk2)tkTnbF5%|$<^CtH&`&5bjy!SSmIIoft-(K{ zzi}F|AGrWh!Z@bt4 zgXh>ml-Nsv&Hb6&{Oe&;e?`;8ga8U*gbHr-D}R9iuE6D#_^|W0;W0jz{TF3Ds2GIaOh%~N)6reZxo4tRR3J`?+e}X z|4o$tQr&M zq}a_osPlGZ8ercacnFSE)xDuXBCM9Y^O3{0E?wdgG~4jmO+tnCwrJ>R8o!E7SZ5k;p#Z{iLz>nfU1(@%RwQOwcpL~IELI$ZbrnEZoN7OUu(B{!*e6Bo zSPD=e8hasOB*M8=CVcWga8UVuDvy*i6 zNii3fI180c;TjA;SPnP{OL%xY^m_;kZ;#1a>;S@&z(H6Mme|XGKv;MqQfPH^(W(H# z;_R}$Z}Ya`S$fE6PXJ+ASIu)h>Myus7)%4N_yL54e{8>SvfmE@5LS1M-0h|EFwNHR z=0w!-qATy{0EE>@n-f)KG3p+0NqmglX3iA{VJ!d%%fl48ar#FP7U2;5wS9%K2!;R% z%M6v!I{$IA*>4&^SkTpzw{Q?vdx$lh+C%Zt-uh<6A3<0I(**wfNxv{8b0N*;4+twQ zb*k1TQSUdaHy;l30|<+5>zWdm1&zX4xcJx)AgrG&638t6xk3U6tGniE`~ag!)R98~ z!rH%iB^3u@)g2#yq|HH7?jGU?RNy-Z>)&|N56lCbrx^}mh?GyA0tkcbDf5#!gdu-I zu}`5j-=w1DXyg}n0v-4fgoURhiUdph1H!@^0wAmm-+(NX6@7L*kN;JYgq-l(LIA=F zWjAG37>p;E^ss3r{}F^mV1)3s^A8B?r$Z{H)XPqvuk)$aYW7PP5kB~`?cSXx0AbyH z{KlNw-j8LOqU9WO488&R5rl<5;up-&EpIckuMpNfU1Nnq{(|+zQ75k_00=9Vzt4KF z#CvO-pz=DY?;tEZ1M+hd^Mes1za;X6y8i!)YivV%VaG)tJ_Fw#59sZ#(WwK|}C z5{Ho%OnCQQ8_j=IUdO?Le)2tp^^cGCM_%BOt8gy*I)Ui0@5);~P`6x!OCWvBH4gq1E5#dL`*+}h~UO1N6MOJY5h#U*mq zC95g3|22f=EEq?BpYolc(m6w5Uv&)4wc|V`+M#QCVhllfz$j*~NyHNQQad!%SrS1RIGIvG0r0mHgRH@lz z-+{+rS8l7N3#}(U(hOm1%>I%#1N~B6oyQa7ji!^N-+b(u7~L0;m0Z?nc4tdbH8yLV z3v!rDun}dalf3a7{`^{-Bx1Dj@wo^5dHY^z3Z?`@^#da#(T*fWRx?C%fY{*;XnBWl zw7i&2c{^Om^%#yZ{}eO^^KfBF^ zD`eQ$4$$84|LALtn}9P1xO9#!{@czeaIRV{4hQ=+^HG1x*&WpyV2HIX14AO!Wk@^wYVkc@p8=E^T-4Ew`};l6w2%)fAm zm$w+WDXo#Yo!8>2uB%yOG+FCnn)KN|Wlrw3O7EvVpnZkPT~m3F!dUQ4qdg3-GfeUe zd}sQ2p0P*@#@ZUR{^s{&LzN^HpLFvhzNU>Ub17Q4IXk@uMJ?FYuHrRj5qjp#J{9`O zjTo99iHpW@tCCKT?Qa@lBPqjl!zS&@W7LA}DjlR%XRNd`?+KXe2vi{@p3{_ivz2m! zTg0PY0%(<>Jd^u27_fkKz-QL{(;qR8di zg!|RSeR3NTz8GDx6R4HG@R*_{Ipw7^f5(|zXLGI^r|YKq43-mpy4siT=S88TUOgja ze&SXY`N)JgBmJjr1sn?@9ai0!?>EvZ-56`?bWv1!zkSE5bLvI#CJ{Mgl1-g{HF0KK zfr{6VbXe{4l)fQ3ll;D$vsCYUFX>TK3=r3nCCAQ>(hVh6g`VMc<@PRw2_o`$&a@nOh~BryUPnI8-$B0llVSrEn2$+7bd!aSFgaq z&|^r@waN($!>w-c-Xg$?I#1|5`R#@D;FCPTg2el+UMM{FzX9@; z#R|Y?69L(j0Eo?f-(fj04x{=E4+Ms1BQ*LJ;-6i}So1Ng+;fRhfjEV|8Bl{qm0Tou zq1Vp45SIlEGXdF0SfnM+iq2al%+QB@;`z;#_rB&$QKE{|mzwvUTc-=dUsTp8a-Yf2 zf%Z3kEGf=Oc8AFgYzBv6G0sLwC~U4UG_NO zKEgfkCNq**}sv$72xbG-WR{xolNIn{YP8+?~OWl>xrUM zH}frGqYJqtVR-yp$Vm#vV*bjZ#%D}?=e<wo4%TnSiujbERjU1W$=*|wiMdrr)J^PG+RbopwqO}TC_@FD#43?#^D}7E< zEUxe4`hmVn3{A^xsjsptBwn$2KsV|*y34vh4j;7L8ip`mbUM^~n}bl=4*6!!>IM#; z7cRFSUd|(`bui9~rD+@)_9#($-K#l+HdB+2n>n=>*3Nd~*s-$d;aX-BxffDdHO^9w zVo$dnP%s8eZ5NDon$~!9?;ZJI?XAbDk7x%@TZJsU3Ca+Q%nJWX!-fkIypgSY8ZB|9 z%fdy(;ZC1?t1m^;eG1nXR|_=--H4jugX?utJbjYPsC`K0t9GKLBaSPk4=?O9M*3x6 z;%Hv-9MdsuyfP-0{YfKy`{t|a^ZC_VjGvbh zWS?3aLr+ij)K9m3x&s<@n{Je^VfSD{MxO7J(zspHw#e6$@VY=^Bid`fUYrNLyWM}FXTh7L};414lCU7WTob#ll7whNcWdA0|{41$TUOzRm;m_vGKg>34DurYt-3+}vKC-ZV? zb9;nXCm;F>$`Q3=6h%g3$hX;3;Tc=TTU<5yedN6*fkJccyAY!IW37FCjDzWHOo@{! zd56>0@xB0mLuV^f&d7CobR%a@_~1T457lwv7uU|yM3LeLK^<)mKey+YG4nhx-kV)I1%2bI&A4WUx@j>WmqG?RO0{fZp+HTX88bI|JTW9=3TeCdMpbhRm$)i<--u zFUQ2I_N(k26lyCyUI1gobYBN$u@csVURhHPrq1d7Lerq<#}|F9f4@Ui?VT(|>hRmI z(4lSV#$h>prRGVP)5Dj7drua0Bz}~CFZr5n-?=(OxB{$C%B(vj1oLD>8O9EG-jYVC z=NI^F_nWy1O_T}LFYKM+Ca#}%ksq`42vgs*FJ)LmdPR9?fAoLxynAom>$)W|mPaxT z87^&h%2zFway#ZYzVKSaAFS@Fm0e{G%yp?kMQPLyF)pRGxNU3fX}tHSb>Gzs7c>oT z+F6E{OL#Ya@~?u)>MLM`Wb&8lp5&CW^%)4;FMZ)|=D5!p?&Y-S<29)%VtYb71Q%RW z;{w-~9Zx&{9o~p<=#&HnS~KR_j~3g;BmPWq%{e|xM?ei12|OC^5D~-GF!X z38Uo<%-6hq40fU0lAV+aN_~unVoIld`%2nT2oI**oHEWQ)%pfG5w}ISFV(}{;n+L# zUrs^B;?uYFj+QLBbhjkKQ?Liw$!7)Uy;f7VCj#b()?Mm5U&^0AQoHxlWspX|!{l?9 z!n}l^r-@aXTo@V}s9q9oT@|QK6%#OAj~w%Gihx$wX@{EL!Y!4{3VmKje{MVV#=j_D zaF6Wtr-;}14Mdj5&zL0p(%rm6)T2&|&lv(;U?Fg1Mc-;mb!az;SIi}EyeZAh_o`f& zzN;-d#_vUPphAj5A}}^X6ZG*TM`2HLk(9G#yfNzSX%9y`xV*IQ4jgUrAt<9J37AGzFPFYJ)^6;N{=ny(azc9S) z&*ps-&-K}0T|wDg@-cWrvYFW^=gaKT6kUx)14fC*3kaPG& zTGRpZMZ|YLn9w%@@HE0b&=exQ-zv>tGPjzp8?w#8!n z?=g7UUNx)|eQPQ)tU1%)njw_K^)g^SDk*r-i`;2Wcuka@NyM4igZqqT3}zRdAOw8WW%&+YV!rf9`$B^vUh zybNj{ld9dTtxU5_;i^m3Tfu#YTf+8B)i-dgb8M-S#{7iV|NnLafaLI)zGrR>16;JZ zN-ld#x5LTfO2g+ja9I|&$U@>2+U8r3 z;<<}!>B+`#nj+-<05dw7%SykfiY|Me+%T~V-Ji}>IiCKdVBp-|HyMxiBgJRTUjNx| z@vn(Sv;Q7#{ihQA%^e;=)YJUYc=fUh=MeCaj6WQL=mX%5PIsUSCxd?pr(L{c zB?U|Biw_#dIBvYSv@%1RCDPU^!!A7xCr2TCYrdRO zBY6&Zq(ssWFKAR={PxU*DDSU9*<$*GGde=3fVm zIDF{O9O=8B9s+(~C$6^~_kXnb*}$I@2_LDqK6t;ahn`%!Hy@P;%ieCu=@Z^Uwqj~~ z53%mp1huoQ=-)$Y?2y@7ZXa$0>8wZ?ep1_`O2*!cD?Z6a0mdIGkk93-?D&6CC=VIz zgw^P;905S>4SvwH(JemGh&Uit9mvXCmXc8S2zlqrc*xbD)?LWD-#$5#u6#DQcWqjC zhp?F_3BMQ_Pf$!Nq6F<>KOges7b>(-E%=4GGkEW}0L}e?!Hie_`IQRMFO_FOmMN~h5euc_uUwSSx}f}s`DZN&u+F8J3!ZV567?$xc&Ie0vFS5sxU^gH42t92T{EFkmS%e+GlN{LX>%Ff#}GQubmy= zvP6X;f|}beJm(jNsIzu{r9-sc%8kNx^t1&Chl7qDbB8@h(*}M1Nrh4LVczCAKOxJGKaMaR_Fz{E4Oq-=Dj3%Z*k|P4vtQ6E1gHQ3tMxy# zlqa9kTyEM09(tA=bwuZZ2`BHH4;8QGUT!CEUFs8^XA~bl6#akLd+(^IvaNfx5D=75 zDv~5BAPOQ`G6gCiB1x1S1w=ryKoN@|ISB|DNQwfI1qu+5oRJ_=aww1tRm1{{@*TSG zz1>yx@9OREj`zLa81IiBqX(Wk=j?O#*?X^l5VGqPmUfUDs^%Y5c!}) z!*mWsK7MzH?;MJJ?AoG=BhqZY`X|eZ%@N{PNuzMszt*XMfagD7f(lk_e&;0QWarES zvKk#)r+00Dtj4*Rcwa@9#6?BLQS>)i4UU9UhU9N7FMqKF{mO*5#sAih?Bs_Uw*UAg z)DPNt-V=@@KjEB2pSWmyf%{$C8@=TO#)5st(QB)8bTj_Rd>(B_2`!!SHIlTiat`ICAwp&qB$=KvW;_W3o<1gXM$n^|MyII$=vQrrA&Zf?xA-(w8*48xuVx zLP@uoEaX4-^9;!OZI4R?56BP_JChUCvWZHk`&`8jPVlb*0=!N1GeWoWsfHGHT@t2} zXc#`^6YeGq1~kG;2-v)9lkGhs?IFQxBwBI~Mqp2C*Xf4-6=w!ft8ZjdT71lo*N$}w0HH@s|a*+g6&3d+-JvT%z^kI?G%I&?YGmk z0oBth>ACtn^mx2p#~B4^?u#>$A6zZKaZ(4z#U}~B{t_lN9`d z2gSc!YykNCzn9Tbe}|lv=2D$(cL}=HYxsRztmksZC*Q_mxmc({O~kTR;$=kQX6@!8 zkmuv=mq&~s4mCU6p{Sq;UZMO`mWH(5Ha51-E9wS_efTcpo3Wm}wqR85F_~+`-_5B`0C{SZ_OPAcM!Pb2=Q){I2_m+h@f3NLjx|-$z)l zF{7<^?pK$TmO}H#$3-V8e0)y_Dsu8{Btx0&d?a3RhZm!4({em-mv=uY;~7!tnfd_= zi5STibX(bZaGegMpz+N8bTjo3us|Hy;qZ(J9*-N;o0vMd*=x(%F({qCf8}~+YYjc8 zZ?}^S)mKA@DWedPDo%9L2eijN-_XK93FJ}uXhW;xO1UHr(bT;Vf#ZVRvBPkn9J9Z| zpz&3R=_G@7gq>#DaELt_yIMXk8|YplXZnJiglYE_B^y#c2Ec{9KmptJ5!(3wCBp|D+Ae6F_OJeaj`R|-OeDyaUZD% zp>v*g)0v)3Qyxj`{bps;+}dEBbh~mNO4Sd|#?}h5UYZ6cI}L1XV(&uhJL6m0f}4|4 z`8j=kRNPoM7i7*#y8gfAFYxazo=Xu7ytIbH!}(9Q^dwHiwI+@>SGXg>&*VlrjURgEw zP+ZY1KJ@GQX|1`99V`Mf~EI-5Tw&z3^_i6c2{~tGqH>sZS~|Z{&@WsJ89pU>!zhfbv{ys zKVLWUA?O!XLZ1T%?;x8JB)2t=i)@UH*V|n-^b@k^9NpryT$Zx#24wdlQ)BS$r1#3{ zqfmZHVQagBnrs-;*D_9tFlu@t6E`WR6@$1#EjBLRfWM^!Lf^3IGU5Fwus&y??G(J< z;YG3;c}AZjDM>dXlYY7^pB$~#K!v$wM>DaYnat?F+(Ev5EjFjx=6MkncO1x3PYfc` zCOH0C`ZvENJkQ)CaWJrG|89#-3H!Owau=v`y!rupsfQg0{x8Cvq-kQ8U3~2Ts8TH4 zbe{VGDjvkNO>FM~|6^Hw8p|;XjjB19>?bLbrE4T(axS|w^g_vno05F&B}T@Kqn@P~DCRLP=oj(g0X?R2={##90m<5V=$jjxR<%Wm#9la>Bmd1N_HALEA@c=#K2& zzl&GF5M+MC1X{7`{F3)sY|FmLwnYjyZaWEUm%!D$bB)}>#XZrKaWM6FpS}Ouj?Qd{ z%C8&l3aezWFnKd{khdr$d(mv;t|V)ujEcT*f6$y^Gyu+O{miZpfJfbSA|yGpS`o@r zP2(&jfjerwY*3EEcsuT{@N6II&g;>i%Oek<`LaOSZok%>s^1iqUW%|grFX+T)5_u9 zX&pI{*E90e1mp;UkZ+$!Y%2#-zXH}EKSPfX4GrRSpxF)T=;nsx<9*Jmy!YZo%DVH1 z>3oK@xB?sko6E$8v3@038uYLcE!6#%GjFVZui3s7=JBzZ`n1U>ouu<(BqiK&QA&Mq zSg`wA6kM4GJu>egTowIbp!4FVCnS{FeSS)(n}Jp4VF~s$T6#&Y*Us}s?oBO&fmso% z?DLudbn&FJ^NxxTH3>D6cY{CqVnI)+r?6+myXqiM&*g7_j*8CFw;~tXSHE!EJQ@+9 zK|nW0tR0;=r3&{5aI;N@O+E0`NKtn_1BKPC8pAtpce&MCH1E?P=HEG|Qoty6zG3*# z&K#?y_QcH{Zkb*E?~`^}pR{(KbstoivOA-LuBeZHHT%@5+1k1Kfl8|A@Ny9A8SxKm zhIXi%(5&e>-RR0Iyv1Zv0_G)U`=07KD##Rp$tK4yEo5Ag;@1SrOm9p|ji-s!hbdVn z@h)%k+3j=84O3(L%Po~K{?CV@bNT8rOaVW$UL<*;^GG*71eM>&%-?6M=XFf^3fH($ ztKWU&vAE8uD4t!m(z2Ws@}=$go^gy4O5jV8wV+p+d~xK3^)P$;tYGn?(_Nxcu+S3k z3uEomHn2Nrw~UsWaq9AZGu2)5M;Q`Miw)r3kGbGr=?mSJ#8XL9>Ag0bF(S8~jJUB8 zUofks=#INLoH0v3`M^iGk{6N0+o&bt;(|2NUc6>3+!*=B*5nnR`x!AhNoKIak_Hrq zFrv>{7q&*R=zXDY>-;p)fTtdesSX-^kj?A$bI?=oGvUrT$gDFwBp7CKRP+4B6y zz+r@{61wH1Kh0!&CAp%{*%ij5@zidTVki!Fa2W362WTK_1mMul3;-H|5m?~fo~8lo z4A&OL03vfsqRA6Wlvcn5Y$~PHRNJnK7ATIqN|ORMX+E|re)IgLZLLh zr&ym*gglG}oxYG)so?ppu*jl?BHT}bxB!Ik5oJ^($sEKdJOUOy|0DjOiM}@upU~v@ z;udZNBs&w&`0_s?*8N^G`u8!>lRuTphVZ->@cf7Wuw=!V%KryS_&+>Zabfkp;7tMB zZnG*8I;;uu4f5?AY(%`Lb+A^b3aMUgHnwU-vgW{<7-X;^a*i#fZBo*D>?7Ekf5^bGjbfZa)G{r>}|8iBZ2YNS3vv4+m!3uU~zm66n*9wRbyicYM z5TuKMf34PpVID-`9zP0rlmdlnILjV`aLWD`@aCGh6Oj+2ybepT*OS@%Sz~w$?2<)S zlsaB$N7TOI;_tR0TYL2vDqRfQaK-_p``p29Ay650hfFc|L*|_ZA!{88KR|5%@LWSi zS*2`>Ev4*y2P((W^T2xSaSyn=F5q=mUo*l)9ahb1hv#)ePy@NAP!9{4p0r;S2+rBz z6Bsj5UFG-nlLtZgTP01Mu%}lvut8EzSj-S?U5Wx`1F3 zuQ-8s-v0}Sy;M%~_EmErb)`;Di;;%2=A)bq`hAYt(J~+M$>eac1NIOPCOkJP-3& zO5>|9HH$7}@aZBDl`AR5dJUzl7*pYKS$Yyc!-fmOb`tV%m0j+wy&;08uy`)Y~-SG_Xio4tbCup6HO$ZUqM8}S>PZIb@ z07WaDjSa-|-~GrCI-E-GWE*`MPGuJZRUNdGBWp(fkV6CEt~!YaT2GZk6LrCP>0ymg-z&pr8Xj{ARg1w<&5sRz|m zosYxllewfYntejzMhpZCLzfnV!6(ZH)v)F01Nt4hk(C1%~>LV<&WhUI#3Jv z#KbSYbnG}AtrK8>!S4Br4`g>e3QrA@yXSqhA<81)KV~SKvVD(gPs0>77%=-aMKekl zZhfgO$X-RQR7Q)zcl*L8mLL|&;(N%By!;%U`VWieo?AazH)MT&$)OCyz$Plj`GIpm z9V3TUwa8v@=$eYS+B0}JQvK6~W9%`4iQ)FC{{AVsAor(tnXD@gm`5g$val3>c zbARYpAlo1W_^`Ec-A?&fk6V~+HM?HPOZ`NyITCs)q`iR0{S>ej?OtAxwbuvBH04i8 zuCI+GI{5v2IjuG#(-^g4Fu!o;t5{lSmK`0Gvi)vFoLSZNZUgF?FQM+wK%h9TZ_Ow* z5_4QTXdpJnl|%yBrWQW}Oa~^>YHo(HafMUDB54D zGRwXV_Cl1NDd_e*cZW9_dV0SpnYLW~b6eMkA^peEby@N9^zvM(1ehBc$ier&@=&|b zDUExufQaW>*LF%>T{~NCEKLbsSzhze4q$rD`0B%ZjO^E~{8KmHE^O~5CfG12LS8;Z z=4KK`34R&&Hmw);wv&FZMAMcK-LQ~%%AWxqWeJ3hm%|b7+?o_u&Lb6 zXY-M>@?Ek|sqs@b{Wj`4{?rd!N89+HN*!>&0~(U6hP*>2_-ygq9al~;A=2#dao|oQ z^sjAFGTu`ojyeM!R7O@6y|HvHFld#AJ8XMA3^<#0ZAQOJ`;;K-JottI2h^et5+Z$Z zK+@u(|8xb=O?D`^F?~KQ+`sr1|3`UO`H@fav`dC_hpZAji8tOI14(LlTd>XxuFO^- z+R#pBK?Mb2?(QhPwR$!#oW1;lmG#3GJt3C|UyC$63T3JtC5JZ8Q{v=tupJ1l%DptS zcT9E4P#LLeP-zz&{cWjC1oka@cwu=&EeCWZ)8`UFVGzJMqFs_EVZVf9hyJJnOnWx(c*z+Q)0+i@SL?j?mpZ5i>7 zPYkB?6!ZSME70@9l-J(qj5mAZq&AO@jSU61$lbx_v0%6b!)wN5D9BM6Q}#n_-+k~pwIZrc^wvwTInn(9+EMB$<&Y2Z#D z=`cWOWng!!xNkYd3*M)6#o}A|#+nv){U$Hka02;kA!Qg~8I$kp8$JF3ielN4X!-%F z*zg+Noa_1g8|MPA9FH#%|2W;g6d_n!K6{XuY|x*V;vmFZ%#`=>qlSNNEnzN5;eWJp zc6l?PRGTJfEqjdST~n;#ks4%>ICEx3(5-qOcRtKgMtAj;2dwT!I?NhKT?AJgyo#`r zu)Z}0>{`c;Q*X*`&<=nf;l;MV&WtmrM}(<4U|{hbsng{hF%KRcZJTCLy7^e@OGjPm zBo-=~ySM9K&wLHtj$nbqjICH6?_ceb*tzDgGL}^BCGP|;2ZVqXP>CiZWNg^J(wNw0 zuBmE5dqwZei(4(EZ3V{1@A(fhIW4Pd7(sxY3dq1xmiP9K9flq_w{h4%>qs#A`ZFr; zwJD-QqISL3#hGm1$>D5h*evm}8-Wr#a1n8$`jcKR$N^fKN9)!KjD7HIDm zh!#0rrxt1VG=rSI(ihV1e)4qZ%AQ&XEc8c_897u8i03!Hjh58gqVH-WgvVEyd zX4QnNjb0V$a*}+k$XhdN$20sfs@4cF*^sr%huPdZ49a%&fxUfuBKhP_O-t>XUR*PV zXJCuvG)A8@d zLnaCO1}{$<(T_rhhd0!e*_Pe!-ubGlUp)J2{+O)I>*HT*R^3`w3~T_S!2?nmOhi;vYAXM*@ zToGtqfm!&sMz}mKyJz&`l4$_Dqp}C_FZH{k!(K*lq&)Q$bImhqmW(f{5P5f!EU7b- z?*w5s!c-5=3>#=AbYuc^sc5u3Qm0o1bNr@r-=OwRo$jKtnYST ze7(l=E~ve$`;Ur6Oh^;@Xy7KhDVMy$ymb-|6T?81;2xI`hz{hEXNnj9a+f!Suh!m|SCk6y+(k|p zbZX*E3y~19XcsK=eW9FrhUo4_~ZeYG#D}||Ji8TdEmVba{s>ag|^l8z3-4B z1*V)ktAv=GZ)&&dVw^VfcxzIKJq3CFg%&W1Zzao%zrK99aq-nf<%YPsZvsi_NFs{~ zqLI96{t75q2!?}t*;Ui;hSc-umclEc5yb`Olkpn#7zroC4MT7)lpaHX(yP~Pep)QC zAe6CtHLXO^;ECwY341<9r*O}u#O5tbJPdHVKq zHv6l#cAf{;c?-I0E3|Ie zi?4E%l2hI`b?bfpvT&v%UE|THy!XTCvQ3t#5_II=(jDZ$dk<4<;eLR@+%0>O)*_bW z66lz!Xg)LA1nHsJS9xVGD11{ds4wp-Q`}Xcu*!CH{_G`^B z9x@xbD;>UxAn{iqq#g5O$+?~8B(mGp)g{F}o63b)YKwK#y`IbbFkwl|DnX?*}gA+Ooa8|IN)@rRO%Lond2bmCG&&MxoKT7ZeP@`OJ^B zEQR|A=6O~t=jj#O`RTZBW7{dOba?2y-s{$P_F-o}exob0=c_WA>(i>x@}D0kO_(NWj5@uD<@w5+)}z5c z-25a~hQ0P=fNGlqT#?n)3iJjgq5D-RKiKdr%GNhW+koez_SKlq?_#&*BgXEwrA8on^c)I+5Im`o4Tj`>8OZT4cHLtB-2yi!Wp3%76Kd}x73m4X zzgIv4X~n~VP~yppEo+8siKRzX9qg{^0%9lDvrT*?Gf6g5$?%jwM=L=00anISj7wi? zzo+t4KB=NBHN5CcsYvXtDH;yb0{(}SCZ6?OnK^4A!vi7jJ+C7(!k$n(s9UfJt$h;j z%HMWZ$ae8v%1in|>H0TIFnQ$7>QmBJpix>V+Ym42n3s_Q67OCSTqM26<*gBsrASzz zSsGb&68(VpxRnOlPA-N=mk#qy@>6=-A%tpM&?6q3iNxk-mOg=<0nTiYj+2g_4kG8to3 zsi!9>vD9+YkAxwoJ!N`U&8n+DJ&YWmdhh$pEdD|2hnYl>$EB@QN|tHLij1X+)0F~P zf-;>~J;MV%&5tkg#pZOHs z6ZiweB9`x*K3K9FYDJ1FdK=kolePH8|$7b z==@B>uBi&;3$<|V-p4U|jpet{`whE+d>-qNlbgIxQz-K=w5A@goVFrsU4KG;N~3l) zr{Yo+KYNUKk^?|2dxZy{AG(J8nPdgRqnjFudW!x41pw6t(ye9;zz72}9zC~e)DpJh zfyIGc$BxSr#8&=0j3v>aAu)>LbLCxS$#U~H1x72Kr0_c+kfWmHgDNOe^D|1M#$9OG zFk$lbAqJ2~pI4k6Z`^p_{#qPe9p!j2!Mry>EeilDbSJ!`FdVRTqJz0%7@`a7Rx+^# z6PXz4-PJ143YrH}&&w0gpgToF(rpo&z*Ts1-~EyJd` zfx0p0nshI)2E#Twew$rY*zuIM%8gpxorVd5`CdzRBR|{ketLmr56gS<05If!&G0=_ zQVI7#i#MK%=nSuECV?(>q}I@~MMWrgNOfUeYST)o8PQB?YyH9q-zjKuV`XS?yt~)Q~)L4X~geAUkX;(qMDKb{*3NUvQ;}c>OV= z0#@Zd2M4+C(PDV*fVQGtE3n<;UU|GFu;!?}Bm``1w`$ehX~A&nFgdI1MOXg-U8lvW zuL5PU@?TBTX25|)$buiBX-i;w(H;owTVOnXfJ%!FTruDb#PDaxbzn-Y08@hU;%=qNZTpCcZ0gQj) z!yil$2Yi2tER`>+E>7-Qgg`t6n@pX*te=jP4EF;g3>tqa7bEuk0ooV%0r~<=DBF~M z-724a@IkT=kLgVSvx(i;yIobVQPnYfkT*6x5hWrzdi=1hw;D+qKCp$)bNQWS!2-ct z0h(zCpz;r@VGFui-P8bYpQ4!OK{Fyh49?KOwKv`bD{&JM)GJrGxb)n7xWRbln7nxC z4q%sYg!%Lrt?zb$8mI*(kv9UivJX6#p2NFG+q|)+fiQU*WR6>E4QvY@6t#YOHP$00 zqMvqkfQ^Lp4FB)&`|}v#uUsMJ@0seX=&iF0ng7is6TaH{0Tkm-C`;Zm#X_4#1GkZUA%6npX~} z7Jfz%Vy7ndRICe9$sxE0JOUOjRTTiwO9Hq*Bw8sLm(oi|4zf-}S_CfJdb2|phvxc; zTmXX7H`9LG=+1fVq|UQ)n*_hcfW+bc@-EuzRL~5-AWGm&u>SqRrC@lMuZJU(6UW8-Q$@r(8+xxKp3XHq-mdh7 zQm>bJ~LnIRZh@!LTqfk31k+qg@Vb2(0 z{Dz}K8{dhVIl9))In4QTBg}zy3R>#(4-leH2N%dVlxyRS=`SyJ$dSQ&J~>jZb?#4e zn*&eVI>&JIjWM{up$*_deUY|1pETka!x_zeokxGp<-i>5i0)z&ts^YIu`sCAqqIi;@=UzV|TzHfVYI&;@Op+AMmdXE#>HK2QU0Ao)3g#% z5|Z#aLWUG%-~w!8D-Sk#sQrpk2R27skEY*fG&oDtFVFq0i4zN70T!d&r-54u8c%G7 z`w^$4TkR(<3(TtAbL4Y~?tb=H_6~n@HTtV*0&YsC>dmbro2KuX)8S=)>A1)~kk6!e zntxXJE}h3I*)=`<@#Dqwzf;Ek^A#KD1n`q9AFhlzjHRFU*2dMomLgafEt5&%@RYlL z>-Rr7hHO9bH};Ks3Qe5nxheVYrE#|vqtw9an;niUpz4{MRR9$_F=da7>kTSFDXf0y zoND;ydp!dc33#Y{xUtfD(Pd+C)V-d^Tcp+fV=}QBU!U_~ zo&6{O-22i;iaE3%^=?BKXxAV@v))RMvP|G*jQ*%8f101@bPMaot6fB`F1TTW`BAUc zE2D_KDL?MOQuFeDTR=6c*)mLLN+|(I@%x@=by-hG1;b7XcZjpl8RTWZ8RLt{7&jj# zxtk~BRl_(H^hMk~D)npJSA$zz^{kQ8K72r4`RDot5TgR&9tRi*6bkMKVIwL&NLoq` zQ~{__V`bqDNnP{yX7G|ZnB@yZB{etmb)+2ggFCx7OGizbSE)QX5r@v8Uqg&6@v(o{Jr6glA!JGGS! zqq$)@O>uW`L$zPABv7wC@R@@6q|f^(`f-BhyX^*$6>#3tIZg~)%8+>OR#4J*ir{hr zm%&O)j)}N4;4wVRPg719*q4-s_G>@ zLKV5UQEhs<4ZXK(%mUP7o4w;EpDq3XQC0Db8XBNocJ{$H6xOFNYEa&qTYH=Ea3RrN zT#cj{4biC@tmHL^Wmy(24EyJegjv3M6j~uMspkQg}4I%p9@WGst`YaCRl{t>xO}P7 zA-~HHSufGEZ=WU5(5&(jyj4*ZIp9(1cQM*#rMoibndp7O7{%#A$RCktlww6A6g79r7QH&Q?BQz*f z(rtQz7Citv;R&%TdLJt=HbG5zC4(ZKbwv$2X_lO*Mq)G-MGb9RGAIdZNM@vY-iC^9ORnJM-TeUbsJf22ugr%My7x^xe<@vtsHHgVG{IsZP@)uSVN3J->j^ zuD%i<9mkTub7|McAanY*4>KTlN;rZK%8fA0I^S=B(k@DR z##a)9LNt2{J$fzJ1zXSqFaqiG)<|@rDj{@Q(h6~Lc;*tb?eUciI})xFx4iORFDVcpYMwfTb?*ppYpV^nS_ulW+~GqNt6W+GyBf4M#p{woq*hN7M`WqV`;Ku z`X-lM8ccPow5*|^=BnYh6*fO2D-}{KssrRjDChan6~)=K=e#xO?+m6I5{;SSN$-El z&`};k`23m8LTrq@JSFLpk?OZvj@*FCGh>R*><(E%>!wehf-CJotxJs{Q(Q6Ep%M=V zZ6AO%?(cU9PT3Z@nYc>5@AH;#O?}q1^b$crE=Erj)#Ss2UeZCy``TD!K00Tno0N4Y z8(@m9any!KZ^*%eM7z|y+zAczZ8<{N34F}S2`>{_^f3pPr97qGd6iN(c5WTJ>H%ym z2OFyAqerM(j%%;mgIEIW0SkTSu|rVv>60ZX%|lT0CTNbPPR@WR-9vv7 zSkHmbS&IyV1J>*|KVS1wP?H<6vmxiXY{3bNGjxf}$T${tPE|PH*Yk#h-IZruG%p=d ztqjy=CRC?n8U4Uwc`TDOxgV^hiL1)`g~=)w1~sB-ls>%DB%8fyPj<#3Mn$Rv z(N4GlPcYKE*O%m~%#N39eupD@gKc?cW9X-QuNsQ6J;({a@PL%JqDj7#khi^UsDyQfFUj>6=D^I-QofyCzqxH3l|S1$BF7d!28wKeB!B zD9QApMg%IJMF5B{Qtl+f8!^ZF;XD>KrGw|v-?(~-FFIambr!r`>zNrz@IXaCvH4RD zWSGTZKu8s>04a3VTLMe0NLvhDW#&Pze@uF3K`-T{4DtxT1?U095^vuE%uw~m)qtvEeZetB(i^3Q-r| zI|1CW`gOGXDuwjGs1i+1W95f$!JUn}psvm_x`X=W3`Ikh{ToZ=O(DRGo7+~&_A;6C z%J>3+2#wXunu5jQ2+sTu`Sz)l-al`HJl`rbojgOm|$;Cph{k1s1gu6Mf3&IN9EV+->lkFf}A8-ddd_39#XD zwvk^`>q~Si)zBZ6Y!F+_(oVcI=`gSA4#OeW{w9!w!hRvP3SGB08fL3?r3#+)*Me&d z=;U?-nNSr|)Pmug46AGIB`L%Q0S&G+v3c{e;WK=xoM21Tbni0xkdE$5^<=1lVcm?+!TByiV?$) zlJ{X~EHz|(t(mY>LUl~*{PV|ZUmVIlfg(OjWfIQ2|Fq2UA0`)ls0>VSG9WH3Fz*7I z)ZnTofy{$&Az1_t_rIIG&QapHux)vLCffg*EXjJyTwgcIc_bP3rqbH}iB_Po{o5=U z1Dwv;+JL)m*n!qPr!<>4`t)equ|gj&!Rl(0SHSLYlB}+J^V9%rZPN&2Ti!*Ekw(rv z{ca7k$UFFuU|IIEy-KR61_SB<*~||^d!9%^R5Y*f@TB?hFS=aP$Hs-=$e(rm{3T!&}Mi%4on+Z>QfO0fqklKIusD89u9jM1)_F!}-{nTT%TMWUi ztft*j&L9Hc8sO8!QC=$GOfh_4+WsgS?NKXlioq*a5F1zXiuZ#}lxu8VBK*RWk1GP+ zd2?%oXxU0VB=3D1pNPBlnlX#5gMs4(jd3I;Q+qxhnnsOaTHbIB^<=JGB122#D6N&m z?YE364JOs+wvGIfX$CymCP&&S9J`hi?plEbGG4`)lRNl0K8?(Racux?5{NN3oTv9+ zcabejSoP+$mYMC}v7Ei#JO`4XJOM&2MfMSF{(KQVuGQGGYL31?OsS z2F-OpKrCpsyOk+Z+XcBMV&gnXeWKC&; z36p`j;HM5_a>(rZC6|%+e1ew&*uUZ|fZd)POwz^h0kz*qXKsn8VD|zg(i5guG3Onf zy04fTckL9aKvbRKaKE-51|{tn2B^Aes1V&fH9iotkJ@pLKU*;6qLU?FR&wSvnvK|w zH#tAu6N@OpmSx4`=y}DvNg}*E*6Tb^XI;;!a$mgDDG|WmM7yPl0qlJm6itGrnnTXH zs0Aq}$=a=*Jr6@ob9XpbKds_K&V_IeU>U6(hMMh9#B?NH>~w<566<&ono=iv5}=Hl zBPjC2x6F%rdenLps(8MT*guQN@t|mqtX8AU-}a1LkfvWPd)%-_q^sf;hklPRvw5kfyDCkX(&@9KPgm_IBp&sU( zaSXvSh$)kx>SucUL$;M4w#$4HMH_CzJEroMnOCqc&h19Z{(RIIt@1G?avCRP`?dlF z2BCm*VnR+xfE#CoHs+JE5F0)`Eh(TI|c z1<(O*W#Jbmbdpc8>u)r$@hk<_NP2^4ArD`y21ZYxV5QMkCRnMR8~n-=tZC;B+6GbfP2gobP~N5s+dn{bnA5H46Xf4Gf)S#VXNW=W5qKF55NA~$+Cbsh^XnLLU;(wm zQ^$Sm88GKQcN^rgw;U~ zQo!3qa?~yw}#S>)n-3z++n3Z!3jyrx))ifP_1?t03i++m?{9!XB zKuO5N04NSAJxm329lU?@$%d_dgB$kt-3EKu;_SUQn7AJx@j+l_1&+>uO= zPqB&A!E z7`xl&ARljD=n2juWbRnbcI<8a7v%J|d~_i`wKa^#9Av04rpT(0$^3xwYhmf~*_Zn? z<)c4-zjITC{@cOreM({vSfJ*LqFc;#G68wDL5vx{(6$0%L;kx-GWG zN*~DXwXA2UUIF6D@_$BKona5Qz^_mM^9|2X(}xKG9S3}JB1OL@O(=c3f1jTH#cR;X zjftU}D74nFPfJU`89-4hQP;}rIHOAbtfe9?`gVa-EuHYBG7|6-@>yFms&Rj-Y+}D3 z&x8tWf|3_Tyd*^X&ani5B(@VYV^mKzpNo%<=suao9y@~w-C0CNFigQBJ(Z`&Bn(m5 z_w=D1@p8TfI<1=IR8|zBCl+P9Sb}%l@hvzrpyMJ5HOy?0LKdz)tM>s``o)Vi$6n)l zo!H{uq7cE1QIRhTG9OM59i7zz2tXdc&0!ff&{dS=X0+0k7m?u#k5P?{yqx=!k?4G_ zqD9X&jPvxu*H{+SU*rs#X;b$n#u?XMOZ}Fb{EiWY_5r*8jP&FhfpGIAm=;CIyLw%n zy?@Uv=D}kScNfg!7-Y)Gija-%{xbx2NY1cANKsPY#)Z{LIj))=BI7|{k$Tk-X~OEy zFoMMp;eh&8ZPz9S`bmMdYi8hSl0@&bptYl8;-1K^6S51yilIcpo~(E@?>&FWeNBgk z*x76O+9l2pB$D22WAnd6pr}W|0Y}Vax`H?p<|G7aM8QI_ zlm<|Rd;W@ry$tFxLj!}$!%EkeE)!iIH`O2C0nC>a(Aw$}()6#*i{*X)$DHgLNWo~k`n=Rc=xM@HFxAWK~$Aup4DIj*CZzDgA?zjH6C0m)+7>itmll~@Eof$yhPYt3CaHkO}SCh zzuD^9t{2eKbzkaa^f&*;yLfyr3ydK0an*6;WAXcqbzM)^g*FP$s7ZkMJ}rZoUy6x- zFUBLU{)f7mZ(1z)T}6I(tE%>e&3wQBWW+K%Y_QcLH*Ondz$)~x4GQqz&pj*;Tgm{G zD%?5-A^9; zA%^?UnS@s>J;Htbmzmbj4*V%elDZ_;Cd(6OzB9~Tsmi+#u^Y;NSlVf`zx%kN+_h7z zS;K%9bHUvegIR*0#erZD0so8UJGe&_!|FIQU|pR6MCYH~g_Y2Iu6CRS_Yim|RIuJf z1ad~w`SHf0p9HMnG5=!et+^*xROWODAtloe-481E@U7}q0VvHD@OFae&SAlJF!UA+ zZi!t>Rt^M2dbod7$N$l9E?NJN`d zT#v9N-r~RkzzPH{hzi}x2P8vR8D=l)e`t%8 zrxXxB19sELljz?A;dAU1aH(hg|FA#8<)h*M=r^0MC1C7t2PFBzoN}VCrq7SSvzu7G zVy3F@nztop&KM)u-mo5F^eNzAnukf~uRP|XgJ%ho_vSDllh(hWax z>Q?f^#rKhmynZHa`iv4x-+3IcTEgjw`24^3CXU{;wl@{PXp)YyUvtXw6PDQA70zy; z)BE(?zR)+3QuVH*isHqJHvGK;Z+`#fm;Nhn%if*#>E;5^lqXGpiB;~y+pA+%C`A^t zQo9!+j?Gux#6)Z6K}YC3xS>5@PyuaB(p;0{oR9?<4pR_CSQ{iG_i2Vifs;Q%*wE zolnkZthFNF1;1F&y-Y3@%(|0{KX|-={C_a#e|G8ru@RIWDk@T_i%564>w~Nt*XXC4 z`$Dn>GOexb1iLdE^H%9$02j$)n&hCqdNXm*M21-la8lU;iX~v6Sn|aP;~0fDs-pe@ zO7$)RO!poDVNYBe=EOj8F55nAUsa>1aKpQ6_8{Fk%3E?2;XvO6AgUkwL_BSf=KwDt z-}Ki8T15Iu`*CU;>pLTtM7QX=+(BEqxZ#YJx;}1Z0oruGlrM(<=sX!VcHDrfVXxzJ zMC&m7-?q(K%iqDEW8EFVN$w6Cn4_Oyj^V*$J5bm>_ExIONNcEgE zkK&2Y5n(yL82KW-H^yQ#|7u93(`WYH^}KS^JC z)sx%Ca!R7*>SLbgm-$m(JJ55~){?ug6QokU#SKybrpgcw4g5D5#8egM_yTw8)z{h3 zWTrC%3q|%->M_>Avb$eFV)XO3C^l0mzlUz*2Uyg1%YD#A>ot5_6qit((_2`L*cW9sa$9Dn|CL-dBA&xbiIHM*1oXSi-CHyLdUZxNTb!*eM`L&4yPhTI3l|rekaXYk0z4{kzxuz_9v>6rI{)y{EFjj0_yH8w#LR+H z8oL^jbptw(Uuf*(m(gcN{$aVEb*~T0{`yu}eQ9gnn4C?zDw(WA`^8##?Onk|r;%41 zs)4136#fn2HkDT8of%AT7ve7qe}u2E+%LVN^o%Gsy4_ink$n9(ql%x3h902(8_P)o z-YN=z)*SDGUJ0H_uoquZkB9iAQe<(*!qG{SuRFxnrcoThzLWzS`c0D?z8`&Tn@g=e zrh3XCGeS8}J=zZHgV!Jim}fXS*QGkNe=dnnmL2_ad=zVEVR&pwoWnUQ5|)BAPb_w&4ux%)l! z{_f}VdH;F-E1&CgUDtfK>pYM1IFAEKA=t5QqOXoI3tL$qMKp=9zaGs@lVJ^XBHAK* z{`TFdn&bttF?+al)r6Eq+&9yHsMj4lS6;6@s)lA-@V4XycMIV`bgukiTf3FAe1@v5Z8GrUQ6P&WRjF}>pG8< zPheP5gMum+^#@bxf-he8S=zGbNu#NFY}^#(%vIGVe$DbF=6-QKCO^Icm^Wy z4naS=8MhfIyw*l-=zVe?`cmX}2k!lR6SI{pQdzsd*fV3v%PL)I0!rJ2>Q6lJsc5fs zm6_jwZ&f+!hL z7ecu?Q>EXg(0=AaQn7NhO2uJya&t+TnVw4P=`J2DB{Y@6IxVRKsq zFR928{A!*$3y09?jT2=xHEeLyV)GaF%}cWDmplL&j`fJ+3KC9sYWOC+0zT9sX*`9)qqekCi;HJ4c!x>4^(Qgsec3q?nHOi60Q=CDI zdIO6`-1SM``RX0{U@UO672_6QH5IhYQErVM03G7=aGlAbtjzmwMW7-=mioQXQ`)>a zpPHNQF4av_$+&egEcX6NL;>IXQb|&bozB{OiMCB*v~`X*^*yFRQYOObp;M?j*Tg9- z)hPHJC$MVdWq~yb8rt)tJv~tve!7-X-JjxxDNWbMawkJWeqTI~mpu0T+eF4d^{SqA z$wQ;2%?LO8yc>0n&~a%t(snbPDen=;JvDX1~|Ekd_`NPsy$(cdfKJHqxS%rsk#NnKWdpXhEVBXy}$_5V6>~mR){av1{su ziP?1>mZKSk<6%*!&neo`ylBb>)dtQqF9mFNSYwD-gU5%Ox4f<0rX$0p+=}gVjXb({ zscNovIQ8^C+-LCpdkE4MKoN0XSBo(!SdP%ruOa>U+4YC>yR)@gE%hdrpY9f~bcmrU z1>4qp_L8szwKoiKc5oYYq2!&@j|0~4ygnMz|sf`#zB!?=~&Q&4Z0 z#|+uRmcs>$qVZPGpr^f+I=pRJ4KTFzLOM-}tk}C5)Co)Vl3EoFg;DREJ~z+@)hM}< ze2bN}CX-ziARfy~I%p8GfBqk&FaRr{V%i`boP?eD?CvdLVK!s;7`^iiaq3UVFpt>I zN)LZ?`ewl+F+LFOrHi4d$XOVY43a&MRew8YrBe7}BS2uMH%En~lZ@BWB2j?2%|}?= zO<$h9SA2yui89;@KG;MB6+89R@5VXDn@N)kWkZ$exk<8~6ADkpqjYt?L`H*>*d85f=`?r%Y|KpcMOSB9QligbbO$_A+-~0!1Wq@i%Lp=Em zPi;gkqrgZR9LU6B6&;dyH*!*G_XHUgjoa>s*I;uyysDuwv~{MgG$3K32klIi%gT%n zd1ECSu6Ff0Mbxed%u_$(=f74k0=t65^TTJZ=k*qG zR$C0S&l1nd5Po`plqa~BKT8W$4_=c6a%!u(`ifd^k)SdbSdNoYDpMunw%i|ALf+aJl#q!T@} zxF_or1X*3W&kU^;`s+XI94;NtO&7B${2mm1nPKKB$;n(n>({e*T}+hJFjE7RgJ&IlwpMyaPx}u+ zEaG>Qg~{0v3@&lrtZ$8lv-48Zwfn{56v=P$3yyzwI zdd_W$`wBv=U@@NbRxO&gw-^+m?^e9oPXstff}6&eWnhU#o8iqTi(dGixaFusoOdY9 zo)#PtS6neKYxF&M4UKH{^3u#9iOjXvhn@NrCD}GxR!sC_-we$TndH2*d>T`f_c%q* zx#6ZGspiQ_?+@64db1<*3YbTqZI4qi^*31HyHqJ;8_qg1M>1oa87^=(&9a{yTJBUW zEUK!oT_~QSlxR^*w1q)aeb2y7;VVLwlJd)?#6)))(DrY5q`OaojXDjcLGul*GG%EJGBSgv~p4hh? z!bzMm;4*#`=hv}PH}obVZFG8hNbn`>7Wy`Bko}oe(R&WG*ic1fi32Hr2ub-Wyw>|{ zndGwhhfB}cfso`Pgfqkyq`C(g=Z44Ecjipld)Jw}TKHb4hVm&66o52ie54 zN!Nticb?mYeIhe6*+kwGeSF*?8zaf~6jX%;fK5iBw z67m=PTKok<>J$>luS$ll7TaLp-~g%iBWyUPZBCGOg}HB9jR`8=_{R-EKQ*>DS_ac`Z!SHgRd!a_u&{$!}X}RL2S=d$kTuSojFuU#a1c z#3%=^LmyP%GxxU2NLU>-Ip6*6R^nnZQvC>w<}mYwbsok57bw?@k{6NDsK^qwC@8$x zE$G2WrAR#gd7YkUXyB(cSq4zrXGMGoU#Qwx0Sy;N2a*9(OZ{>$aIBot>vnmGC@|Cf zvgPD(bF|3PqU{J7BvAumeZZ;D)YlkMJ4&aGnW+omSMAHjcY2d0Okb%mv!6={Jgp*o z1THZMiVFmX&VF^cb4$QOa?daKJ7f*|8svuh0BOz_*=<+YnEMVX%$lVDyhvZ4!&s(= zRj4Y|8n6rB%K}WQmDDJ=aWUA4#Z!CJ%7Wh$_+QB}w8+5iDHXn;y#RpXFutu9{X35V zDN8pgLbxmGs7alzzK5-!l)krPYmBc$)a;h z$_!v-!<+c%*WN_?+MU2~>GHmICqlbtH{sk4(C$p?2tlnB>zh3jHIF{D3i=;G_4p?& zhQBEn?*aL)Ri+gg+^GkR5dLv{mIemR1o6hC$ zogPqAQ?n41cLn0Uo?B--T!B#Um(`toQrNPVK^5ba{Y>vuDjQpP2|tO_ybNtqm(72b zVPyFMh0#D^EolCS0rfxqN`IpGGW!p!@1I=vOUf`zYJGSS__rO+YxxzcRr$MB1=Szy z+N-2SXvBQCC}ykBl$hK-N*PJ~e*RqFZyJ0MbZ16j{Bint{{+AQfp7yMFdGo!i2xA( z%ZOA1%Wm|2-R=P0pyg&cGi4d< za>mGphcc?A$?!*RQCx|%;5IrSqOWmL*wx^~_`wzM{uRRp6j=J z8tAiR57!xr`T~g*mG(zQx^YIy_0+|O{IxW_Q@c?L=tCI99z`4{p7PcHZv%yd$iR2| z2C5+AzB&q!>ix>muRQIqmjMQWNNx61w&7^GL@F~7r*U~Yc%{(bbt#qNFj7VL(B_bw z;17(W{&x@i;XwU=AAyBRO3XW%rhsE2)Hcmg_w6Gy2QL%n0yY8l>Z;`Fc#a8@ z6}U;sGNFy29HSGM{t!CADWK$gq^4Fla=Olc_GY-Uqsos61^>Y%@PlPJ3Kyx(n#w*o z>Lrm%4rF3rPj6i*d|_2cp)%~Jco(uU;%y6-<-vwGMY8|pCLo;6|6v20<1}l07)m}Z zb0DZ~x{G^Py2J)A*PkB!m?>@Qs|ay}P^=InL!iR^znqi*Ve)EbO~GOvYI@RbMs3p( zK5r8tcl7I9b?@FZpss7=1RPgscTw~BB4X6i7 zvYbFv^bHsSzgYw>j)2_z_l99glLV(X04%VIQQ++SQxs+J^6%ZxC-&t>_PIu|?-1T^ z^;H`brQac+H2xpU6CjtfvM zO1Gjau6Cdr7BzOMtQ{5fHBJTN2onhAIfQ&LmfeoEtuN|Ql?C#gt~RfpsJHNjac2Tu zjwl)kafP!y1NLMT8u4^Yu%h1{-)_G;b}{#B+1K{k@UzK@L5S09B2@4^AHIgkC9ae! z>5bHd74_28yyxBp7YEGx7_YHAg`QKCL6G5s@yDtt4QvrsJ0e3c{LII3lnX)^kwxTJ>6V<+`dC+D7u1Ld`cvnzL4Oj4jW- zl_KUv0_g|spH>)87vfVbUK>jEr+PYA+ocgp01fxwJe=z(@{Kveb`cZp6x~x-uvCq6 z%O|*vn0dajWw39P@E557_3OzoAP8-f1AP-}!>5I9VfslGim z4{vuu90n~uc!8?-Yl2y`xy!Hb-I~u#@r>m!%Wb_bLp1|*BRu{>Qu-@h;rCwf2Z`cX z;b3$-sb0V9J@K!_I`qzpM9(8-8qd13EIg%v^nK`esZg7q9BR6eUz+&2sFR*9t3a98 z94W06t}GvrtN#$rQ;(ob#h!n@ePuc$ZT<+4p*uP==-!%8AS0o8y`}WlBi+%#m0X%NqjBc)l zF*VnSQXSc^XPD4aksc@i1t})qec_mLH&SjAe7XNMMc$XZIKZ6WH)VdKA+Cp!?NP~V zI35FgfJ}A;dODD8!D^Sz<6a_|us~M@(!u%Tqti(l;%!cF?yIYtjXcnF%0{NAf)AEV zvoXu#N(Df-8H&!@5-E7Qxuv64U1{*S*^Z=!B#fEtHN=&G5+Mi(KL@`Xf9U;^?BiHe zRcLb%?DpX4#<#6D6mXjW=Rs^I;mFMDDm(x_b5JzzFHmupwh|XrB8huWKDMXE<9yZz zt^D$O^oFWL+KJSs*!ajg1q|DoIMLiq{Zr_w$CVsd`+WJADeZD?m+WI{rF6-+>LJbOH12^ttaEqM|iewkPrH0N2+q|eZsjU)3kzl z{)zJtWcKuh;KxEjuS-heq;7*V`pi=XZDrm_IK-njdV1U838?(#D)z0}UhTINnq2j7 z!!PqYHayl+@{zxk2rLI^@O9dGeNe`Q>lLW-qC1LlW4aNC+1+nkG00)kz@h?Ol8z7W zO6I*U511Z3lZd7=5el;+45 z3zxhzOjPLFSV*27RMwIv;l3v20-g;M8)AurriYl%h{@(1j^S}2o!wo1Tpcj%2j`04 zTv6nRJt!>&a0~)!=f3W+yXlJzxPGGoYvLqH|DAzyIS08C8g3)~n{H3S4wXnhkLUqH zP{e%#xq`jxA{4j_Q_jZMOFx!wK88-9hz@Do4_eMU^(Bz(te*!)v&-Z4uW4*+YuKvA z>PD%B>EwG~6)jm}bQKe*mOd5l>vsXh5ID)ndC!L#D;$+_|NKCThPI#4NXm&vqR?WC zGRGRhq-SBzJ*VVtX=%NL-Vc-;xbm&{q8=Q!zZ?E8O7t#~#dUg;mI=4@2`w^LV?xl* zvu?Xrp1aF#J=oJT7%n{Z%_4L{z&j12azmLXqVuABv@&6fnLtVs4Oui8sh zzO?R3xtsvANEV>mK4XTvJys^ITA|UplF}G_43eFIFa+ zTn~Y#`%i#WKx`#pXxLT9>V=^@X<0Sg#J;g@aSA&aaw$6*O3RA2Qp6&|AQNl&F~b|5bd5yn%xK5PqyZm5Y6c@yq2 zJiAQ4L_SKg=1}ArH9A^_q@rW$JnhRmeFdgnP5BbxDB+ia zCbGxO#G#aV#W!B7@1{j}kT1opYZBpLO5GxbOP7@TvU9W7S)(5?WSs~dq^{>0RKbgd z#^1Jh8iS}!!tn1ws#fh0cwtnz99oXHHcyiy_;yj&1=43L)@PKj#qds8Vwb&bi0_vm zegjNO9i0Dnh~xO)k-lC6NE&&;?5HNp7M)-?rD-ydXYg@jVS(%7O&@r!z+Svvwoz?q zPTHqbvlgFEvLDaw9I{dDG=0~%#QPgL57$O6PZ>^sQh{cE6E#j#u1ph6ji%-c`RJLV z(>cm#Y!MX}%k##DH~|Yy^AK4QLYIhp-ZZd}VG%xdmfmXUaztersqJ`HM>#8|QG>N! z2cA^#0o*2bA08If$ROt-vsrIqN3s!_2LB3wp_4OTBf0=J#$6FfZ~OSzD0lcavJVp_Lg#6DqpLe!QY{Y;H@7?CsCn@E9h> ziRpH%8^_M}7lJ8iIeohsCVpi|V}cW!DYYmH{5*_ucF*()m210BIuP5orQT;!dWum$ zVq6Z`0;t*)J zbcH8Ny1Nz%uzCPxhtc z^QFEodVJ=ZceC!4Z&EBjSTo>idlkY35=j^PVriDF{*xk6&^|zTa&Du;&rrH29zv zvB41a9iozxl?;JEn28GsiLRgr&Xjsm0zbT$UJxRt_eeE;xSqQF275EkKaDzUdscL% z01VmTsquhM@XFOTy}VvdwE;VoRS_QJFT~-@mK-#W4;nQMAsx7-bOU2Ap{mk2^7e+* z+Wr;P^hHZuE>4Yi@az@;&DglWIyutGU4PX@WdSDClM;pb(`B4NrnbT>Iu-< zIP(acfP(z^2$R1C!TZfa58)w*qVJG6g_D3-e*UGP%Ju$Azr#?7{{cskMuom(j6wrjz2+_>@spOhjworsK9*o5-Bh5m1mii zWJ2S+phb~O#UHX5^!P_FCN<{5|CQl8R8W9=|G}@Ln=fFDyk9C+2^mBRwAAh#kiGy` z86SP*#>NbGMH8UJcEu$@tO0tBgB_~de!BXcOZw@0_EoQL;bJe9c1sA9w;4Sfs&>`s zJ-fz*1hMm3JlmX%E2>V8f?UXa)!vRf#&wW9Vw70g!Blm@)B$6X)&s~c16Mv=J$_kC zO^bBP;*{uRh-U^!g7XbylBg?rY#8TKafl|Zh7>C#oucgEvv{8<5oTz``r=?b4Ukm6DNAUoIt*ypVS7z^(ZP1?l z1TD|~;9gQ!X5X=n$BTyc&4bpvj~vW6N%T1LUe*qA6X@gL_qxRMt}3J4-1atEI{N44 z%#>#htvC1s3)=ZRzE#%UV?ez`+3!7Oay#b~Z_Of+gbq7|gVl`R$5;2@n>Ml&VJm4- zZX-)Oi%uc!J^jEW;2=o3ulYYQzC{G^qCx!|-yz+f-~JZZAXwHW5+Jj?LG*NT*k1R& zE{k6o@#5<+w5ifW?h(~{m<3f#)kC3IFB?4CuG`NrH>CMk2yfA9xsg=Ml`Io&?%CHA znoxX)Xqxf6wwKk)t_dfdi}(h)sw`hPSxQ#3!U>mUDVLl~I5#x8EN;|!Zv28%3&qEf z_+yB&ILK?vd@X|53s!+iOp-FDiby_`!jTrlUb|k+s5`+L#|%$=ZY#Y#TMx z>gCiO$bIr{h1d8tT_nA;yHv{tyI>iRjjtPDWy4zU`CEV=C1^+h`w&2)C|4-M*R=lp zoY}h}sjllc&MJSgA#PEy=G@|s3*7Sunt7kJ^%XGhfZQUy>tVRhXy;zVYdf1H3fTu} z^|CBZ8hH0u+vVa1Cxq;HpK~O+?EK-E{$G!lqI991d11}Lm2Tq@#wcs%HoyQ)=nQl*OzJC;mFqZRi7#RK#vf-F zo-axq^K7w)UH;M}JekLxp;h+VR7A`OyxkM}OF01tFo9Q$(#0I^g~Ea>xUEXBUT5Z4 zu317}LR8y6!#&Aq1OBSjh9nV!!sRWl&OA}_w;-p;dVjN2*yv18N6nu#G`Sb+wuz>W ze_wi?ZMTg4M1JC6yVp8~tgiN3!*;;?o{GMh2v#ElHEeiVnP{u^@^0A^v+aAGri$`G zMW~?eepZ{Cyjsa2^ln;b$-dr7{Mpw9KrH*iSun8MI=(MBUSK;*vGpCY5%(SP!U#VG z{uKi8fQ77?oRX)vJ%8#RB)_nS&(nqC?9+(IM;>gx#-O}PnbnpQa6i^yb)q~*@Q!Db zzr)_)cprvK`Z)8ctOcOZ_zK(XK=thKhsh(>u~IMvoVsc}ASwPPIlp9(Ow zW1r6l*x5T@S7(FqMkz87Y~cNzlpys$0_t3lJi9zU&OLLm(SO+@Y>9D#DvH~yn)WRT z;`nL;tWjrvJb%pJ+}=<_T{}U%NL!@CD|J9_lO&91ud=f065H*W*Iu0yB9ue-71%|x z7w_&|4NMvBbU#Aw^%`2Et9<(sbO!gxfXxN6OU7fT~3XTOhs{6GUj80&zYrvKzhfm~#`biMt<|_&aSM z{Qn=;I|m(0a#9E){a&KkH9#2I=WhIryu9D*v`@zP*>!;A{7+qhpJIi-(_el9pZy6X zfoFrwN6;QkP;&jhIt4#BJO4xbfXH}nX7`yKD-d!7mD%&%03|rU(R}u==0pd-fctY+ z^A}m%e@H4EY@pr81PLoke=v0j|4eYk|LbV}>McJX=!*Nd7 zncRIQ(l0cc7$ZU}*#H^ih(HDlj6c|CF%7QH~^v^>SOGZ&dH@rddD2d1W`4}PH;EO zXccBn!8{Fz;iUn&3sD=1a|iXOP5ku{1h!QHt?DHU*dw0bA^i3VxUXPQ0d-Av^voXR z_|^rG;WY_>?hroAH@yGKZUSHdPd(EHh3!)!fk|s3h%ZYZCS*&+)5q3zZZlP_x=jHg zL$Jd+F=>??h%R8D6NTd3?>YVNTl{w{{<|*zyGQ + +# SDS13782 Z-Wave Management Command Class Specification + +*Source:* [SDS13782 Z-Wave Management Command Class Specification.pdf](../sources/SDS13782 Z-Wave Management Command Class Specification.pdf) +*Pages:* 231 +*Generated by:* `tools/pdf2md/convert.py` (PyMuPDF 1.27.1) + + +## Chapters + +- [1 Abbreviations](01-abbreviations.md) +- [2 Introduction](02-introduction/index.md) +- [3 Command Class Overview](03-command-class-overview.md) +- [4 Command Class Definitions](04-command-class-definitions/index.md) diff --git a/docs/specs/network-protocol-command-class-specification/01-abbreviations.md b/docs/specs/network-protocol-command-class-specification/01-abbreviations.md new file mode 100644 index 0000000..322b221 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/01-abbreviations.md @@ -0,0 +1,29 @@ + +# 1 Abbreviations + +| Abbreviation | Explanation | +| --- | --- | +| 6LoWPAN | IPv6 over Low power Wireless Personal Area Networks | +| DHCP | Dynamic Host Configuration Protocol. | +| DNS | Domain Name System | +| FQDN | Fully Qualified Domain Name | +| IP | Internet Protocol | +| Ipv4 | Internet Protocol version 4 | +| Ipv6 | Internet Protocol version 6 | +| LAN | Local Area Network | +| LSB | Less significant bit | +| mDNS | Multicast DNS | +| MSB | Most significant bit | +| NIF | Node Information Frame | +| NOP | No Operation (Command Class) | +| PAN | Personal Area Network | +| WAN | Wide Area Network | +| Z/IP | Z-Wave for IP | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 1 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/02-introduction/02.01-precedence-of-definitions.md b/docs/specs/network-protocol-command-class-specification/02-introduction/02.01-precedence-of-definitions.md new file mode 100644 index 0000000..79617dc --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/02-introduction/02.01-precedence-of-definitions.md @@ -0,0 +1,10 @@ + +# 2.1 Precedence of definitions + +Device Class, Device Type and Command Class Specifications approved as final version during the Device Class, Device Type and Command Class Open Review process have precedence over this document until integrated into this document. diff --git a/docs/specs/network-protocol-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md b/docs/specs/network-protocol-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md new file mode 100644 index 0000000..2c89a90 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/02-introduction/02.02-terms-used-in-this-document.md @@ -0,0 +1,26 @@ + +# 2.2 Terms used in this document + +The key words ”MUST”, ”MUST NOT”, ”REQUIRED”, ”SHOULD”, ”SHOULD NOT”, ”RECOMMENDED”, [”MAY”, and ”OPTIONAL” in this document MUST be interpreted as described in IETF RFC 2119 [6].](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +[Statements containing the IETF RFC 2119 [6] key words are at times marked with unique requirement](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) numbers in the margin. The requirements numbers have the following syntax: CC:xxxx.xx.xx.xx.xxx with each x being an hexadecimal digit. + +This document defines functionalities as deprecated or obsoleted. + +The term “obsolete” means that the functionality MUST NOT be supported in new implementations applying for certification. + +A controller SHOULD provide controlling capabilities of the actual functionality for backwards compatibility with legacy devices. + +The term ”deprecated” also indicates an obsolete definition, but it permits new implementations applying for certification. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 2 of 196 Thus, the term ”deprecated” means that the functionality SHOULD NOT be supported in new implementations applying for certification. Often, another substitute functionality is REQUIRED if the deprecated functionality is implemented. + +A controller SHOULD provide controlling capabilities of the actual functionality for backwards compatibility with legacy devices. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 3 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/02-introduction/index.md b/docs/specs/network-protocol-command-class-specification/02-introduction/index.md new file mode 100644 index 0000000..b4ee0a0 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/02-introduction/index.md @@ -0,0 +1,25 @@ + +# 2 Introduction + +Commands classes are divided in four categories: + + [Application Command Classes [17]](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister)  [Management Command Classes [16]](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister)  [Transport-Encapsulation Command Classes [15]](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister)  Network-Protocol Command Classes + +[The list of defined Command Classes with their associated category is available in [14].](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +This document describes the Command Classes designed for Network or Protocol specific purposes. It includes any command class used for: + + Network or protocol management  Bridging or Z/IP communication  RF related operations + +[Read this document in conjunction with [1] for Z-Wave devices and [10], [11] for Z-Wave Plus devices.](../04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +## Contents + +- [2.1 Precedence of definitions](02.01-precedence-of-definitions.md) +- [2.2 Terms used in this document](02.02-terms-used-in-this-document.md) diff --git a/docs/specs/network-protocol-command-class-specification/03-command-class-overview.md b/docs/specs/network-protocol-command-class-specification/03-command-class-overview.md new file mode 100644 index 0000000..dff91e3 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/03-command-class-overview.md @@ -0,0 +1,14 @@ + +# 3 Command Class Overview + +General Command Class overview and rules are described in the Application Command Class [Specification [17] and are valid for the Command Classes presented in this document..](04-command-class-definitions/04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +No additional considerations apply for the Network-Protocol Command Classes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 4 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.01-inclusion-controller-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.01-inclusion-controller-command-class-version-1.md new file mode 100644 index 0000000..a18fe33 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.01-inclusion-controller-command-class-version-1.md @@ -0,0 +1,125 @@ + +# 4.1 Inclusion Controller Command Class, version 1 + +The Inclusion Controller Command Class is used after a node’s network inclusion between the SIS and an inclusion controller to inform each other of the remaining setup required for the included node. + +Examples of such setup operations could be Z-Wave Plus Lifeline configuration or Security 2 bootstrapping. + +If the S2 bootstrapping is handled by a SIS after the Z-Wave network inclusion has been handled by an inclusion controller, the joining node will detect two different NodeIDs for Network inclusion and S2 bootstrapping. The NodeID of the including controller is not relevant for the authentication of the joining node. Therefore, the joining node MUST NOT abort the S2 bootstrapping in response to a changing NodeID. + +[The SIS, inclusion controller and joining node MUST follow the frame flow illustrated in Figure 1.](04.01-inclusion-controller-command-class-version-1.md#41-inclusion-controller-command-class-version-1) + +![Figure 1 Inclusion Controller frame flow](assets/img-2674b78219.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 6 of 196 The SIS, inclusion controller and joining node MUST comply with the following steps: + +1. Inclusion Controller, C, performs network inclusion of Joining Node, B. 2. Inclusion Controller, C, MUST send Inclusion Controller Initiate to SIS, A, immediately following the network inclusion. 3. SIS, A, MUST request a Node Info Frame from Joining Node, B. 4. Joining Node, B, MUST respond to SIS, A, with a Node Info Frame + +Option 1: If Joining Node B supports S2: + +5. SIS, A, MUST start the Security 2 bootstrapping as described in Security 2 Command Class [[15], including user dialogs.](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) 6. Joining Node, B, MUST accept being S2 bootstrapped by the SIS + +Option 2: If Joining Node, B does not support S2 and supports S0 + +7. If SIS, A wants S0 bootstrapping performed for Joining Node, B, it will send an Inclusion Controller Initiate(S0_INCLUSION) to Inclusion Controller, C 8. Inclusion Controller, C MUST perform S0 bootstrapping if it has the S0 network key after receiving Inclusion Controller Initiate(S0_INCLUSION) 9. Inclusion Controller, C MUST return an Inclusion Controller Complete to SIS, A to indicate if S0 bootstrapping attempt took place and if it was successful. + +Following the Security bootstrapping, regardless whether it failed, successful or was not applicable: + +10. SIS, A, SHOULD perform any probing needed of the Joining Node, B. 11. SIS, A, MUST send an Inclusion Controller Complete Command to the Inclusion Controller, C. 12. Inclusion Controller, C, SHOULD perform any probing needed of the Joining Node, B. + +## 4.1.1 Compatibility Considerations + +### 4.1.1.1 Node Information Frame (NIF) + +A supporting node MUST always advertise the Inclusion Controller Command Class in its NIF, regardless of the security bootstrapping outcome when having the SIS or Inclusion Controller role. + +A supporting node MAY keep or remove the Inclusion Controller Command Class in/from its NIF if it has the primary or secondary controller role. + +### 4.1.1.2 Legacy controllers + +If an Inclusion Controller that does not support the Inclusion Controller Command Class includes a new node in a network, the SIS will never receive an Inclusion Controller Initiate Command. If no Initiate Command has been received approximately 10 seconds after a new node has been added to a network, the SIS SHOULD start interviewing the newly included node (step 10 above). + +If an Inclusion Controller includes a node and the SIS does not support the Inclusion Controller CC:0074.01.00.21.003 Command Class, the Inclusion Controller MUST perform S0 bootstrapping immediately after inclusion if applicable. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 7 of 196 + +## 4.1.2 Inclusion Controller Initiate Command + +This command is used to ask a receiving node to perform specific steps in the inclusion/bootstrapping process. + +The initiate command asks the controller to perform a specific step of the inclusion process. The Inclusion Controller Initiate Command is first sent from an inclusion controller to the SIS, then the SIS MAY choose to perform the rest of the inclusion by itself or it MAY ask the inclusion controller to perform one or more of the inclusion steps. + +This command MUST be sent through highest common Security Class of the SIS and Inclusion Controller, if no common Security Class exists, non-secure is allowed. Inclusion Controllers MUST send this command following a successful network inclusion. It also means that if the SIS receives this command at a less-secure than the highest common Security class, it MUST ignore this command. E.g. Non-secure Initiate Commands MUST be ignored by the SIS, unless the SIS has a record of including the Inclusion Controller non-securely. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INCLUSION CONTROLLER _ _ _ | | | | | | | | +| Command = INITIATE | | | | | | | | +| Node ID | | | | | | | | +| Step ID | | | | | | | | + +Node ID + +This field is used to indicate the NodeID of the node being included. The receiving node MUST perform the steps on the NodeID indicated by this field + +Step ID + +This field is used to indicate which step is to be performed on the specified. [The field MUST comply with Table 1](04.01-inclusion-controller-command-class-version-1.md#412-inclusion-controller-initiate-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 8 of 196 Table 1, Inclusion Controller Initiate::Step ID encoding + +| Value | Identifier | Description | +| --- | --- | --- | +| 0x01 | PROXY INCLUSION _ | This value MUST be used only when:  The sending node is the inclusion controller  The receiving node is the SIS This value is used to indicate the SIS that it MUST take over the node inclusion and perform S2 bootstrapping if relevant. The SIS MUST return an Inclusion Controller Complete Command when the step has been completed. The SIS MAY ask the inclusion controller to perform some of the steps by itself before returning an Inclusion Controller Complete Command. | +| 0x02 | S0 INCLUSION _ | This value MUST be used only when:  The sending node is the SIS  The receiving node is the inclusion controller This value is used to indicate to the inclusion controller that it MUST perform S0 bootstrapping. The inclusion controller MUST reply with an Inclusion Controller Complete Command when the S0 bootstrapping has been performed (or attempted). | +| 0x03 | PROXY INCLUSION REPLACE _ _ | This value MUST be used only when:  The sending node is the inclusion controller  The receiving node is the SIS This value is identical to PROXY INCLUSION but is used in case _ the newly included node has replaced a failed node. This value is used to indicate the SIS that it MUST take over the node inclusion and perform S2 bootstrapping if relevant. The SIS MUST return an Inclusion Controller Complete Command when the step has been completed. The SIS MAY ask the inclusion controller to perform some of the steps by itself before returning an Inclusion Controller Complete Command. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 9 of 196 + +## 4.1.3 Inclusion Controller Complete Command + +This command MUST be sent after a controller has completed the requested inclusion steps. + +This command MUST be sent using the highest common Security Class of the SIS and Inclusion Controller. If no common Security Class exists, non-secure transmission is allowed. + +An inclusion controller MUST perform optional node interview after receiving a Inclusion Controller Complete Command with Step ID, PROXY_INCLUSION. A SIS MUST do its device probe before sending CC:0074.01.02.11.004 the COMPLETE command with step ID PROXY_INCLUSION. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS INCLUSION CONTROLLER _ _ _ | | | | | | | | +| Command = COMPLETE | | | | | | | | +| Step ID | | | | | | | | +| Status | | | | | | | | + +Step ID + +This field is used to indicate the step that has been completed. + +A sending node MUST set this field to the same value as the last received Inclusion Controller Initiate Command. + +Status + +This field is used to indicate the status of the advertised Step ID. [It MUST comply with Table 2.](04.01-inclusion-controller-command-class-version-1.md#413-inclusion-controller-complete-command) + +Table 2, Inclusion Controller Complete::Status encoding + +| Value | Status CODE identifier | Description | +| --- | --- | --- | +| 0x01 | STEP OK _ | The performed step was completed without error. | +| 0x02 | STEP USER REJECTED _ _ | The step was rejected by user | +| 0x03 | STEP FAILED _ | The step failed, because of a communication or protocol error. | +| 0x04 | STEP NOT SUPPORTED _ _ | The step failed, because it Is not supported by the sending node. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 10 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.02-ip-configuration-command-class-version-1-obsoleted.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.02-ip-configuration-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..6f9c377 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.02-ip-configuration-command-class-version-1-obsoleted.md @@ -0,0 +1,169 @@ + +# 4.2 IP Configuration Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST NOT use the IP configuration Command Class. Refer to the Z/IP and Network management Command Classes. + +The IP Configuration Command Class is used to configure network identifiers for IPV4 devices. The intended use of the command class is illustrated in the figure below. + +Z-Wave enabled ISP – DHCP Z-Wave Device IP device Server + +| IP DHCP Request / Respons | e | +| --- | --- | +| | | + +Figure 2, Configuration of network identifiers for IPV4 devices + +In the figure the Z-Wave Remote to the left, sends an IP Configuration Command to the Z-Wave enabled IP device, telling it to acquire its configuration using DHCP. The Z-Wave enabled IP device will now perform a standard DHCP IP request to the DHCP server over an IP based network. + +Another example might be where the Z-Wave Remote statically configures the Z-Wave enabled IP device with fixed IP, subnet, DNS etc. by sending an IP Configuration Command. + +Note that this class is only intended for IPV4 and not IPV6 support. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 11 of 196 + +## 4.2.1 IP Configuration Set Command + +The IP Configuration Set Command used to configure IPV4 settings in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP CONFIGURATION _ _ _ | | | | | | | | +| Command = IP CONFIGURATION SET _ _ | | | | | | | | +| Reserved | | | | | | Auto IP | Auto DNS | +| IP Address 1 | | | | | | | | +| IP Address 2 | | | | | | | | +| IP Address 3 | | | | | | | | +| IP Address 4 | | | | | | | | +| Subnet Mask 1 | | | | | | | | +| Subnet Mask 2 | | | | | | | | +| Subnet Mask 3 | | | | | | | | +| Subnet Mask 4 | | | | | | | | +| Gateway 1 | | | | | | | | +| Gateway 2 | | | | | | | | +| Gateway 3 | | | | | | | | +| Gateway 4 | | | | | | | | +| DNS1 1 | | | | | | | | +| DNS1 2 | | | | | | | | +| DNS1 3 | | | | | | | | +| DNS1 4 | | | | | | | | +| DNS2 1 | | | | | | | | +| DNS2 2 | | | | | | | | +| DNS2 3 | | | | | | | | +| DNS2 4 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 12 of 196 Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Auto IP (1 bit) + +If Auto IP bit is set, the following fields are ignored: IP Address, Subnet Mask, and Gateway. And are allocated by DHCP or BOOTP instead. + +Auto DNS (1 bit) + +The Auto DNS if set indicates to ignore DNS1 and DNS2 and allocate DNS by DHCP instead. Note that some devices might not support Auto DNS without Auto IP set. + +IP Address (32 bits) + +The IP Address indicates the static IP address of the device itself. The first byte is the most significant byte. + +Subnet mask (32 bits) + +The Subnet Mask determines the portion of the IP address that represents the subnet. The first byte is the most significant byte. + +Gateway (32 bits) + +The Gateway indicates the default gateway that serves as an access point to another network. The first byte is the most significant byte. + +DNS1 (32 bits) + +The DNS1 allows the use of domain name system (DNS) server names instead of using numerical IP addresses for management packet routing. In case the device will not need DNS, and SHOULD NOT query it from DHCP then leave field as all zeroes. The first byte is the most significant byte. + +DNS2 (32 bits) + +The DNS2 provides a secondary DNS server name. In case only one DNS server is available or the device will not need DNS then leave field as all zeroes. The first byte is the most significant byte. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 13 of 196 + +## 4.2.2 IP Configuration Get Command + +The IP Configuration Get Command is used to request the IPV4 settings in a device. + +The IP Configuration Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP CONFIGURATION _ _ _ | | | | | | | | +| Command = IP CONFIGURATION GET _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 14 of 196 + +## 4.2.3 IP Configuration Report Command + +The IP Configuration Report Command used to return IPV4 settings in a device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP CONFIGURATION _ _ _ | | | | | | | | +| Command = IP CONFIGURATION REPORT _ _ | | | | | | | | +| Reserved | | | | | | Auto IP | Auto DNS | +| IP Address1 | | | | | | | | +| IP Address2 | | | | | | | | +| IP Address3 | | | | | | | | +| IP Address4 | | | | | | | | +| Subnet Mask1 | | | | | | | | +| Subnet Mask2 | | | | | | | | +| Subnet Mask3 | | | | | | | | +| Subnet Mask4 | | | | | | | | +| Gateway1 | | | | | | | | +| Gateway2 | | | | | | | | +| Gateway3 | | | | | | | | +| Gateway4 | | | | | | | | +| DNS11 | | | | | | | | +| DNS12 | | | | | | | | +| DNS13 | | | | | | | | +| DNS14 | | | | | | | | +| DNS21 | | | | | | | | +| DNS22 | | | | | | | | +| DNS23 | | | | | | | | +| DNS24 | | | | | | | | +| LeaseTime1 | | | | | | | | +| LeaseTime2 | | | | | | | | +| LeaseTime3 | | | | | | | | +| LeaseTime4 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 15 of 196 Refer to explanation of parameters in IP Configuration Set Command description. + +Lease Time (32 bits) + +The lease time specifies the time the IP address has been granted, if Auto IP is being used (in seconds). If the device does not know its lease period it MUST return 0 for the lease time fields. + +## 4.2.4 IP Configuration DHCP Release Command + +The IP Configuration DHCP Release Command used to release the DHCP lease. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP CONFIGURATION _ _ _ | | | | | | | | +| Command = IP CONFIGURATION RELEASE _ _ | | | | | | | | + +## 4.2.5 IP Configuration DHCP Renew Command + +The IP Configuration DHCP Renew Command used to force the renewal of the DHCP lease. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS IP CONFIGURATION _ _ _ | | | | | | | | +| Command = IP CONFIGURATION RENEW _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 16 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.03-mailbox-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.03-mailbox-command-class-version-1.md new file mode 100644 index 0000000..f45c866 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.03-mailbox-command-class-version-1.md @@ -0,0 +1,274 @@ + +# 4.3 Mailbox Command Class, version 1 + +The Mailbox Command Class is intended for IP based gateway deployments with distributed mailbox resources. One example is a constrained gateway device which is offloaded by another IP host with sufficient memory to host the Mailbox Service. The Mailbox Service may be hosted by a LAN host or an Internet server. + +The Mailbox Command Class allows any mailbox capable device to either make itself into a Mailbox Service, or utilize another Mailbox Service in the network. + +## 4.3.1 Mailbox Framework + +The Mailbox Command Class describes a framework that consists of two specific Mailbox Modes described below: + +1. Mailbox Proxy, which forwards mailbox requests to a Mailbox Service. + +2. Mailbox Service, which accepts the forwarded mailbox requests and stores them until the designated recipient announces that it is awake. + +A mailbox device MAY support one or both of the two Mailbox Modes. However, a mailbox device MUST NOT take both Mailbox Modes in a network. + +Before configuring Mailbox Proxy forwarding, a configuring node MUST ensure that the forwarding and receiving devices support their respective required modes. The information can be found using the Mailbox Configuration Get Command and Mailbox Configuration Report Command. + +### 4.3.1.1 Mailbox Proxy + +The Mailbox Proxy device forwards all received frames that are destined for a non-listening node to the configured Mailbox Service. Before forwarding the frame, it MUST be attempted to send the frame to the node first as it may be awake following a manual activation or inclusion. If the Mailbox Proxy can deliver the frame to the non-listening node, the Mailbox Proxy MUST NOT forward the frame to the Mailbox Service. + +The Mailbox Proxy MUST support the Wake Up Command Class. + +### 4.3.1.2 Mailbox Service + +The Mailbox Service serves as a conventional mailbox, with the addition that it may receive forwarded frames from a Mailbox Proxy. A Mailbox Service may have a finite mailbox queue capacity, which is reported in the Mailbox Configuration Report. The Mailbox Service MUST NOT communicate with a Z/IP client directly, since it may not be able to route messages to the client. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 17 of 196 + +### 4.3.1.3 Frame flow + +[Figure 3 illustrates the communication between a Z/IP Client (1) attempting communication to a non-](04.03-mailbox-command-class-version-1.md#4313-frame-flow) listening node (4). The communication is passing through the Mailbox Proxy (2) which initially will attempt direct communication with (4). If failing to reach (4), the frame will be forwarded to the Mailbox Service (3) using the Mailbox Queue Command with Push Operation. + +Following the Mailbox Queue push, the Mailbox Service will send a Mailbox Queue Command with Waiting Operation to the proxy, piggybacking the original UDP command on the message. The Proxy will build a ”NACK Waiting” Z/IP Command targeted for the Z/IP node, based on the piggy backed message from the Proxy Service. The Proxy Service MUST also append the Expected Delay header extension to the ”NACK Waiting” Z/IP Command. This step MUST be repeated every 60s seconds as long as the message is in the mailbox. + +Upon wake-up, the non-listening node (4) will transmit a Wake Up Notification to the Mailbox Proxy (2), which must be configured using the Wake Up Command Class. Whenever the Mailbox Proxy (2) receives a Wake Up Notification, the notification will be forwarded as a Z/IP Packet to the Mailbox Service (4). The Mailbox Service inspects the queue to see if there are any frames for (4) and responds with either an empty Mailbox Queue Command Pop operation with ”Last” bit set to 1 or any frames that may be in queue, finishing with the last frame having ”Last” bit set to 1. + +Mailbox Proxy (2) receives the Mailbox Queue Pop frame on which it performs a Virtual Node Rewrite to match the original sender of the UDP frame of the Mailbox Queue Pop command. The frame is sent from the virtual node to (4) followed by a ”Wake Up No More Information” Command. Any eventual reports will be replied to the virtual node that forwards them to (1). The proxy MUST send a Mailbox Queue Command with ACK operation to the Proxy Service when it has delivered the frame and potentially the ”No more information” + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 18 of 196 + +![Figure 3, Mailbox Frame flow](assets/img-2bd7dd5ad6.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 19 of 196 + +## 4.3.2 Mailbox Configuration Get Command + +The Mailbox Configuration Get Command is used to request the Mailbox configuration from a supporting device. + +The Mailbox Configuration Report command MUST be returned in response to a Mailbox Configuration Get command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MAILBOX _ _ | | | | | | | | +| Command = MAILBOX CONFIGURATION GET _ _ | | | | | | | | + +## 4.3.3 Mailbox Configuration Set Command + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MAILBOX _ _ | | | | | | | | +| Command = MAILBOX CONFIGURATION SET _ _ | | | | | | | | +| Reserved | | | | | Mode | | | +| Forwarding Destination Ipv6 Address – Byte 1 | | | | | | | | +| … | | | | | | | | +| Forwarding Destination Ipv6 Address – Byte 16 | | | | | | | | +| UDP Port Number – Byte 1 | | | | | | | | +| UDP Port Number – Byte 2 | | | | | | | | + +Reserved (5 bits) + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (3 bits) + +The Mode field is used to advertise the Mailbox mode to be configured in the node. This field MUST be [encoded according to Table 3.](04.03-mailbox-command-class-version-1.md#433-mailbox-configuration-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 20 of 196 Table 3, Mailbox Configuration Set::Mode encoding + +| Value | Description | +| --- | --- | +| 0x00 | Disable Mailbox Service Disable Mailbox Proxy forwarding | +| 0x01 | Enable Mailbox Service | +| 0x02 | Enable Mailbox Proxy forwarding | + +Forwarding Destination Ipv6 Address (16 bytes) + +If the Mailbox Proxy Forwarding is enabled in the Mode field, the Forwarding Destination Ipv6 Address field MUST specify the Forwarding Destination Ipv6 Address. The field MUST specify an Ipv6 formatted address of the Mailbox Service to receive forwarded mailbox packages. If the Forwarding Destination is [identified by an Ipv4 address this field MUST be formatted as an Ipv4-mapped Ipv6 address [8].](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +If the Mailbox Proxy Forwarding is not enabled in the Mode field, the Forwarding Destination Ipv6 Address MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +UDP Port Number (2 bytes) + +This field indicates the UDP Port number of the Mailbox Service running at the Forwarding Destination. + +If the Mailbox Proxy Forwarding is not enabled in the Mode field, this field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.3.4 Mailbox Configuration Report Command + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MAILBOX _ _ | | | | | | | | +| Command = MAILBOX CONFIGURATION REPORT _ _ | | | | | | | | +| Reserved | | | Supported Modes | | Mode | | | +| Mailbox Capacity – Byte 1 | | | | | | | | +| Mailbox Capacity – Byte 2 | | | | | | | | +| Forwarding Destination Ipv6 Address – Byte 1 | | | | | | | | +| … | | | | | | | | +| Forwarding Destination Ipv6 Address – Byte 16 | | | | | | | | +| UDP Port Number – Byte 1 | | | | | | | | +| UDP Port Number – Byte 2 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 21 of 196 Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Supported Modes (2 bits) + +The Supported Modes bit field is used to advertise the functionalities supported by the node. This field [MUST be encoded according to Table 4](04.03-mailbox-command-class-version-1.md#434-mailbox-configuration-report-command) + +Table 4, Mailbox Configuration Report::Supported Modes encoding + +| Bit Value | Description | +| --- | --- | +| 0x01 | Mailbox Service supported | +| 0x02 | Mailbox Proxy supported | + +Mode (3 bits) + +[Refer to 4.3.3 Mailbox Configuration Set Command.](04.03-mailbox-command-class-version-1.md#432-mailbox-configuration-get-command) + +Mailbox Capacity (2 bytes) + +This field advertises the number of frames (at a maximum of 1280 bytes per frame) that may be stored in the mailbox while waiting for a Wake Up Notification. + +A value of 0 MUST indicate that the mailbox will only support mailbox forwarding to another Mailbox Service. + +A value of 0xFFFF MUST indicate that the mailbox in effect have no storage limitation. + +Forwarding Destination Ipv6 Address (16 bytes) + +[Refer to 4.3.3 Mailbox Configuration Set Command.](04.03-mailbox-command-class-version-1.md#432-mailbox-configuration-get-command) + +UDP Port Number (2 bytes) + +[Refer to 4.3.3 Mailbox Configuration Set Command.](04.03-mailbox-command-class-version-1.md#432-mailbox-configuration-get-command) + +## 4.3.5 Mailbox Queue Command + +The Mailbox Queue Command is a container for various operations between a mailbox proxy and a Mailbox Service. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 22 of 196 + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MAILBOX _ _ | | | | | | | | +| Command = MAILBOX QUEUE _ | | | | | | | | +| Reserved | | | | Last | Operation | | | +| Queue Handle | | | | | | | | +| Mailbox Entry – Byte 1 | | | | | | | | +| … | | | | | | | | +| Mailbox Entry – Byte N | | | | | | | | + +Reserved (6 Bit) + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Last (1 bit) + +The Last field is used to indicate if the current mailbox frame is the last in the queue for the specific device. The Last bit only applies when the ”Pop” Operation is used. + +The value 1 MUST indicate that the frame is the last on the queue. + +The value 0 MUST indicate that more frames will follow. + +Operation (3 bits) + +[The encoding of the Operation field MUST be according to Table 5.](04.03-mailbox-command-class-version-1.md#435-mailbox-queue-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 23 of 196 Table 5, Mailbox Queue::Operation + +| Value | Description | +| --- | --- | +| 0x00 | Push. Queue a message from the proxy to the Mailbox Service | +| 0x01 | Pop. Dequeue a message from the Mailbox Service to the Mailbox Proxy for delivery on the PAN | +| 0x02 | Waiting. Service->Proxy: send waiting messages to the client. | +| 0x03 | Ping. Service->Proxy: send UDP ping messages to the client. | +| 0x04 | ACK. Proxy->Service: Frame has been delivered. Service->Proxy: Frame has been queued. | +| 0x05 | NACK. Proxy->Service: Frame was not queued. Wait for ACK before attempting queuing. Service->Proxy: Node is not responding. Keep in queue. | +| 0x06 | Queue Full. Proxy->Service: The capacity of the Mailbox Service has been reached. Wait until queue has been emptied. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Queue Handle (8 bits) + +The Queue Handle field is used to identify the queue this message belongs to. A service uses this handle with the source IP of the MAILBOX_QUEUE message to identify the queue to which a message belongs to. + +Mailbox Entry (N Bytes) + +The Mailbox Entry field contains the entire received UDP Package. Including, ZIP headers and Z-Wave Payload. + +To avoid duplicate entries, the Mailbox Service MUST maintain a list of CRC16 checksums for each mailbox entry. All mailbox entries MUST be unique, if a matching CRC16 exists for an incoming package, the incoming package MUST be discarded. + +When WAITING timer elapses the mailbox MUST send a WAITING message to all clients that has posted entries to the mailbox. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 24 of 196 + +## 4.3.6 Mailbox Wake Up Notification Command + +This command allows a mailbox proxy resource to notify a Mailbox Service resource that a wake up device is currently awake. + +A Mailbox Proxy resource MAY send this command to a Mailbox Service resource. A Mailbox Service resource MUST NOT send this command to a mailbox proxy resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MAILBOX _ _ | | | | | | | | +| Command = MAILBOX WAKEUP NOTIFICATION _ _ | | | | | | | | +| Queue Handle | | | | | | | | + +Queue Handle (8 bits) + +This field is used to specify the actual queue handle to send notification to. + +## 4.3.7 Mailbox Failing Node Command + +This command allows a mailbox proxy resource to notify a Mailbox Service resource that a wake up device is no longer available. + +A Mailbox Proxy resource MAY send this command to a Mailbox Service resource. A Mailbox Service resource MUST NOT send this command to a mailbox proxy resource. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS MAILBOX _ _ | | | | | | | | +| Command = MAILBOX NODE FAILING _ _ | | | | | | | | +| Queue Handle | | | | | | | | + +Queue Handle (8 bits) + +This field is used to specify the actual queue. + +A receiving Mailbox Service resource MUST discard all state information and enqueued messages for the actual queue. + +## 4.3.8 Frame Flow diagrams Examples + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 25 of 196 + +![Figure 4, Mailbox proxy queue full frame flow](assets/img-dde52d6732.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 26 of 196 + +![Figure 5, Normal frame flow](assets/img-fa2278fdcf.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 27 of 196 + +![Figure 6, Z/IP Client goes offline and stops replying to UDP ping](assets/img-c95b8ef8eb.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 28 of 196 + +![Figure 7, Sleeping node misses 2 wakeup intervals and proxy tells service to flush queue](assets/img-a5a5560659.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 29 of 196 + +![Figure 8 Mailbox Service is offline](assets/img-d9e53f1b09.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 30 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.04-mailbox-command-class-version-2.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.04-mailbox-command-class-version-2.md new file mode 100644 index 0000000..4fbf9ee --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.04-mailbox-command-class-version-2.md @@ -0,0 +1,30 @@ + +# 4.4 Mailbox Command Class, version 2 + +The Mailbox Command Class, version 2 introduces a better handling of Wake Up periods for Wake Up nodes. + +Z/IP Clients are partly responsible for issuing controlling commands to supporting nodes and conduct the minimum required interview for each Command Class of a supporting node. A Z/IP Gateway supporting the Mailbox Command Class, version 2 indicates to the Z/IP Client that the Wake Up Command Class minimum interview will be fully conducted by the Z/IP Gateway and the Z/IP Client MUST NOT send any Wake Up Command Class commands, when the mailbox service is enabled. + +With the Mailbox service enabled: + + If either the Z/IP Client or Gateway supports Mailbox Command Class, version 1, the Z/IP Client MUST issue a Wake Up No More Information Command when it has completed its interview of a sleeping node.  If both the Z/IP Client or Gateway support Mailbox Command Class, version 2 or newer, the Z/IP Client MUST NOT issue a Wake Up No More Information Command when it has completed its interview of a sleeping node. + +## 4.4.1 Examples and frame flows + +### 4.4.1.1 Node interview process + +[The node interview process is shown in Figure 9 and Figure 10. The requirement applies as soon as a](04.04-mailbox-command-class-version-2.md#4411-node-interview-process) client has received a Node Add Status (ADD_NODE_STATUS_DONE) command, regardless of who initiated the node inclusion. + +![Figure 9,Node interview with Mailbox v1](assets/img-663fb7b675.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 31 of 196 + +![Figure 10, Node Interview with Mailbox v2](assets/img-f5c5271e57.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 32 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.01-compatibility-considerations.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.01-compatibility-considerations.md new file mode 100644 index 0000000..5fae8e7 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.01-compatibility-considerations.md @@ -0,0 +1,51 @@ + +# 4.5.1 Compatibility considerations + +The commands defined in the following sections may span more than the available payload length in Z- Wave frames. If the command payload does not fit in a single frame, commands MUST be fragmented using the Transport Service Command Class. + +When using IP transport, the IP UDP data segment length limit of 1280 bytes MUST be respected. + +There is a risk that a controlling node would try to issue Network Management commands to a controller which does not support functionality due to its Network role (i.e. Secondary controller). A controller SHOULD adjust its NIF (or S0/S2 Commands Supported Report Command) based on its network role after inclusion. + +When a node has the SIS, Primary controller or Inclusion controller role, it MUST support: + + Network Management Inclusion Command Class  Network Management Basic Command Class  Transport Service Command Class + +When a node has the secondary controller role, it MUST support: + + Network Management Basic Command Class + +The Z-Wave Network Management commands are organized as follows + +| Command Class | Purpose | +| --- | --- | +| Network Management Proxy | The command class is used to report the list of nodes present in a Z- Wave Network and report the secure/non-secure capabilities of each of those nodes Version 2 of this command class extends the node capability reporting to Multi Channel End Points. | +| Network Management Basic Node | The command class is used to remotely control network management operations related to including supporting nodes into a Z-Wave network. The available functionalities are :  Enable Learn mode  Request a node to broadcast its Node Information Frame  Request a node to request a network topology update to the SUC  Reset a controller to the factory default state Version 2 of this command class extends the learn mode activation commands In order to support S2 and adds the following functionality:  Request a node to report its S2 DSK. | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 33 of 196 + +| Command Class | Purpose | +| --- | --- | +| Network Management Inclusion | This command class is used to remotely control network management operations related to including other nodes into a Z-Wave network. The available functionalities are :  Enable Add mode  Remove a node from the network  Remove a Failed NodeID from the network  Replace a Failed NodeID in the network  Request the node to ask a specific node to perform a Neighbor update.  Instruct the supporting node to assign a return route to another slave node  Instruct the supporting node to remove return routes in another slave node Version 2 of this command class extends the Add/Remove/Replace commands to support S2 and adds the following functionality:  A supporting node can be instructed which S2 keys to grant to a joining node.  A supporting node can be provided a DSK input for S2 authentication. | +| Network Management Primary | This command class is used to remotely trigger a controller change operation. | +| Network Management Installation and maintenance | This command class is used for maintenance and optimization purposes. The available functionalities are :  Manipulate priority routes (working routes)  Request network statistics recorded by the node. | + +## 4.5.1.1 Sequence Number management + +The following text applies to all sequence numbers used by Network Management Command Classes. + +Each sequence number MUST be generated from an 8-bit counter that is incremented by 1 whenever a new sequence number is generated. When a node powers up, the sequence counter MUST be initialized to a random value. + +All command classes referring to this section MAY use the same global counter. + +When responding to a request command, a responding node MUST echo the sequence number used by the requesting node. + +When receiving response to a request command, the requesting node MUST verify that the response carries the same sequence number as the request command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 34 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.02-scope-of-network-management.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.02-scope-of-network-management.md new file mode 100644 index 0000000..edbdf92 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.02-scope-of-network-management.md @@ -0,0 +1,32 @@ + +# 4.5.2 Scope of Network Management + +Network management commands may be used in a number of scenarios. Three scopes have been identified: + +| <> gement m | +| --- | --- | + +| <> Call-center Manag System for hom | ement es | +| --- | --- | + +Figure 11, Scope of network management + +## 4.5.2.1 Intranode + +When used in an intranode configuration, the network management command classes are primarily used for implementation convenience. As an example, a software module of the Z/IP Gateway application may be used to provide a standard IP-based interface for other Linux applications inside a set-top box. In this way an application programmer does not have to bother about serial port communication, Telnet command parsing, etc. + +## 4.5.2.2 Intranet (LAN) + +Managed building automation systems may implement one central network manager controlling a number of geographically distributed Z/IP Gateways via the network management command classes. Each Z/IP Gateway may be instructed to perform local inclusion or exclusion of nodes; thus creating a large infrastructure segmented into subnets. + +## 4.5.2.3 Internet (WAN) + +The help desk of a service provider may provide support from a remote call center via the Internet. This enables the deployment of border routers, remote controls and plug-in modules in consumer environments without relying on the technical interest and/or capabilities of the user. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 35 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.03-security-considerations.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.03-security-considerations.md new file mode 100644 index 0000000..6e328fc --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.03-security-considerations.md @@ -0,0 +1,34 @@ + +# 4.5.3 Security considerations + +Network management is a powerful toolbox. From an application level, it SHOULD be ensured that the user does not unintentionally reset the controller or remove nodes. + +At the same time it MUST be ensured that it is not possible for unauthorized persons to inject malicious commands into the network, e.g. resetting the primary controller to default factory settings. + +All Network Management Command Class MUST be sent securely when used on a Z-Wave network, using at least Z-Wave Security 0 Command Class, version 1. When used on the LAN side other means of security should be used. + +If the network management commands are carried in IP packets over Z-Wave, a minimum level of security is automatically applied since S0 network security is mandatory for all Z/IP traffic. + +When Z-Wave network management commands are carried over IP LAN and WAN media (intranet & internet) the IP traffic SHOULD be using secure communication. A Z/IP Gateway MAY allow a LAN-based IP host to send un-encrypted Network Management commands to a controller via the Z/IP Gateway. Support for un-encrypted Network Management commands SHOULD be disabled by default and after a factory reset. + +## 4.5.3.1 Designing for single-threading and limited transmit buffer + +In order to support constrained CPU platforms, the Z-Wave API has been designed for single-threaded operation. A node MUST ignore Network Management command if already processing or executing CC:0000.00.00.41.003 another Network Management command. + +A node SHOULD NOT ignore the command if it is identical to the command currently being processed/executed (e.g. Add Node Command with mode: Stop when Add Mode is active) + +A node MUST return status messages to the node that actually initiated the operation. + +An controlling node MUST time out waiting for a status message. The time out SHOULD depend on the actual command. If not receiving a status message within the defined time out for a command, the CC:0000.00.00.42.004 node SHOULD re-send the Network Management command using the same sequence number to allow the target node to detect duplicates. + +A receiving node MAY return a ”busy” indication. Doing so could however lead to transmit buffer overflows. Care should be taken to avoid this during implementation. + +The Z-Wave Ack does not necessarily indicate that the command is being executed, but that it has been CC:0000.00.00.41.006 received by the protocol. The sending application MUST wait for the Network Management command callback, or time out. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 36 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.04-network-management-proxy-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.04-network-management-proxy-command-class-version-1.md new file mode 100644 index 0000000..8271422 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.04-network-management-proxy-command-class-version-1.md @@ -0,0 +1,222 @@ + +# 4.5.4 Network Management Proxy Command Class, version 1 + +The Network Management Proxy Command Class provides functions to access basic network information such as the list of nodes currently present in the Z-Wave network. + +## 4.5.4.1 Node List Get Command + +This command is used to request the network node list from local storage in a node. + +[The Node List Report Command MUST be returned in response to this command.](04.05.04-network-management-proxy-command-class-version-1.md#4542-node-list-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The CC:0052.01.01.11.003 Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = COMMAND NODE LIST GET (0x01) _ _ _ | | | | | | | | +| Seq No | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 37 of 196 + +## 4.5.4.2 Node List Report Command + +This command carries node data requested with the Node List Get Command. + +In addition, when a node has been added to or removed from the network or when the Z/IP Gateway has acquired the SIS role, the Z/IP Gateway MUST send an unsolicited Node List Report with the new CC:0052.01.02.11.001 network information to the unsolicited destination. If the unsolicited destination itself has initiated the node addition or removal, this command SHOULD NOT be sent. If no unsolicited destination has been set, the gateway MUST NOT send a Node List Report upon network changes. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = COMMAND NODE LIST REPORT (0x02) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Node List Controller ID | | | | | | | | +| Node List Data 1 | | | | | | | | +| … | | | | | | | | +| Node List Data 29 | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Status (8 bits) + +This field indicates the status of Node List data carried in the command. The field MUST take one of the following values:  0x00: The Node List Data contains the latest updated node list.  0x01: The Node List Data may be outdated. + +Node List Controller ID (1 byte) + +The Node List Controller ID is a NodeID pointing at a controller, which keeps latest updated node list. The value 0x00 indicates that Node List Controller ID is unknown. + +The Node List Controller SHOULD provide up-to-date information, but the actual freshness of data depends on the network construction. If a portable controller is primary there may be no access to the most recent network data. In that case the user may have to manually wake up the portable controller and initiate a controller replication to an always listening secondary controller. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 38 of 196 No explicit Z-Wave route is provided for reaching the Node List Controller. The requesting node may use methods such as explorer discovery or Controller Network Update if the node does not already hold a working route to the indicated Node List Controller. + +The Node List Controller ID may not support Network Management Proxy Command Class. + +Node List Data (29 bytes) + +This field carries a complete bitmap presenting all included nodes as a set bit (‘1’) while unused NodeIDs are presented as a (‘0’). The first bit in the bitmap represents NodeID 1; the last bit represents NodeID 232. + +A receiving node can use the Node Info Cached Get Command to get information on individual node properties. + +## 4.5.4.3 Node Info Cached Get Command + +This command is used to request node capabilities that have been cached by another node. The command works as a proxy function provided by the node list controller. The purpose is to preserve the bandwidth of the Z-Wave network and to provide access to properties of sleeping nodes. + +[The Node Info Cached Report Command MUST be returned in response to this command.](04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +A Z/IP client MAY issue the Node Info Cached Get command as an IPv4 broadcast or an IPv6 ‘all routers’ multicast packet. A Z/IP Gateway MUST accept such a packet and return a Node Info Cached Report in CC:0052.01.03.11.002 response. + +A Node Info Cached Report returned by a Z/IP Gateway in response to an IP multicast packet MUST be delayed by a random delay in the range 0..450msec as more than one Z/IP Gateway may be responding. The Z/IP Gateway MUST respond to an IP multicast by returning a unicast IP packet. A Z/IP Client MAY time out waiting for Node Info Cached Report commands after 500msec. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = COMMAND NODE INFO CACHED GET (0x03) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | Max Age | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 39 of 196 Max Age (4 bits) + +The maximum age of the Node Info frame, given in 2^n minutes. If the cache entry does not exist or if it is older that the value given in this field, the Z/IP Gateway SHOULD attempt to get a fresh Node Info Frame before responding to this command. + +A value of 15 means infinite, i.e. No Cache Refresh. A value of 0 means force update. The values 1..15 allow for cache timeouts in the range 2min, 4min, …, 11days – and infinite. + +NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. The value 0x00 MUST be interpreted as the ID of the queried network management node. + +## 4.5.4.4 Node Info Cached Report Command + +This command is used for returning cached node information. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = COMMAND NODE INFO CACHED REPORT (0x04) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | Age | | | | +| List. | Z-Wave Protocol Specific Part | | | | | | | +| Opt. Func. | Z-Wave Protocol Specific Part | | | | | | | +| Reserved | | | | | | | | +| Basic Device Class | | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | + + *) Command classes may be extended spanning two bytes for one command class + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 40 of 196 Status (4 bits) + +This field is used to indicate the Node Info Cached information status. CC:0052.01.04.11.001 [This field MUST comply with Table 6.](04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Table 6, Node Info Cached Report::Status parameter encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x00 | STATUS OK _ | The requested NodeID could be found and up-to-date information is returned. | +| 0x01 | STATUS NOT RESPONDING _ _ | The requested NodeID could be found but fresh information could not be retrieved. | +| 0x02 | STATUS UNKNOWN _ | The NodeID is unknown. | + +Age (4 bits) + +This field indicates the age of the Node Info frame, i.e. the time elapsed since the data has been received by the actual node. This field MUST be expressed in ”2^n minutes”. This field’s value MUST be rounded down, i.e.12 minutes MUST be reported as 2^3 = 8 minutes and not as 2^4 = 16 min. + +List. (1 bit) + +The listening bit is set to 1 if this node is always listening for commands and 0 if the node does not listen for commands. + +Opt. Func. (1 bit) + +The Optional Functionality bit indicates if true ( == ‘1’) the node supports more command classes in addition to the ones covered by the device classes listed in this message. The additional command classes follow the device class fields. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Z-Wave Protocol Specific Part + +This field is the protocol specific part of the NIF. It MUST be set as received in the Node Information Frame. + +Basic Device Class (1 byte) + +[This field indicates the Basic Device Class of the actual node. The Basic Device Classes are listed in [1]](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +Generic Device Class (1 byte) + +This field indicates the Generic Device Class of the actual node. The Generic Device Classes are listed in [[1] for Z-Wave and [10], [11] for Z-Wave Plus](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 41 of 196 Specific Device Class (1 byte) + +This field indicates the Specific Device Class of the actual node. The Specific Device Classes are listed in [[1] for Z-Wave and [10], [11] for Z-Wave Plus](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +Command Class (N bytes) + +This field indicates the command classes implemented by the actual node. + +The Security Scheme 0 Mark MUST be used to delimit Command Classes available non-securely and securely. + +The Support/Control Mark MUST be used before and after the Security Scheme 0 Mark if it was present in the node’s NIF. + +[A Command Class field structure example is shown in Table 7. The field MUST comply with Table 8.](04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Table 7, Command Class field structure example + +| Description | Command Class field content | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| Non-secure Supported Command Classes | Command Class 1 *) | | | | | | | | +| | … | | | | | | | | +| | Command Class M *) | | | | | | | | +| Support/Control Mark | 0xEF | | | | | | | | +| Non-secure Controlled Command Classes | Command Class 1 *) | | | | | | | | +| | … | | | | | | | | +| | Command Class K *) | | | | | | | | +| Security Scheme 0 Mark | 0xF1 | | | | | | | | +| | 0x00 | | | | | | | | +| S0 Secure Supported Command Classes | Command Class 1 *) | | | | | | | | +| | … | | | | | | | | +| | Command Class L *) | | | | | | | | +| Support/Control Mark | 0xEF | | | | | | | | +| S0 Secure Controlled Command Classes | Command Class 1 *) | | | | | | | | +| | … | | | | | | | | +| | Command Class P *) | | | | | | | | + + *) Command classes may be extended spanning two bytes for one command class + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 42 of 196 Table 8, Special Command Class identifiers + +| Command Class ID | Description | +| --- | --- | +| 0x20..0xEE | Command Class identifier | +| 0xF101..0xFFFF | Extended Command Classes identifier | +| 0xEF | Command Class Support/Control Mark Anything between this mark and the next mark is Controlled and not supported | +| 0xF100 | Security Scheme 0 Command Class Mark. Command Classes following this Mark are supported or controlled with Security Scheme 0 | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 43 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.05-network-management-proxy-command-class-version-2.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.05-network-management-proxy-command-class-version-2.md new file mode 100644 index 0000000..0ce159b --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.05-network-management-proxy-command-class-version-2.md @@ -0,0 +1,277 @@ + +# 4.5.5 Network Management Proxy Command Class, version 2 + +## 4.5.5.1 Compatibility considerations + +The Network Management Proxy Command Class, version 2 is backwards compatible with Network Management Proxy Command Class, version 1. A node supporting Network Management Proxy Command Class, version 2 MUST also support Network Management Proxy Command Class, version 1. + +All commands not mentioned in this version remain unchanged from version 1. + +The following command has been extended to support S2 bootstrapping information: + + [Node Info Cached Report](04.05.05-network-management-proxy-command-class-version-2.md#4552-node-info-cached-report-command) + +The following commands have been added to support Multi Channel End Point probing: + + [Network Management Multi Channel End Point Get Command](04.05.05-network-management-proxy-command-class-version-2.md#4553-network-management-multi-channel-end-point-get-command)  [Network Management Multi Channel End Point Report Command](04.05.05-network-management-proxy-command-class-version-2.md#4554-network-management-multi-channel-end-point-report-command)  [Network Management Multi Channel Capability Get Command](04.05.05-network-management-proxy-command-class-version-2.md#4555-network-management-multi-channel-capability-get-command)  [Network Management Multi Channel Capability Report Command](04.05.05-network-management-proxy-command-class-version-2.md#4556-network-management-multi-channel-capability-report-command)  [Network Management Multi Channel Aggregated Members Get Command](04.05.05-network-management-proxy-command-class-version-2.md#4557-network-management-multi-channel-aggregated-members-get-command)  [Network Management Multi Channel Aggregated Members Report Command](04.05.05-network-management-proxy-command-class-version-2.md#4558-network-management-multi-channel-aggregated-members-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 44 of 196 + +## 4.5.5.2 Node Info Cached Report Command + +This command is used for returning cached node information. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = COMMAND NODE INFO CACHED REPORT (0x04) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | Age | | | | +| List. | Z-Wave Protocol Specific Part | | | | | | | +| Opt. Func. | Z-Wave Protocol Specific Part | | | | | | | +| Granted Keys | | | | | | | | +| Basic Device Class | | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | + +*) Command classes may be extended  spanning two bytes for one command class Fields not described in this version remain unchanged from version 1. + +Granted Keys (8 bits) + +This field is used to indicate which network keys were granted during bootstrapping. [This field MUST be treated as a bitmask and comply with Table 28](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 45 of 196 Command Class (N bytes) + +[Refer to 4.5.4.4 Node Info Cached Report Command and Table 8.](04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +The Security Command Class Mark (0xF100) MUST indicate command classes supported using the highest listed Security Key in the Granted Key field value. + +## 4.5.5.3 Network Management Multi Channel End Point Get Command + +This command is used to query the number of Multi Channel End Points and other relevant Multi Channel attributes. + +[The Network Management Multi Channel End Point Report Command MUST be returned in response to](04.05.05-network-management-proxy-command-class-version-2.md#4554-network-management-multi-channel-end-point-report-command) this command unless it is to be ignored. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = NM MULTI CHANNEL END POINT GET (0x05) _ _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. If the specified NodeID does not exist, this command MUST be ignored. + +## 4.5.5.4 Network Management Multi Channel End Point Report Command + +This command is used to advertise the number of Multi Channel End Points implemented by a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = NM MULTI CHANNEL END POINT REPORT (0x06) _ _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| Reserved | | | | | | | | +| Res | Individual End Points | | | | | | | +| Res | Aggregated End Points | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 46 of 196 Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. + +Reserved / Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Individual End Points (7 bits) + +This field MUST advertise the number of individual End Points implemented by this node. + +The value MUST be in the range 0..127. The sum of the values advertised by the Individual End Points and Aggregated End Points fields MUST be in the range 0..127. + +Aggregated End Points (7 bits) + +This field MUST advertise the number of Aggregated End Points implemented by this node. + +The value MUST be in the range 0..127. The sum of the values advertised by the Individual End Points and Aggregated End Points fields MUST be in the range 0..127. + +If no Aggregated End Points are implemented, this field MUST advertise the value 0 (zero). + +## 4.5.5.5 Network Management Multi Channel Capability Get Command + +This command is used to query the capabilities of one individual End Point or Aggregated End Point. + +[The Network Management Multi Channel Capability Report Command MUST be returned in response](04.05.05-network-management-proxy-command-class-version-2.md#4556-network-management-multi-channel-capability-report-command) to this command unless it is to be ignored. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = NM MULTI CHANNEL CAPABILITY GET (0x07) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| Res | End Point | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 47 of 196 NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. + +Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +End Point (7 bits) + +This field MUST specify a valid End Point as advertised by the Multi Channel End Point Report. If the specified End Point does not exist, this command MUST be ignored. + +## 4.5.5.6 Network Management Multi Channel Capability Report Command + +This command is used to advertise the generic and specific device class and the supported command classes of one End Point. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = NM MULTI CHANNEL CAPABILITY REPORT (0x08) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| Command Class Length | | | | | | | | +| Res | End Point | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| … | | | | | | | | +| Command Class N *) | | | | | | | | + + *) Command classes may be extended spanning two bytes for one command class + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 48 of 196 Res (1 bit) + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Command Class Length (1 byte) + +This field MUST advertise the length in bytes of the Command Class field. + +End Point (7 bits) + +This field MUST advertise a valid End Point as advertised by the Multi Channel End Point Report. + +Generic Device class (8 bits) + +This field indicates the Generic Device Class of the advertised End Point. + +Specific Device class (8 bits) + +This field indicates the Specific Device Class of the advertised End Point. + +Command Class (N bytes) + +This field MUST advertise Command Classes supported or controlled by the End Point in question. [Refer to 4.5.4.4 Node Info Cached Report Command and Table 8.](04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +The Security Command Class Mark (0xF100) MUST indicate command classes supported using the highest listed Security Key in the Granted Key field value. + +## 4.5.5.7 Network Management Multi Channel Aggregated Members Get Command + +This command is used to query the members of an Aggregated End Point. + +[The Network Management Multi Channel Aggregated Members Report Command MUST be returned in](04.05.05-network-management-proxy-command-class-version-2.md#4558-network-management-multi-channel-aggregated-members-report-command) response to this command unless it is to be ignored. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = NM MULTI CHANNEL AGGREGATED MEMBERS GET (0x09) _ _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| Res | Aggregated End Point | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. This command MUST be ignored if the NodeID field is not valid. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 49 of 196 Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Aggregated End Point (7 bits) + +This field MUST specify an Aggregated End Point. This command MUST be ignored if the End Point does not exist or is not an Aggregated End Point. + +## 4.5.5.8 Network Management Multi Channel Aggregated Members Report Command + +This command is used to advertise the members of an Aggregated End Point. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY _ _ _ _ | | | | | | | | +| Command = NM MULTI CHANNEL AGGREGATED MEMBERS REPORT (0x0A) _ _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| Res | Aggregated End Point | | | | | | | +| Number of Members | | | | | | | | +| Res | Member Endpoint 1 | | | | | | | +| … | | | | | | | | +| Res | Member Endpoint N | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field MUST indicate the NodeID for which the receiving node is to return cached data. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 50 of 196 Res + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Aggregated End Point (7 bits) + +This field MUST advertise an Aggregated End Point. + +If the command is returned in response to a Multi Channel Aggregated Members Get, this field MUST advertise the same value as was received in the Multi Channel Aggregated Members Get command. + +Number of Members (8 bits) + +This field MUST advertise the number of members of the aggregated End Points + +Member Endpoint (N * 7 bits) + +This list is used to advertise the End Point members of the Aggregated End Point advertised in the Aggregated End Point field. The length of the list MUST be determined from the Number of Members field. This field MUST be omitted if the Number of Members field is set to 0. + +Each object in the list is a 7-bit End Point ID. The addressing bit (Res) MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 51 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.06-network-management-proxy-command-class-version-3.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.06-network-management-proxy-command-class-version-3.md new file mode 100644 index 0000000..f37b0e6 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.06-network-management-proxy-command-class-version-3.md @@ -0,0 +1,67 @@ + +# 4.5.6 Network Management Proxy Command Class, version 3 + +## 4.5.6.1 Compatibillity Considerations + +The Network Management Proxy Command Class, version 3 is backwards compatible with Network Management Proxy Command Class, version 2. + +All commands and fields not mentioned in this version MUST remain unchanged from version 1. + +The Command Class is extended with these 2 commands: + + [Failed Node List Get Command](04.05.06-network-management-proxy-command-class-version-3.md#4562-failed-node-list-get-command)  [Failed Node List Report Command](04.05.06-network-management-proxy-command-class-version-3.md#4563-failed-node-list-report-command) + +The strategy for considering that nodes are failing (or non-responsive/unlikely to respond to frames again) is implementation specific and may differ from one supporting node to another. A controlling node SHOULD allow the Replace Failed Node and Remove Failed node network management functions for nodes reported as failing. + +## 4.5.6.2 Failed Node List Get Command + +This command is used to request the network node list that is marked as failing (or non-responsive). + +[The Failed Node List Report Command MUST be returned in response to this command.](04.05.06-network-management-proxy-command-class-version-3.md#4563-failed-node-list-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY (0x52) _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE LIST GET (0x0B) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 52 of 196 + +## 4.5.6.3 Failed Node List Report Command + +This command is used to advertise the current list of failing nodes in the network. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PROXY (0x52) _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE LIST REPORT (0x0C) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Failed Node List Data 1 | | | | | | | | +| ... | | | | | | | | +| Failed Node List Data 29 | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Failed Node List Data (29 bytes) + +This field carries a complete bitmask representation of nodes ranging from NodeID 1 to NodeID 232. + +Bit 0 in byte 1 MUST represent NodeID 1 Bit 1 in byte 1 MUST represent NodeID 2 … Bit 7 in byte 29 MUST represent NodeID 232 + +The value 0 MUST indicate that the NodeID is either not part of the network or part of the network and fully functional. The value 1 MUST indicate that the NodeID is part of the network and is failing (or not responding to frames) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 53 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.07-network-management-basic-node-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.07-network-management-basic-node-command-class-version-1.md new file mode 100644 index 0000000..fa6148b --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.07-network-management-basic-node-command-class-version-1.md @@ -0,0 +1,251 @@ + +# 4.5.7 Network Management Basic Node Command Class, version 1 + +The Network Management Basic Node Command Class provides functions to get nodes included into a Z-Wave network, enabling nodes to request network updates and resetting itself factory default state. + +## 4.5.7.1 Default Set Command + +This command is used to set the Controller back to the factory default state. + +[The Default Set Complete Command MUST be returned in response to this command. A receiving node](04.05.07-network-management-basic-node-command-class-version-1.md#4572-default-set-complete-command) MUST return the DEFAULT_SET_BUSY status if it is already busy executing another network management command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +This function SHOULD be used with care as it could render a network unusable if the primary controller in an existing network is set back to default. If a node is set to default while it is still a member of a network, the node will become a failing NodeID in that network. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND DEFAULT SET (0x06) _ _ | | | | | | | | +| Seq No | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +## 4.5.7.2 Default Set Complete Command + +This command is used to indicate if the Default Set operation was executed successfully or not. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND DEFAULT SET COMPLETE (0x07) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 54 of 196 Status (8 bits) + +[This field indicates the status of the default set operation. This field MUST comply with Table 9.](04.05.07-network-management-basic-node-command-class-version-1.md#4572-default-set-complete-command) + +Table 9, Default Set Complete::Status encoding + +| Value | Identifier | Description | +| --- | --- | --- | +| 0x06 | DEFAULT SET DONE _ _ | The Default Set operation has been completed successfully. | +| 0x07 | DEFAULT SET BUSY _ _ | The Default Set operation has not been executed because the node is busy. | + +## 4.5.7.3 Learn Mode Set Command + +This command is used to allow a node to be added to (or removed from) the network. When a node is added to the network, the node is assigned a valid Home ID and NodeID. This command allows a controlling application to request the transmission of Node Information Frames (NIFs) in regular intervals until included, removed or until learn mode is disabled again. + +Learn mode SHOULD be enabled only when necessary, and it SHOULD always be disabled again as quickly as possible. However, to ensure a successful synchronization of the inclusion process the device SHOULD be able to stay in learn mode at least 5 seconds. + +[The Learn Mode Set Status Command MUST be returned in response to this command unless it is to be](04.05.07-network-management-basic-node-command-class-version-1.md#4574-learn-mode-set-status-command) ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND LEARN MODE SET (0x01) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | | +| Mode | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 55 of 196 Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (8 bits) + +[The Mode field controls operation. This field MUST comply with Table 10.](04.05.07-network-management-basic-node-command-class-version-1.md#4573-learn-mode-set-command) + +Table 10, Learn Mode Set::Mode parameter encoding + +| Value | Identifier | Description | +| --- | --- | --- | +| 0x00 | ZW SET LEARN MODE DISABLE _ _ _ _ | Stop the learn mode of the node. The command MAY be ignored if Learn Mode was not activated. The command MAY be ignored if network inclusion or security bootstrapping is ongoing. | +| 0x01 | ZW SET LEARN MODE CLASSIC _ _ _ _ | Start the learn mode on the controller and accept only being included in direct range | +| 0x02 | ZW SET LEARN MODE NWI _ _ _ _ | Start the learn mode on the controller and accept routed inclusion. | + +[Examples of Learn Mode activation and deactivation are given in 4.5.7.8.1 Z/IP Client requesting a node to interrupt Learn Mode](04.05.07-network-management-basic-node-command-class-version-1.md#4578-use-cases-and-frame-flows) + +4.5.7.3.1 Learn mode in a controller If the receiving node is a controller, it receives and stores the node list and routing table for the network during inclusion. This information transmitted as part of the controller replication. This function will most likely change the capabilities of the controller. + +## 4.5.7.4 Learn Mode Set Status Command + +This command is used to indicate the progress of the Learn Mode Set command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND LEARN MODE SET STATUS (0x02) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Reserved | | | | | | | | +| New NodeID | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 56 of 196 Status (8 bits) + +[This field indicates the outcome of the learn mode and MUST comply with Table 11.](04.05.07-network-management-basic-node-command-class-version-1.md#4574-learn-mode-set-status-command) + +Table 11, Learn Mode Status::Status parameter encoding + +| Value | Identifier | Description | +| --- | --- | --- | +| 0x06 | LEARN MODE DONE _ _ | The learn process is complete and the controller is now included into (or excluded from) the network. If the node supports S0 or S2, it indicates that the network inclusion and security bootstrapping were completed successfully (This include the case where the node was granted no S2 key). | +| 0x07 | LEARN MODE FAILED _ _ | The learn process failed in some general way | +| 0x09 | LEARN MODE SECURITY FAILED _ _ _ | The learn process is complete and the node was included in a network but security bootstrapping failed. The node is not operating securely. | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +New NodeID (1 byte) + +The NodeID assigned to the new node by another primary controller or inclusion controller. If the node was removed from the network or if the Status field is different than LEARN_MODE_DONE, this field MUST be set to 0x00. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 57 of 196 + +## 4.5.7.5 Node Information Send Command + +This command is used to trigger a receiving node to issue a Node Information Frame (NIF). + +A node receiving this command MUST send a Node Information Frame to the indicated NodeID with the indicated transmission options. No status message is returned for this command. + +A management application MAY use this message to make a node identify itself towards a Z-Wave remote control during association operations. This command SHOULD NOT be used while learn mode is activated. Instead, periodic Node Information Frame transmissions MAY be enabled along with learn [mode; refer to 4.5.7.1.](04.05.07-network-management-basic-node-command-class-version-1.md#4571-default-set-command) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND NODE INFORMATION SEND (0x05) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | | +| Destination NodeID | | | | | | | | +| tx Options | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Destination NodeID (1 byte) + +This field indicates the NodeID of the node that will receive the Node Information frame. The NodeID CC:004D.01.05.13.003 MAY be set to the broadcast NodeID to reach all nodes within direct range. + +Acknowledgement SHOULD NOT be requested when broadcasting. + +tx Options (1 byte) + +This field allows a management application to specify if the Node Information frame is to be sent with CC:004D.01.05.11.002 [special properties. This field MUST be treated as a bitmask and MUST comply with Table 12.](04.05.07-network-management-basic-node-command-class-version-1.md#4575-node-information-send-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 58 of 196 Table 12, Node Information Send::Tx Options encoding + +| Value | Option flag identifier | Description | +| --- | --- | --- | +| 0x00 | NULL | Transmit at normal power level without any transmit options. | +| 0x01 | TRANSMIT OPTION ACK _ _ | Request acknowledgment from destination node. Allow routing. | +| 0x02 | TRANSMIT OPTION LOW POWER _ _ _ | Transmit at low output power level (1/3 of normal RF range) | +| 0x10 | TRANSMIT OPTION NO ROUTE _ _ _ | Send only in direct range | +| 0x20 | TRANSMIT OPTION EXPLORE _ _ | Resolve new routes via explorer discovery if existing routes fail | + +It is RECOMMENDED for a sending node to use the TRANSMIT_OPTION_NO_ROUTE tx Option and the broadcast NodeID in this command. + +## 4.5.7.6 Network Update Request Command + +This command is used to request network topology updates from the SUC/SIS node. + +A node MUST NOT use this command if no SUC is present in the network. + +The SUC can only handle one network update at a time, so care should be taken not to have multiple controllers in the network ask for updates at the same time. + +This command will generate a lot of network activity that will use bandwidth and stress the CC:004D.01.03.12.001 SUC. Therefore, network updates SHOULD be requested as seldom as possible. + +[The Network Update Request Status Command MUST be returned in response to this command.](04.05.07-network-management-basic-node-command-class-version-1.md#4577-network-update-request-status-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND NETWORK UPDATE REQUEST (0x03) _ _ _ | | | | | | | | +| Seq No | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 59 of 196 + +## 4.5.7.7 Network Update Request Status Command + +This command is used to indicate if the Network Update Request command execution has completed successfully or not. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND NETWORK UPDATE REQUEST STATUS (0x04) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Status (1 byte) + +This field is used to indicate the status of the Network Update process. [This field MUST comply with Table 13.](04.05.07-network-management-basic-node-command-class-version-1.md#4577-network-update-request-status-command) CC:004D.01.04.11.001 + +Table 13, Network Update Request Status::Status parameter encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x00 | ZW SUC UPDATE DONE _ _ _ | The update process succeeded | +| 0x01 | ZW SUC UPDATE ABORT _ _ _ | The update process aborted because of an error | +| 0x02 | ZW SUC UPDATE WAIT _ _ _ | The SUC node is busy | +| 0x03 | ZW SUC UPDATE DISABLED _ _ _ | The SUC functionality is disabled | +| 0x04 | ZW SUC UPDATE OVERFLOW _ _ _ | The controller requested an update after more than 64 changes have occurred in the network. The controller has to make a replication. | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 60 of 196 + +## 4.5.7.8 Use cases and frame flows + +4.5.7.8.1 Z/IP Client requesting a node to interrupt Learn Mode + +[The frame flow for interrupting Learn Mode is shown in Figure 12.](04.05.07-network-management-basic-node-command-class-version-1.md#4578-use-cases-and-frame-flows) + +![Figure 12, Z/IP Client interrupting learn mode](assets/img-bf6af05d2a.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 61 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.08-network-management-basic-node-command-class-version-2.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.08-network-management-basic-node-command-class-version-2.md new file mode 100644 index 0000000..f408b5d --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.08-network-management-basic-node-command-class-version-2.md @@ -0,0 +1,172 @@ + +# 4.5.8 Network Management Basic Node Command Class, version 2 + +## 4.5.8.1 Compatibility considerations + +The Network Management Basic Command Class, version 2 is backwards compatible with Network Management Basic Command Class, version 1. A node supporting Network Management Basic Command Class, version 2 MUST also support Network Management Basic Command Class, version 1. + +All commands not mentioned in this version remain unchanged from version 1. + +The following commands are introduced to allow a GUI to display the DSK of a S2 node and advertise interview status: + + [DSK Get Command](04.05.08-network-management-basic-node-command-class-version-2.md#4584-dsk-get-command)  [DSK Report Command](04.05.08-network-management-basic-node-command-class-version-2.md#4585-dsk-report-command) + +The following commands have been extended to return information about the S2 bootstrapping outcome and the node interview process after activating Learn Mode: + + [Learn Mode Set Command](04.05.08-network-management-basic-node-command-class-version-2.md#4582-learn-mode-set-command)  [Learn Mode Set Status Command](04.05.08-network-management-basic-node-command-class-version-2.md#4583-learn-mode-set-status-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 62 of 196 + +## 4.5.8.2 Learn Mode Set Command + +This command is used to allow a node to be added to (or removed from) the network. When a node is added to the network, the node is assigned a valid Home ID and NodeID. This command allows a controlling application to request the transmission of Node Information Frames (NIFs) in regular intervals until included, removed or until learn mode is disabled again. + +Learn mode SHOULD be enabled only when necessary, and it SHOULD always be disabled again as quickly as possible. However, to ensure a successful synchronization of the inclusion process the device SHOULD be able to stay in learn mode at least 5 seconds. + +[The Learn Mode Set Status Command MUST be returned in response to this command.](04.05.07-network-management-basic-node-command-class-version-1.md#4574-learn-mode-set-status-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND LEARN MODE SET _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | Return interview status | +| Mode | | | | | | | | + +Fields not described in this version remain unchanged from version 1. + +Return Interview Status (1 bit) + +[This field is used to request that the receiving node returns an additional Learn Mode Set Status Command when the node interview is completed.](04.05.08-network-management-basic-node-command-class-version-2.md#4583-learn-mode-set-status-command) + +[The value 0 MUST indicate that the receiving node MUST return a Learn Mode Set Status Command](04.05.08-network-management-basic-node-command-class-version-2.md#4583-learn-mode-set-status-command) when the learn mode is over. [The value 1 MUST indicate that the receiving node MUST return a Learn Mode Set Status Command when learn mode is over and an additional Learn Mode Set Status Command with status set to](04.05.08-network-management-basic-node-command-class-version-2.md#4583-learn-mode-set-status-command) when the inclusion node interview is over. LEARN_MODE_INTERVIEW_COMPLETED + +[An illustration is given in Figure 13.](04.05.08-network-management-basic-node-command-class-version-2.md#4586-use-cases-and-frame-flows) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 63 of 196 + +## 4.5.8.3 Learn Mode Set Status Command + +This command is used to indicate the progress of the Learn Mode Set command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND LEARN MODE SET STATUS (0x02) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Reserved | | | | | | | | +| New Node ID | | | | | | | | +| Granted Keys | | | | | | | | +| KEX Fail Type | | | | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK 16 | | | | | | | | + +Fields not described in this version remain unchanged from version 1. + +Status (8 bits) + +[This field indicates the outcome of the learn mode and MUST comply with Table 14.](04.05.08-network-management-basic-node-command-class-version-2.md#4583-learn-mode-set-status-command) + +Table 14, Learn Mode Status version 2::Status parameter encoding + +| Value | Identifier | Description | Version | +| --- | --- | --- | --- | +| 0x06 | LEARN MODE DONE _ _ | The learn process is complete and the controller is now included into (or excluded from) the network. If the node supports S0 or S2, it indicates that the network inclusion and security bootstrapping were completed successfully (This include the case where the node was granted no S2 key). | 1 | +| 0x07 | LEARN MODE FAILED _ _ | The learn process failed in some general way | 1 | +| 0x09 | LEARN MODE SECURITY FAILED _ _ _ | The learn process is complete and the node was included in a network but security bootstrapping failed. The node is not operating securely. | 1 | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 64 of 196 + +| 0x0A | LEARN MODE INTERVIEW COMPLETED _ _ _ | This status is used to report that the post- inclusion interview is completed after network inclusion | 2 | +| --- | --- | --- | --- | + +Granted Keys (8 bits) + +This field is used to indicate which network keys were granted during bootstrapping. [This field MUST be treated as a bitmask and comply with Table 28.](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +KEX Fail Type (8 bits) + +This field is used to indicate which error occurred in case S2 bootstrapping was not successful. [This field MUST comply with Table 29.](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +DSK (16 bytes) + +This field is used to indicate the DSK of the including controller that performed S2 bootstrapping to the node. This information can be used for post inclusion verification. + +## 4.5.8.4 DSK Get Command + +This command is used to request the S2 DSK of a node. + +[The DSK Report Command MUST be returned in response to this command.](04.05.08-network-management-basic-node-command-class-version-2.md#4585-dsk-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND DSK GET (0x08) _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | Add mode | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Add mode (1 bit) + +This field is used to request the Add Mode or Learn Mode DSK. S2 Controllers may have 2 key pairs, one static key pair used for Learn mode (being included in a + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 65 of 196 network) and one dynamic key pair changing at each bootstrapping used for Add mode (including other nodes in the network). + +The value 0 MUST indicate that the node MUST return its Learn Mode DSK The value 1 MUST indicate that the node MUST return its Add Mode DSK: + +A node not supporting an Add Mode dynamic key pair MUST return its Learn Mode DSK. + +## 4.5.8.5 DSK Report Command + +This command is used by a node to advertise its DSK. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT BASIC _ _ _ _ | | | | | | | | +| Command = COMMAND DSK REPORT (0x09) _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | Add mode | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK 16 | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Add mode (1 bit) + +This field is used to indicate if the Add Mode or Learn Mode DSK is advertised in this command. + +The value 0 MUST indicate that the node advertises its Learn Mode DSK The value 1 MUST indicate that the node advertises its Add Mode DSK. + +DSK (16 bytes) + +[This field is used to transmit the S2 DSK. For details, refer to [15].](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 66 of 196 + +## 4.5.8.6 Use cases and frame flows + +4.5.8.6.1 Z/IP Client requesting a node to report node interview status. + +The frame flow for returning status messages at the end of Learn mode and the end of the post- [inclusion device interview is shown in Figure 13.](04.05.08-network-management-basic-node-command-class-version-2.md#4586-use-cases-and-frame-flows) + +![Figure 13, Node advertising the end of the interview process](assets/img-8948947f8d.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 67 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.01-node-add-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.01-node-add-command.md new file mode 100644 index 0000000..5c83e79 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.01-node-add-command.md @@ -0,0 +1,68 @@ + +# 4.5.9.1 Node Add Command + +This command is used to activate or de-activate add mode on a controller. + +The process of adding a node is started by the network management application sending a Node Add command to a controller. The network management application receives a status message later on indicating if the inclusion attempt was successful or not. If NWI inclusion was used, the calling application MAY re-issue this command if more nodes are to be included. + +The Add Mode SHOULD be disabled after a certain time to avoid adding another node unexpectedly. It is RECOMMENDED to have a timer that disables the Node Add state after a given time without any activity. + +Add Mode MUST be de-activated after any inclusion attempt, even if interrupted. + +[The Node Add Status Command MUST be returned in response to this command unless it is to be](04.05.09.02-node-add-status-command.md#4592-node-add-status-command) ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD (0x01) _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | | +| Mode | | | | | | | | +| tx Options | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 68 of 196 Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (1 byte) + +This field is use to indicate to the receiving node if the Add Mode must be activated or de-activated. [This field MUST comply with Table 15.](04.05.09.01-node-add-command.md#4591-node-add-command) + +Table 15, Node Add::Mode parameter encoding + +| Value | Identifier | Description | +| --- | --- | --- | +| 0x01 | ADD NODE ANY _ _ | Add any type of node to the network. | +| 0x05 | ADD NODE STOP _ _ | Stop Add Mode. The command MAY be ignored if Add Mode was not activated. The command MAY be ignored if network inclusion or security bootstrapping is ongoing. | + +[Examples of Add Mode activation and deactivation are given in 4.5.9.15.1 Z/IP Client requesting a node to interrupt Add Mode..](04.05.09.15-use-cases-and-frame-flows.md#45915-use-cases-and-frame-flows) + +tx Options (1 byte) + +The tx Options field allows a controlling node to specify if transmissions MUST use special properties. [This field MUST be treated as a bitmask and MUST comply with Table 16.](04.05.09.01-node-add-command.md#4591-node-add-command) + +Table 16, Node Add::Tx Options encoding + +| Value | Option flag identifier | Description | +| --- | --- | --- | +| 0x00 | NULL | Transmit at normal power level without any transmit options. | +| 0x02 | TRANSMIT OPTION LOW POWER _ _ _ | Transmit at low output power level (1/3 of normal RF range) | +| 0x20 | TRANSMIT OPTION EXPLORE _ _ | Allow network-wide inclusion | + +If the Mode is set to NODE_ADD_ANY, it is RECOMMENDED to set this field to TRANSMIT_OPTION_EXPLORE. + +Installer scenarios with a requirement for more confidential transfer of network security keys MAY set the flag TRANSMIT_OPTION_LOW_POWER This requires that the new node is included in direct range. of the including controller. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 69 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.02-node-add-status-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.02-node-add-status-command.md new file mode 100644 index 0000000..cf3dc51 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.02-node-add-status-command.md @@ -0,0 +1,88 @@ + +# 4.5.9.2 Node Add Status Command + +This command is used to report the result of the Node Add Command or report that a new node was included. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD STATUS (0x02) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Reserved | | | | | | | | +| New NodeID | | | | | | | | +| Node Info Length | | | | | | | | +| List. | Z-Wave Protocol Specific Part | | | | | | | +| Opt. Func. | Z-Wave Protocol Specific Part | | | | | | | +| Basic Device Class | | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | + + *) Command classes may be extended spanning two bytes for one command class + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 70 of 196 Status (1 byte) + +[This field indicates the outcome of the add mode and MUST comply with Table 17.](04.05.09.02-node-add-status-command.md#4592-node-add-status-command) + +Table 17, Node Add Status::Status parameter encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x06 | ADD NODE STATUS DONE _ _ _ | The new node has been included in the network. If the new node and controller support S0 or S2, it indicates that the network inclusion and security bootstrapping were completed successfully (This include the case where the node was granted no S2 key). | +| 0x07 | ADD NODE STATUS FAILED _ _ _ | The process failed, no new node was added in the network. | +| 0x09 | ADD NODE STATUS SECURITY FAILED _ _ _ _ | Node has been included but the security bootstrapping failed. | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +New NodeID (1 byte) + +This field MUST indicate the assigned NodeID to the newly added node. This field is valid if Status is different than NODE_ADD_STATUS_FAILED. This field MUST be set to 0x00 if no NodeID was assigned to the included node. + +Node Info Length (1 byte) + +This field is used to indicate the length in bytes of the encapsulated Node Information fields. This field CC:0034.01.02.11.004 MUST be included in the length calculation. The value MUST indicate the length of the following fields: + + Node Info Length (this field)  List / Z-Wave Protocol Specific Part  Opt Func / Z-Wave Protocol Specific Part  Basic Device Class  Generic Device Class  Specific Device Class  Command Class + +List. (1 bit) + +[Refer to 4.5.4.4 Node Info Cached Report Command.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Opt. Func. (1 bit) + +[Refer to 4.5.4.4 Node Info Cached Report Command.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 71 of 196 Z-Wave Protocol Specific Part + +[Refer to 4.5.4.4 Node Info Cached Report Command.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Basic Device Class (1 byte) + +[Refer to 4.5.4.4 Node Info Cached Report Command.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Generic Device Class (1 byte) + +[Refer to 4.5.4.4 Node Info Cached Report Command.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Specific Device Class (1 byte) + +[Refer to 4.5.4.4 Node Info Cached Report Command.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +Command Class (N bytes) + +[Refer to 4.5.4.4 Node Info Cached Report Command and Table 8.](../04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.03-node-remove-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.03-node-remove-command.md new file mode 100644 index 0000000..ca09c6e --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.03-node-remove-command.md @@ -0,0 +1,47 @@ + +# 4.5.9.3 Node Remove Command + +This command is used to activate or de-activate node remove mode. The remove operation only works in direct range between the controller and the node that is to be removed. + +The Node Remove mode SHOULD be disabled after a certain time to avoid removing another node unexpectedly. It is RECOMMENDED to have a timer that disables the Node Remove mode after a given time without any activity. + +Node Remove mode MUST be de-activated after any removal attempt, even if interrupted. + +[The Node Remove Status Command MUST be returned in response to this command unless it is](04.05.09.04-node-remove-status-command.md#4594-node-remove-status-command) ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE REMOVE (0x03) _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | | +| Mode | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 72 of 196 Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (1 byte) + +This field is use to indicate to the receiving node if the node removal process must be activated or de- [activated. This field MUST comply with Table 18.](04.05.09.03-node-remove-command.md#4593-node-remove-command) + +Table 18, Node Remove::Mode parameter encoding + +| Value | Mode identifier | Description | +| --- | --- | --- | +| 0x01 | REMOVE NODE ANY _ _ | Remove any type of node from the network | +| 0x05 | REMOVE NODE STOP _ _ | Stop the node removal process. The command MAY be ignored if the remove process was not activated. The command MAY be ignored if network exclusion is ongoing. | + +The process of removing a node is started by sending this command with Mode set to REMOVE_NODE_ANY. The removal process is complete when a Node Remove Status command with status set to NODE_REMOVE_STATUS_DONE is returned. diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.04-node-remove-status-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.04-node-remove-status-command.md new file mode 100644 index 0000000..ffc3daf --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.04-node-remove-status-command.md @@ -0,0 +1,37 @@ + +# 4.5.9.4 Node Remove Status Command + +This command is used to advertise the status of a node removal attempt. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE REMOVE STATUS _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 73 of 196 Status (1 byte) + +[This field is used to advertise status of a node removal attempt. This field MUST comply with Table 19.](04.05.09.04-node-remove-status-command.md#4594-node-remove-status-command) + +Table 19, Status parameter of Node Remove Status encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x06 | REMOVE NODE STATUS DONE _ _ _ | The node has now been removed and the controller is ready to continue normal operation again. Removed NodeID is returned. | +| 0x07 | REMOVE NODE STATUS FAILED _ _ _ | The remove process failed (no node was removed) | + +NodeID (1 byte) + +This field is used to advertise the NodeID that was attempted to be removed from the network. CC:0034.01.04.12.001 This field SHOULD be set to 0x00 if no attempt has been made. diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.05-failed-node-remove-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.05-failed-node-remove-command.md new file mode 100644 index 0000000..4c7e880 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.05-failed-node-remove-command.md @@ -0,0 +1,33 @@ + +# 4.5.9.5 Failed Node Remove Command + +This command is used to remove a non-responding node. + +A non-responding node is put onto the failed NodeID list by a controller when detected. In case the node responds again at a later stage, it is removed from the failed NodeID list. A node MUST be on the failed NodeID list and as an extra precaution also fail to respond before it is removed. Responding nodes MUST NOT be removed. + +[The Failed Node Remove Status Command MUST be returned in response to this command when the](04.05.09.06-failed-node-remove-status-command.md#4596-failed-node-remove-status-command) removal attempt has been made. + +This command MUST NOT be issued via multicast addressing. CC:0034.01.07.11.004 A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE REMOVE _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 74 of 196 NodeID (1 byte) + +This field is used to specify the NodeID of the failing node which MUST be removed. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 75 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.06-failed-node-remove-status-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.06-failed-node-remove-status-command.md new file mode 100644 index 0000000..759e7ce --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.06-failed-node-remove-status-command.md @@ -0,0 +1,42 @@ + +# 4.5.9.6 Failed Node Remove Status Command + +This command is used to report the results of a failed node removal attempt. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE REMOVE STATUS _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Status (1 byte) + +This field is used to advertise status of the failed node removal process. This field MUST comply with [Table 20.](04.05.09.06-failed-node-remove-status-command.md#4596-failed-node-remove-status-command) + +Table 20, Status parameter of Failed NodeID Remove::Status encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x01 | DONE | The process was completed successfully. | +| 0x00 | FAILED NODE NOT FOUND _ _ _ | The requested process failed. The NodeID was not found in the controller list of failing nodes. | +| 0x02 | FAILED NODE REMOVE FAIL _ _ _ | The requested process failed. Reasons include: * Controller is busy * The node responded to a NOP; thus the node is no longer failing. | + +The removal process may fail if the requested NodeID responds to requests. The error message FAILED_NODE_REMOVE_FAIL does not indicate why the removal operation failed. A network management application SHOULD issue a NOP for the requested NodeID to test if the node is actually responding again. + +NodeID (1 byte) + +This field is used to specify the NodeID of the failing node which was attempted to be removed. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 76 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.07-failed-node-replace-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.07-failed-node-replace-command.md new file mode 100644 index 0000000..aa07be0 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.07-failed-node-replace-command.md @@ -0,0 +1,55 @@ + +# 4.5.9.7 Failed Node Replace Command + +This command is used to replace a non-responding node with a new one reusing the NodeID of the failed node. + +A non-responding node is put onto the failed NodeID list in the controller. In case the node responds again at a later stage then it is removed from the failed NodeID list. A node MUST be on the failed NodeID list and as an extra precaution also fail to respond before it is removed or replaced. Responding nodes MUST NOT be removed. + +[The Failed Node Replace Status Command MUST be returned in response to this command when the](04.05.09.08-failed-node-replace-status-command.md#4598-failed-node-replace-status-command) replacement attempt has been made unless it is ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE REPLACE (0x09) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| tx Options | | | | | | | | +| Mode | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field is used to specify the NodeID of the failing node which MUST be replaced. + +tx Options (1 byte) + +The tx Options field allows a controlling node to specify if transmissions MUST use special properties. [The field MUST comply with Table 21.](04.05.09.07-failed-node-replace-command.md#4597-failed-node-replace-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 77 of 196 Table 21, Failed Node Replace::Tx Options encoding + +| Value | Option flags | Description | +| --- | --- | --- | +| 0x00 | NULL | Transmit at normal power level without any transmit options. | +| 0x02 | TRANSMIT OPTION LOW POWER _ _ _ | Transmit at low output power level (1/3 of normal RF range) | + +Mode (1 byte) + +This field is use to indicate to the receiving node if the node replacement process must be activated or [de-activated. This field MUST comply with Table 22.](04.05.09.07-failed-node-replace-command.md#4597-failed-node-replace-command) + +Table 22, Failed Node Replace::Mode encoding + +| Value | Mode identifier | Description | +| --- | --- | --- | +| 0x01 | START FAILED NODE REPLACE _ _ _ | Initiate a failed node replace process. | +| 0x05 | STOP FAILED NODE REPLACE _ _ _ | Cancel a failed node replace process. The command MAY be ignored if no replaced failed process is active. The command MAY be ignored if network inclusion is ongoing. | diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.08-failed-node-replace-status-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.08-failed-node-replace-status-command.md new file mode 100644 index 0000000..003f8ab --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.08-failed-node-replace-status-command.md @@ -0,0 +1,44 @@ + +# 4.5.9.8 Failed Node Replace Status Command + +This command is used to indicate the status of a failed node replacement attempt. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE REPLACE STATUS _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 78 of 196 Status (1 byte) + +This field is used to advertise status of the node replacement process. This field MUST comply with [Table 23.](04.05.09.08-failed-node-replace-status-command.md#4598-failed-node-replace-status-command) + +Table 23, Status parameter of Failed Node Remove ID::Status encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x04 | DONE | The process was completed successfully. | +| 0x05 | FAILED NODE REPLACE FAIL _ _ _ | The requested process failed. Reasons include: * Controller is busy * The node responded to a NOP; thus the node is no longer failing. | +| 0x09 | FAILED NODE REPLACE SECURITY FAILED _ _ _ _ | Replace completed successfully but security handshake failed. | + +The replace process may fail if the requested NodeID responds to requests. The error message FAILED_NODE_REMOVE_FAIL does not indicate why the removal operation failed. + +A network management application SHOULD issue a NOP for the requested NodeID. If a response is received the user SHOULD be notified that the node must be removed using the normal removal operation. + +NodeID (1 byte) + +This field is used to specify the NodeID of the failing node which was attempted to be replaced. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 79 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.09-node-neighbor-update-request-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.09-node-neighbor-update-request-command.md new file mode 100644 index 0000000..f791abe --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.09-node-neighbor-update-request-command.md @@ -0,0 +1,29 @@ + +# 4.5.9.9 Node Neighbor Update Request Command + +This command is used to instruct a node with NodeID to perform a Node Neighbor Update operation in order to update the topology on the controller. + +[The Node Neighbor Update Status Command MUST be returned in response to this command when the](04.05.09.10-node-neighbor-update-status-command.md#45910-node-neighbor-update-status-command) neighbor search is completed. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE NEIGHBOR UPDATE REQUEST _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field is used to specify the NodeID of the failing node which MUST perform the Node Neighbor Update operation. diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.10-node-neighbor-update-status-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.10-node-neighbor-update-status-command.md new file mode 100644 index 0000000..8093a0b --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.10-node-neighbor-update-status-command.md @@ -0,0 +1,32 @@ + +# 4.5.9.10 Node Neighbor Update Status Command + +This command is used to report the status of a Node Neighbor Update operation. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE NEIGHBOR UPDATE STATUS _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 80 of 196 Status (1 byte) + +This field is used to advertise status of the neighbor update operation. This field MUST comply with [Table 24.](04.05.09.10-node-neighbor-update-status-command.md#45910-node-neighbor-update-status-command) + +Table 24, Node Neighbor Update Status::Status encoding + +| Value | Status identifier | Description | +| --- | --- | --- | +| 0x22 | NEIGHBOR UPDATE STATUS DONE _ _ _ | New neighbor list received | +| 0x23 | NEIGHBOR UPDATE STATUS FAIL _ _ _ | Getting new neighbor list failed | diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.11-return-route-assign-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.11-return-route-assign-command.md new file mode 100644 index 0000000..d2f214d --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.11-return-route-assign-command.md @@ -0,0 +1,38 @@ + +# 4.5.9.11 Return Route Assign Command + +This command is used to make a controller assign static return routes (up to 4) to a slave node. This allows the slave nodes to communicate directly with other nodes. + +Up to 5 different destinations can be allocated return routes. Attempts to assign new return routes when all 5 destinations already are allocated will be ignored. [Allocated return routes can only be cleared using the Return Route Delete Command.](04.05.09.13-return-route-delete-command.md#45913-return-route-delete-command) + +The controller calculates the shortest routes from the slave node (Source NodeID field) to the destination node (Destination NodeID field) and transmits the return routes to the slave node (Source NodeID field). + +[The Return Route Assign Complete Command MUST be returned in response to this command when](04.05.09.12-return-route-assign-complete-command.md#45912-return-route-assign-complete-command) the route assignment is completed. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND RETURN ROUTE ASSIGN _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Source NodeID | | | | | | | | +| Destination NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Source NodeID (1 byte) + +This field is used to specify the NodeID of the node which will be assigned the return route. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 81 of 196 Destination NodeID (1 byte) + +This field is used to specify the destination NodeID for which the Source NodeID will have a route assigned. diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.12-return-route-assign-complete-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.12-return-route-assign-complete-command.md new file mode 100644 index 0000000..8aca28b --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.12-return-route-assign-complete-command.md @@ -0,0 +1,38 @@ + +# 4.5.9.12 Return Route Assign Complete Command + +This command is used to indicate the status of a return route assignment attempt. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND RETURN ROUTE ASSIGN COMPLETE _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Status (1 byte) + +This field is used to advertise status of the return route assignment attempt. This field MUST comply [with Table 25.](04.05.09.12-return-route-assign-complete-command.md#45912-return-route-assign-complete-command) + +Table 25, Return Route Assign Complete::Status encoding + +| Value | Option identifier | Description | +| --- | --- | --- | +| 0x00 | TRANSMIT COMPLETE OK _ _ | Successfully transmitted | +| 0x01 | TRANSMIT COMPLETE NO ACK _ _ _ | No acknowledgement is received before timeout from the destination node. Acknowledgement is discarded in case it is received after the time out. | +| 0x02 | TRANSMIT COMPLETE FAIL _ _ | Not possible to transmit data because the Z-Wave network is busy (jammed). | +| 0x03 | N/A | Reserved | +| 0x04 | TRANSMIT COMPLETE NOROUTE _ _ | No route found to assign to the destination. No frame was transmitted. | +| 0x05 | TRANSMIT COMPLETE VERIFIED _ _ | This status code is identical to 0x00. The route was successfully transmitted. | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 82 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.13-return-route-delete-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.13-return-route-delete-command.md new file mode 100644 index 0000000..19ddec3 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.13-return-route-delete-command.md @@ -0,0 +1,31 @@ + +# 4.5.9.13 Return Route Delete Command + +This command is used to make a controller delete all static return routes from a slave node. Allocated return routes can only be removed using this command. All return routes are cleared when using this command. + +After issuing this command, an application SHOULD issue Return Route Assign Commands to create return routes for all relevant associations. + +[The Return Route Delete Complete Command MUST be returned in response to this command.](04.05.09.14-return-route-delete-complete-command.md#45914-return-route-delete-complete-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND RETURN ROUTE DELETE (0x0F) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +NodeID (1 byte) + +This field is used to specify the NodeID of which the return routes MUST be deleted. diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.14-return-route-delete-complete-command.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.14-return-route-delete-complete-command.md new file mode 100644 index 0000000..8ba1992 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.14-return-route-delete-complete-command.md @@ -0,0 +1,35 @@ + +# 4.5.9.14 Return Route Delete Complete Command + +This command is used to indicate the status of a return route deletion attempt. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND RETURN ROUTE DELETE COMPLETE (0x10) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](../04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 83 of 196 Status (1 byte) + +This field is used to advertise status of the return route deletion attempt. This field MUST comply with [Table 26.](04.05.09.14-return-route-delete-complete-command.md#45914-return-route-delete-complete-command) + +Table 26, Return Route Delete Complete::Status encoding + +| Value | Option identifier | Description | +| --- | --- | --- | +| 0x00 | TRANSMIT COMPLETE OK _ _ | Successfully transmitted | +| 0x01 | TRANSMIT COMPLETE NO ACK _ _ _ | No acknowledge is received before timeout from the destination node. Acknowledge is discarded in case it is received after the time out. | +| 0x02 | TRANSMIT COMPLETE FAIL _ _ | Not possible to transmit data because the Z-Wave network is busy (e.g. jammed). | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 84 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.15-use-cases-and-frame-flows.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.15-use-cases-and-frame-flows.md new file mode 100644 index 0000000..1e10b7a --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/04.05.09.15-use-cases-and-frame-flows.md @@ -0,0 +1,16 @@ + +# 4.5.9.15 Use cases and frame flows + +4.5.9.15.1 Z/IP Client requesting a node to interrupt Add Mode. + +[The frame flow for interrupting Add Mode is shown in Figure 14.](04.05.09.15-use-cases-and-frame-flows.md#45915-use-cases-and-frame-flows) + +![Figure 14, Z/IP Client requesting a node to interrupt Add Mode](assets/img-08e1758c21.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 85 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/index.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/index.md new file mode 100644 index 0000000..b26acaa --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.09-network-management-inclusion-command-class-version-1/index.md @@ -0,0 +1,28 @@ + +# 4.5.9 Network Management Inclusion Command Class, version 1 + +The Network Management Inclusion Command Class provides functionality only available in a primary controller, inclusion controller or SIS. Since this is a dynamic property, there is a risk that a remote host tries to use commands in a controller which has become secondary in the meantime. + +## Contents + +- [4.5.9.1 Node Add Command](04.05.09.01-node-add-command.md) +- [4.5.9.2 Node Add Status Command](04.05.09.02-node-add-status-command.md) +- [4.5.9.3 Node Remove Command](04.05.09.03-node-remove-command.md) +- [4.5.9.4 Node Remove Status Command](04.05.09.04-node-remove-status-command.md) +- [4.5.9.5 Failed Node Remove Command](04.05.09.05-failed-node-remove-command.md) +- [4.5.9.6 Failed Node Remove Status Command](04.05.09.06-failed-node-remove-status-command.md) +- [4.5.9.7 Failed Node Replace Command](04.05.09.07-failed-node-replace-command.md) +- [4.5.9.8 Failed Node Replace Status Command](04.05.09.08-failed-node-replace-status-command.md) +- [4.5.9.9 Node Neighbor Update Request Command](04.05.09.09-node-neighbor-update-request-command.md) +- [4.5.9.10 Node Neighbor Update Status Command](04.05.09.10-node-neighbor-update-status-command.md) +- [4.5.9.11 Return Route Assign Command](04.05.09.11-return-route-assign-command.md) +- [4.5.9.12 Return Route Assign Complete Command](04.05.09.12-return-route-assign-complete-command.md) +- [4.5.9.13 Return Route Delete Command](04.05.09.13-return-route-delete-command.md) +- [4.5.9.14 Return Route Delete Complete Command](04.05.09.14-return-route-delete-complete-command.md) +- [4.5.9.15 Use cases and frame flows](04.05.09.15-use-cases-and-frame-flows.md) diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.10-network-management-inclusion-command-class-version-2.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.10-network-management-inclusion-command-class-version-2.md new file mode 100644 index 0000000..5a16954 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.10-network-management-inclusion-command-class-version-2.md @@ -0,0 +1,362 @@ + +# 4.5.10 Network Management Inclusion Command Class, version 2 + +## 4.5.10.1 Compatibility considerations + +The Network Management Inclusion Command Class, version 2 is backwards compatible with Network Management Inclusion Command Class, version 1. A node supporting Network Management Inclusion Command Class, version 2 MUST also support Network Management Inclusion Command Class, version 1. + +All commands not mentioned in this version remain unchanged from version 1. + +The following commands are introduced to support the multiple security keys and DSK functionalities of the Security 2 Command Class: + + [Node Add Keys Report Command](04.05.10-network-management-inclusion-command-class-version-2.md#45104-node-add-keys-report-command)  [Node Add Keys Set Command](04.05.10-network-management-inclusion-command-class-version-2.md#45105-node-add-keys-set-command)  [Node Add DSK Report Command](04.05.10-network-management-inclusion-command-class-version-2.md#45106-node-add-dsk-report-command)  [Node Add DSK Set Command](04.05.10-network-management-inclusion-command-class-version-2.md#45107-node-add-dsk-set-command) + +The following command has been extended to support the new S2/inclusion controller bootstrapping process: + + [Node Add Command](04.05.10-network-management-inclusion-command-class-version-2.md#45102-node-add-command)  [Node Add Status Command](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command)  [Failed Node Replace Command](04.05.10-network-management-inclusion-command-class-version-2.md#45108-failed-node-replace-command)  [Failed Node Replace Status Command](04.05.10-network-management-inclusion-command-class-version-2.md#45109-failed-node-replace-status-command) + +[Use-cases and frames flows for the new functionalities of this Command Class are shown in 4.5.10.10 Use cases and frame flows](04.05.10-network-management-inclusion-command-class-version-2.md#451010-use-cases-and-frame-flows) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 86 of 196 + +## 4.5.10.2 Node Add Command + +This command is used to add nodes to the Z-Wave network. + +[The Node Add Status Command MUST be returned in response to this command unless it is to be](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) ignored. + +This command MUST NOT be issued via multicast addressing. CC:0034.02.01.11.003 A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD (0x01) _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | | +| Mode | | | | | | | | +| tx Options | | | | | | | | + +Fields not described in this version remain unchanged from version 1. + +Mode (1 byte) + +This field is use to indicate to the receiving node which mode to use for the inclusion of a new node. [This field MUST comply with Table 27.](04.05.10-network-management-inclusion-command-class-version-2.md#45102-node-add-command) + +Table 27, Encoding of Node Add :: Mode parameter + +| Value | Identifier | Description | Version | +| --- | --- | --- | --- | +| 0x01 | NODE ADD ANY _ _ | Add any type of node to the network and allow Security 0 bootstrapping | 1 | +| 0x05 | NODE ADD STOP _ _ | Stop Add Mode. The command MAY be ignored if Add Mode was not activated. The command MAY be ignored if network inclusion or security bootstrapping is ongoing. | 1 | +| 0x07 | NODE ADD ANY S2 _ _ _ | Add any type of node to the network and allow Security 0 or Security 2 bootstrapping | 2 | + +CC:0034.02.01.13.001 The command MAY be ignored if Add Mode was not + +[Examples of Add Mode activation and deactivation are also given in 4.5.9.15.1 Z/IP Client requesting a node to interrupt Add Mode..](04.05.09-network-management-inclusion-command-class-version-1/04.05.09.15-use-cases-and-frame-flows.md#45915-use-cases-and-frame-flows) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 87 of 196 + +## 4.5.10.3 Node Add Status Command + +This command is used to report the result of a node inclusion. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD STATUS (0x02) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Reserved | | | | | | | | +| New NodeID | | | | | | | | +| Node Info Length | | | | | | | | +| List. | Z-Wave Protocol Specific Part | | | | | | | +| Opt. Func. | Z-Wave Protocol Specific Part | | | | | | | +| Basic Device Class | | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | +| Granted Keys | | | | | | | | +| KEX Fail Type | | | | | | | | + +*) Command classes may be extended  spanning two bytes for one command class + +Fields not described in this version remain unchanged from version 1. + +Command Class (N bytes) + +[Refer to 4.5.4.4 Node Info Cached Report Command and Table 8.](04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +The Security Command Class Mark (0xF100) MUST indicate command classes supported using the highest listed Security Key in the Granted Key field value. + +Granted Keys (8 bits) + +This field is used to indicate which network keys were granted during bootstrapping. [This field MUST be treated as a bitmask and comply with Table 28](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 88 of 196 Table 28, Node Add Status::Granted keys encoding + +| Bit | Description | +| --- | --- | +| 0 | Indicates the Unauthenticated Security Class Key | +| 1 | Indicates the Authenticated Security Class Key | +| 2 | Indicates the Access Control Security Class Key | +| 7 | Indicates the Security 0 Network Key | + +KEX Fail Type (8 bits) + +This field is used to indicate which error occurred in case S2 bootstrapping was not successful. [This field MUST comply with Table 29.](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +Table 29, Node Add Status::Kex Fail Type encoding + +| Value | KEX Fail Type Identifier | Description | +| --- | --- | --- | +| 0x00 | - | Bootstrapping was successful | +| 0x01 | KEX FAIL KEX KEY _ _ _ | Key failure indicating that no match exists between requested/granted keys in the network. | +| 0x02 | KEX FAIL KEX SCHEME _ _ _ | Scheme failure indicating that no scheme is supported by controller or joining node specified an invalid scheme. | +| 0x03 | KEX FAIL KEX CURVES _ _ _ | Curve failure indicating that no curve is supported by controller or joining node specified an invalid curve. | +| 0x05 | KEX FAIL DECRYPT _ _ | Node failed to decrypt received frame. | +| 0x06 | KEX FAIL CANCEL _ _ | User has cancelled the S2 bootstrapping. | +| 0x07 | KEX FAIL AUTH _ _ | The Echo KEX Set/Report frame did not match the earlier exchanged frame. | +| 0x08 | KEX FAIL KEY GET _ _ _ | The joining node has requested a key, which was not granted by the including node at an earlier stage. | +| 0x09 | KEX FAIL KEY VERIFY _ _ _ | Including node failed to decrypt and hence verify the received frame encrypted with exchanged key. | +| 0x0A | KEX FAIL KEY REPORT _ _ _ | The including node has transmitted a frame containing a different key than what is currently being exchanged. | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 89 of 196 + +## 4.5.10.4 Node Add Keys Report Command + +This command is used to inform which S2 keys have been requested during S2 bootstrapping. + +[The Node Add Keys Set Command MUST be returned in response to this command.](04.05.10-network-management-inclusion-command-class-version-2.md#45105-node-add-keys-set-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The CC:0034.02.11.11.003 Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD KEYS REPORT (0x11) _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | Request CSA | +| Requested Keys | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Request CSA (1 bit) + +This field is used to indicate if the joining node is requesting CSA (Client-Side Authentication, refer to [[15]).](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +The value 1 MUST indicate that the node requests CSA. The value 0 MUST indicate that the node does not request CSA. + +Requested Keys (1 bytes) + +This field is used to advertise the requested keys by the joining node. CC:0034.02.11.11.005 [This field MUST be treated as a bitmask and comply with Table 28](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 90 of 196 + +## 4.5.10.5 Node Add Keys Set Command + +This command is used to inform an S2 bootstrapping controller which keys must be granted to the node being bootstrapped. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD KEYS SET _ _ _ _ | | | | | | | | +| Seq. No | | | | | | | | +| Reserved | | | | | | Grant CSA | Accept | +| Granted Keys | | | | | | | | + +Seq. No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Grant CSA (1 bit) + +This field is used to indicate if the S2 bootstrapping controller MUST allow CSA for Authentication. [(refer to [15]).](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +The value 1 MUST indicate that the node MUST allow CSA. The value 0 MUST indicate that the node MUST NOT allow CSA. + +Granted Keys (8 bits) + +This field is used to indicate which network keys were granted during bootstrapping. [This field MUST be treated as a bitmask and comply with Table 28.](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +This field MUST be set to 0x00 if the Accept field is set to 0. + +Accept (1 bit) + +This field is used to indicate if the S2 bootstrapping process is accepted by the user and must continue. + +The value 0 MUST indicate that the S2 bootstrapping is not accepted and MUST be interrupted. The value 1 MUST indicate that the S2 bootstrapping is accepted and MUST continue. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 91 of 196 + +## 4.5.10.6 Node Add DSK Report Command + +This command is used to report the DSK of the node being S2 bootstrapped and indicates whether an input is needed for node authentication. + +[The Node Add DSK Set Command MUST be returned in response to this command.](04.05.10-network-management-inclusion-command-class-version-2.md#45107-node-add-dsk-set-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD DSK REPORT _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | Input DSK Length | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK 16 | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Input DSK Length (4 bits) + +This field is used to indicate how many DSK bytes MUST be input as a minimum to authenticate the node being included. + +The value 0 MUST indicate that no user input is necessary (e.g. Unauthenticated Security Class or CSA has been granted). + +DSK (16 bytes) + +[This field is used to transmit the DSK of the node being S2 bootstrapped. Refer to [15].](../04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 92 of 196 + +## 4.5.10.7 Node Add DSK Set Command + +This command is used to indicate the S2 bootstrapping controller if the DSK is accepted and report the user input when needed. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD DSK SET _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Accept | Reserved | | | Input DSK Length | | | | +| Input DSK 1 | | | | | | | | +| … | | | | | | | | +| Input DSK N | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Input DSK Length (4 bits) + +This field indicates the length in bytes of the DSK input by the user. + +This field MUST be set to the same or a higher value than the ”Input DSK Length” field value received in [the Node Add DSK Report Command that caused this command to be returned.](04.05.10-network-management-inclusion-command-class-version-2.md#45106-node-add-dsk-report-command) + +The value 0 MUST indicate that no user input has been done (e.g. Unauthenticated Security Class, CSA has been granted or user refused to input DSK). + +Input DSK (N bytes) + +This field indicates the DSK input by the user. A receiving node (Z/IP gateway) MUST overwrite the part of the DSK with the Input DSK contained in this frame + +The length of this field in bytes MUST be according to the Input DSK Length field value. If the Input DSK Length is set to 0, this field MUST be omitted. + +Accept (1 bit) + +This field is used to indicate if the DSK Report is accepted by the user and if S2 bootstrapping must continue. + +The value 0 MUST indicate that the DSK Report is not accepted and S2 bootstrapping MUST be interrupted. The value 1 MUST indicate that the DSK Report is accepted and S2 bootstrapping MUST continue. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 93 of 196 + +## 4.5.10.8 Failed Node Replace Command + +This command is used to replace a non-responding node with a new one in having the same NodeID. + +[The Failed Node Replace Status Command MUST be returned in response to this command unless it is](04.05.10-network-management-inclusion-command-class-version-2.md#45109-failed-node-replace-status-command) to be ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE REPLACE _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| NodeID | | | | | | | | +| tx Options | | | | | | | | +| Mode | | | | | | | | + +Fields not described in this version remain unchanged from version 1. + +Mode (1 byte) + +This field indicates the type of operation for the failed replace process. CC:0034.02.09.11.004 [This field MUST comply with Table 30](04.05.10-network-management-inclusion-command-class-version-2.md#45108-failed-node-replace-command) + +Table 30, Failed Node Replace::Mode encoding + +| Value | Identifier | Description | Version | +| --- | --- | --- | --- | +| 0x01 | START FAILED NODE REPLACE _ _ _ | Initiate a failed node replace process. | 1 | +| 0x05 | STOP FAILED NODE REPLACE _ _ _ | Cancel a failed node replace process. The command MAY be ignored if no replaced failed process is active. The command MAY be ignored if network inclusion is ongoing | 1 | +| 0x07 | START FAILED NODE REPLACE S2 _ _ _ _ | Initiate a failed node replace process and allow S2 bootstrapping for the new node | 2 | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 94 of 196 + +## 4.5.10.9 Failed Node Replace Status Command + +This command is used to indicate the progress of the Replace Failed Node Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND FAILED NODE REPLACE STATUS _ _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Node ID | | | | | | | | +| Granted Keys | | | | | | | | +| KEX Fail Type | | | | | | | | + +Fields not described in this version remain unchanged from version 1. + +Granted Keys (8 bits) + +This field is used to indicate which network keys were granted during bootstrapping. CC:0034.02.0A.11.001 [This field MUST be treated as a bitmask and comply with Table 28](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +KEX Fail Type (8 bits ) + +[Refer to 4.5.10.3 Node Add Status Command and Table 29.](04.05.10-network-management-inclusion-command-class-version-2.md#45103-node-add-status-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 95 of 196 + +## 4.5.10.10 Use cases and frame flows + +4.5.10.10.1 Z/IP Client with SIS or Primary controller including an S2 node + +The frame flow for an S2 capable node inclusion using the Network Management Inclusion Command [Class is shown in Figure 15.](04.05.10-network-management-inclusion-command-class-version-2.md#451010-use-cases-and-frame-flows) + +![Figure 15, Node inclusion with a SIS/Primary controller](assets/img-b56b7d57c5.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 96 of 196 4.5.10.10.2 Z/IP Client with an S2 inclusion controller including an S2 node + +When performing S2 bootstrapping, the unsolicited destination of the Z/IP Gateway will receive a unsolicited Node Add S2 Keys Report from the Z/IP Gateway. The Z/IP Client at this point has two options: + +1. Automatically grant requested S2 Classes without presenting a user dialog in the S2 Keys Report step. In this case, the Z/IP Client MUST present a user dialog in next step before sending the DSK Set 2. Using advanced joining where the user MUST confirm the specific keys being requested in a dialog, before continuing to next step. In this case, the Z/IP MAY present a user dialog in next step before sending the DSK Set, if required by the S2 Classes being granted. + +This is done without the SIS having entered Add Node mode. From this point on the S2 inclusion frame flow is same as when including through the SIS. + +The frame flow for the node inclusion when an S2 capable inclusion controller has been used for [including a new S2 capable node is shown in Figure 16.](04.05.10-network-management-inclusion-command-class-version-2.md#451010-use-cases-and-frame-flows) + +![Figure 16, Node inclusion with an S2 inclusion controller](assets/img-aacefd1a94.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 97 of 196 4.5.10.10.3 Z/IP Client with an S2 inclusion controller including an S0 node + +The unsolicited destination of the Z/IP Gateway will receive an unsolicited Node Add Status Report from the Z/IP Gateway. The unsolicited destination Z/IP Client MAY show a dialog informing that a node was included by an inclusion controller. + +The frame flow for an S0 capable node inclusion using an S2 capable inclusion controller including is [shown in Figure 17.](04.05.10-network-management-inclusion-command-class-version-2.md#451010-use-cases-and-frame-flows) + +![Figure 17, S0 node inclusion with an S2 inclusion controller](assets/img-efd36376f2.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 98 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.11-network-management-inclusion-command-class-version-3.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.11-network-management-inclusion-command-class-version-3.md new file mode 100644 index 0000000..0a2b93b --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.11-network-management-inclusion-command-class-version-3.md @@ -0,0 +1,178 @@ + +# 4.5.11 Network Management Inclusion Command Class, version 3 + +## 4.5.11.1 Compatibility considerations + +The Network Management Inclusion Command Class, version 3 is backwards compatible with the Network Management Inclusion Command Class, version 2. + +A node supporting the Network Management Inclusion Command Class, version 2 MUST also support the Network Management Inclusion Command Class, version 2. + +All commands and fields not mentioned in this version MUST remain unchanged from version 2. + +The following command has been extended to support the report of a Smart Start node: + + [Node Add Status Command](04.05.11-network-management-inclusion-command-class-version-3.md#45112-node-add-status-command) + +The following commands are introduced in order to support the Smart Start functionality: + + [Included Node Information Frame Report Command](04.05.11-network-management-inclusion-command-class-version-3.md#45113-included-node-information-frame-report-command)  [Smart Start Join Started Command](04.05.11-network-management-inclusion-command-class-version-3.md#45114-smart-start-join-started-command) + +[Frame flows for the new functionalities of this Command Class are shown in 4.5.11.5 Usage and frame flows. A Z/IP Gateway MUST comply with 4.5.11.5 Usage and frame flows.](04.05.11-network-management-inclusion-command-class-version-3.md#45115-usage-and-frame-flows) + +[A supporting node MUST issue the Node Add Status Command, Included Node Information Frame](04.05.11-network-management-inclusion-command-class-version-3.md#45112-node-add-status-command) [Report Command and the Smart Start Join Started Command to the first and the second unsolicited](04.05.11-network-management-inclusion-command-class-version-3.md#45113-included-node-information-frame-report-command) destinations. + +4.5.11.1.1 Command Class dependencies A node supporting the Network Management Inclusion Command Class, version 3 MUST also support the Node Provisioning Command Class, version 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 99 of 196 + +## 4.5.11.2 Node Add Status Command + +This command is used to report the result of the Node Add Command or report that a new node was included. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND NODE ADD STATUS (0x02) _ _ _ | | | | | | | | +| Seq No. | | | | | | | | +| Status | | | | | | | | +| Reserved | | | | | | | | +| New NodeID | | | | | | | | +| Node Info Length | | | | | | | | +| List. | Z-Wave Protocol Specific Part | | | | | | | +| Opt. Func. | Z-Wave Protocol Specific Part | | | | | | | +| Basic Device Class | | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| … | | | | | | | | +| Command Class N *) | | | | | | | | +| Granted Keys | | | | | | | | +| KEX Fail Type | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK L | | | | | | | | + +Fields not described below MUST remain unchanged from version 2. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 100 of 196 Status (8 bits) + +[This field indicates the outcome of the add mode and MUST comply with Table 31.](04.05.11-network-management-inclusion-command-class-version-3.md#45112-node-add-status-command) + +Table 31, Node Add Status::Status parameter encoding + +| Value | Status identifier | Description | Version | +| --- | --- | --- | --- | +| 0x06 | ADD NODE STATUS DONE _ _ _ | The new node has been included in the network. If the new node and controller support S0 or S2, it indicates that the network inclusion and security bootstrapping were completed successfully. (This includes the case where the node was granted no S2 key) | 1 | +| 0x07 | ADD NODE STATUS FAILED _ _ _ | The process failed, no new node was added in the network. Version 3: This status is also used if the node failed a smart start inclusion and has been removed. In this case, it may attempt the inclusion again. | 1 | +| 0x09 | ADD NODE STATUS SECURITY FAILED _ _ _ _ | Node has been included but the security bootstrapping failed | 1 | + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. + +This field MUST be set to 0 if the added node does not support the S2 Command Class. This field MUST be set to 16 if the added node supports the S2 Command Class. + +DSK (L bytes) + +This field MUST advertise the DSK of the node that has been added to the network. + +The length of this field (in bytes) MUST be according to the DSK Length field value. This field MUST be omitted if the DSK Length field is set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 101 of 196 + +## 4.5.11.3 Included Node Information Frame Report Command + +This command MUST be sent to the (first and second) unsolicited destinations when an Included NIF (INIF) is received and the following conditions are fulfilled: + + The advertised NHID matches an entry in the provisioning list  The advertised HomeID is different than the current network HomeID. + +[A node issuing this command MUST subsequently issue a Node Provisioning Report Command for the](../04.07-node-provisioning-command-class-version-1.md#477-node-provisioning-report-command) matched entry in the provisioning list. + +With the two commands, a Z/IP client can use the relevant information to guide the user on how to perform a reset operation on the device. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND INCLUDED NIF REPORT (0x19) _ _ _ | | | | | | | | +| Seq No. | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK N | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 16. + +DSK (N bytes) + +This field MUST advertise the DSK of the provisioning list entry that has been matched from the NHID in the received INIF. + +The length of this field (in bytes) MUST be according to the DSK Length field value. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 102 of 196 + +## 4.5.11.4 Smart Start Join Started Command + +This command MUST be sent to the (first and second) unsolicited destinations when a Smart Start inclusion starts. The Add Node Status Command MUST be issued after the Smart Start inclusion and S2 bootstrapping attempts took place. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT INCLUSION _ _ _ _ | | | | | | | | +| Command = COMMAND SMART START JOIN STARTED REPORT (0x15) _ _ _ _ _ | | | | | | | | +| Seq No. | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK N | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 16. + +DSK (N bytes) + +This field is used to advertise the DSK for the Provisioning List entry which starts the Smart Start inclusion process. + +The length of this field (in bytes) MUST be according to the DSK Length field value. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 103 of 196 + +## 4.5.11.5 Usage and frame flows + +4.5.11.5.1 Z/IP Gateway adding a Smart Start node that is on the provisioning list. The frame flow for a Smart Start inclusion of a node previously added on the provisioning list is shown [in Figure 18.](04.05.11-network-management-inclusion-command-class-version-3.md#45115-usage-and-frame-flows) + +![Figure 18, Smart Start inclusion](assets/img-69a524a802.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 104 of 196 4.5.11.5.2 Z/IP Gateway adding a Smart Start node that is subsequently added on the provisioning list. The frame flow for a Smart Start inclusion of a node subsequently added on the provisioning list is [shown in Figure 19.](04.05.11-network-management-inclusion-command-class-version-3.md#45115-usage-and-frame-flows) + +![Figure 19, Smart Start inclusion (2)](assets/img-d4d26891f2.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 105 of 196 4.5.11.5.3 Z/IP Gateway receiving an INIF from a node (the provisioning list) included in another network. [The frame flow for a Smart Start inclusion of a node included in another network is shown in Figure 20.](04.05.11-network-management-inclusion-command-class-version-3.md#45115-usage-and-frame-flows) + +![Figure 20, Smart Start inclusion (3)](assets/img-13d59fa9bc.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 106 of 196 4.5.11.5.4 Z/IP Gateway including an S2 only node that is on the provisioning list [The frame flow for an S2 only node (non-Smart Start) inclusion is shown in Figure 21. The Z/IP Client can](04.05.11-network-management-inclusion-command-class-version-3.md#45115-usage-and-frame-flows) decide to automatically grant the requested S2 keys or ask the user for confirmation. + +![Figure 21, S2 Only Node inclusion with user interaction](assets/img-3c34ebebda.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 107 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.12-network-management-primary-command-class-version-1-obsoleted.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.12-network-management-primary-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..b1edf9d --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.12-network-management-primary-command-class-version-1-obsoleted.md @@ -0,0 +1,94 @@ + +# 4.5.12 Network Management Primary Command Class, version 1 [OBSOLETED] + +THIS COMMAND CLASS HAS BEEN OBSOLETED + +New implementations MUST NOT support this Command Class. + +The Network Management Primary Command Class provides functions to pass on the primary role to another controller. + +## 4.5.12.1 Controller Change Command + +This command is used to add a controller node to the network and assign the primary controller role to the included controller. + +This command has the same functionality as Node Add with the exception that the new controller will become the primary controller and the controller adding the node will become secondary. + +[The Controller Change Status Command MUST be returned in response to this command.](04.05.12-network-management-primary-command-class-version-1-obsoleted.md#45122-controller-change-status-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST ignore this command if it is received via multicast addressing. The Z-Wave CC:0054.01.01.11.003 Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PRIMARY _ _ _ _ | | | | | | | | +| Command = COMMAND CONTROLLER CHANGE _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | | | | | | +| Mode | | | | | | | | +| tx Options | | | | | | | | + +Seq No (1 byte) + +[Refer to 4.5.1.1 Sequence Number management.](04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Mode (1 byte) + +This field is use to indicate to the receiving node if the controller change mode must be activated or de- [activated. This field MUST comply with Table 32.](04.05.12-network-management-primary-command-class-version-1-obsoleted.md#45121-controller-change-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 108 of 196 Table 32, Controller Change::Mode encoding + +| Value | Mode identifier | Description | +| --- | --- | --- | +| 0x02 | CONTROLLER CHANGE START _ _ | Start the process of creating a new primary controller for the network | +| 0x05 | CONTROLLER CHANGE STOP _ _ | Stop the controller change and report a failure | + +tx Options (1 byte) + +The tx Options field allows a controlling node to specify if transmissions MUST use special properties.. [This field MUST be treated as a bitmask and MUST comply with Table 33](04.05.12-network-management-primary-command-class-version-1-obsoleted.md#45121-controller-change-command) + +Table 33, Controller Change::Tx Options encoding + +| Value | Option identifier | Description | +| --- | --- | --- | +| 0x00 | NULL | Transmit at normal power level without any transmit options. | +| 0x02 | TRANSMIT OPTION LOW POWER _ _ _ | Transmit at low output power level (1/3 of normal RF range) | +| 0x20 | TRANSMIT OPTION EXPLORE _ _ | Resolve new routes via explorer discovery if existing routes fail | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 109 of 196 + +## 4.5.12.2 Controller Change Status Command + +This command is used to advertise the outcome of the Controller Change attempt. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NETWORK MANAGEMENT PRIMARY _ _ _ _ | | | | | | | | +| Command = COMMAND CONTROLLER CHANGE STATUS _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Status | | | | | | | | +| Reserved | | | | | | | | +| New NodeID | | | | | | | | +| Node Info Length | | | | | | | | +| List. | Z-Wave Protocol Specific Part | | | | | | | +| Opt. Func. | Z-Wave Protocol Specific Part | | | | | | | +| Basic Device Class | | | | | | | | +| Generic Device Class | | | | | | | | +| Specific Device Class | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | + +*) Command classes may be extended  spanning two bytes for one command class + +[For fields’ description, refer to 4.5.9.2 Node Add Status Command.](04.05.09-network-management-inclusion-command-class-version-1/04.05.09.02-node-add-status-command.md#4592-node-add-status-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 110 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.13-network-management-installation-and-maintenance-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.13-network-management-installation-and-maintenance-command-class-version-1.md new file mode 100644 index 0000000..19fc59c --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.13-network-management-installation-and-maintenance-command-class-version-1.md @@ -0,0 +1,345 @@ + +# 4.5.13 Network Management Installation and Maintenance Command Class, version 1 + +The Network Management Installation and Maintenance Command Class is used to access statistical data. Data relating to the transmission of an actual frame may be obtained via the Z/IP Packet Installation and Maintenance Header Extension. + + All Transmissions / Route Information: Packet Error Count (PEC) – Also sometimes referred to as PER. o The number of unsuccessful transmissions experienced by the device. Transmission Counter (TC) – Number of frames sent by the specified device. o Neighbors (NB) – Information on known neighbors for a specified device. o Network Management - Priority Route Set o Network Management - Priority Route Get o Network Management - Priority Route Report o + +## 4.5.13.1 Priority Route Set + +This command is used to set the network route to use when sending commands to the specified NodeID. + +The use of this command is NOT RECOMMENDED. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = PRIORITY ROUTE SET _ _ | | | | | | | | +| NodeID | | | | | | | | +| Repeater 1 [First repeater] | | | | | | | | +| Repeater 2 | | | | | | | | +| Repeater 3 | | | | | | | | +| Repeater 4 [Last repeater] | | | | | | | | +| Speed. | | | | | | | | + +NodeID (1 byte) + +This field is used to specify the destination NodeID for which a last working route MUST be set. + +Repeater (4 bytes) + +This field is used to specify repeaters for the route. Each byte represents a NodeID and the first field (Repeater 1) is the first repeater of the route. + +The value 0x00 MUST indicate that the byte does not represent a repeater. If the route is shorter than four repeaters, unused repeaters fields MUST be set to 0x00. If Repeater 1 is set to 0x00, it means that the Last Working Route is direct (nodes are within direct reach). + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 111 of 196 Speed (1 byte) + +This field is used to indicate which speed MUST be used for the route. This field MUST comply with [Table 34.](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45131-priority-route-set) + +Table 34, IME Speed Encoding + +| Value | Speed | +| --- | --- | +| 0x01 | 9.6 kbit/sec | +| 0x02 | 40 kbit/sec | +| 0x03 | 100 kbit/sec | + +## 4.5.13.2 Priority Route Get + +This command is used to query the current network route from a node for a given destination. + +[The Priority Route Report MUST be returned in response to this command.](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45133-priority-route-report) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = PRIORITY ROUTE GET _ _ | | | | | | | | +| NodeID | | | | | | | | + +NodeID (1 byte) + +This field is used to specify the NodeID destination for which the current network route is requested. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 112 of 196 + +## 4.5.13.3 Priority Route Report + +This command is used to advertise the current network route in use for an actual destination NodeID. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = PRIORITY ROUTE REPORT _ _ | | | | | | | | +| NodeID. | | | | | | | | +| Type | | | | | | | | +| Repeater 1 – 1 [First repeater] | | | | | | | | +| Repeater 2 – 1. | | | | | | | | +| Repeater 3 – 1. | | | | | | | | +| Repeater 4 – 1 [Last repeater] | | | | | | | | +| Speed -1. | | | | | | | | + +Type (1 byte) + +[This field is used to indicate the route type. It MUST comply with Table 35. A node MUST return the](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45133-priority-route-report) route with the highest priority value if several routes are available at the node. + +Table 35, Route type encoding + +| Value | Identifier | Description | Priority | +| --- | --- | --- | --- | +| 0x00 | - | There is no route defined for the target NodeID. In this case, the Repeater and Speed fields MUST be set to 0x00 and ignored by a receiving node. | 4 (lowest) | +| 0x01 | ZW PRIORITY ROUTE ZW LWR _ _ _ _ | The returned route is a last working route. The Last Working route is the last successful route used between the sender and receiver. | 2 | +| 0x02 | ZW PRIORITY ROUTE ZW NLWR _ _ _ _ | The returned route is a next to last working route. It is a route which was Last Working Route and has been replaced by a new route. | 3 | +| 0x10 | ZW PRIORITY ROUTE APP PR _ _ _ _ | The returned has been determined by the application | 1 (highest) | + +Repeater (4 bytes) + +[Refer to 4.5.13.1 Priority Route Set.](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45131-priority-route-set) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 113 of 196 Speed (1 byte) + +[Refer to 4.5.13.1 Priority Route Set.](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45131-priority-route-set) + +## 4.5.13.4 Statistics Get + +This command is used to query Installation and Maintenance statistics from a node. + +[The Statistics Report MUST be returned in response to this command.](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45135-statistics-report) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = STATISTICS GET _ | | | | | | | | +| NodeID | | | | | | | | + +NodeID (1 byte) + +This field is used to specify the NodeID for which statistics are requested. + +## 4.5.13.5 Statistics Report + +This command is used to report Installation and Maintenance statistics recorded by a node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = STATISTICS REPORT _ | | | | | | | | +| NodeID | | | | | | | | +| Statistics – Type 1 | | | | | | | | +| Statistics – Length 1 | | | | | | | | +| Statistics – Value 1 | | | | | | | | +| … | | | | | | | | +| Statistics – Type N | | | | | | | | +| Statistics – Length N | | | | | | | | +| Statistics – Value N | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 114 of 196 NodeID (1 byte) + +This field MUST carry the same value as received in the Statistics Get Command. + +Statistics (N bytes) + +The statistics field MUST be formatted as cascaded Type-Length-Value (TLV) structures. The Z/IP [Gateway MAY send any combination of TLV structures. Valid types are shown in Table 36.](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md#45135-statistics-report) CC:0067.01.04.13.001 + +Table 36, Statistics Get::Type encoding + +| Name | Statistics – Type | Statistics - Length (Bytes) | +| --- | --- | --- | +| Route Changes (RC) | 0 | 1 | +| Transmission Count (TC) | 1 | 1 | +| Neighbors (NB) | 2 | n | +| Packet Error Count (PEC) | 3 | 1 | +| Sum of transmission times (TS) | 4 | 4 | +| Sum of transmission times squared (TS2) | 5 | 4 | + +CC:0067.01.04.11.006 All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +4.5.13.5.1 Route Changes (RC) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Statistics - Type = 0x00 | | | | | | | | +| Statistics – Length = 1 | | | | | | | | +| Statistics – Value = Route Changes | | | | | | | | + +Route Changes (1 byte) + +The RC field is used to advertise the number of routing attempts needed to reach a destination. The number is a combination of Last Working Route (LWR) changes and Jitter measurements during transmission attempts between the Z/IP Gateway and the Z-Wave device. + +RC is incremented automatically by the Z/IP Gateway when either of the below conditions are true: + + Last Working Route changed from the transmission of one command to the next  T – T> 150ms where T and T = the time needed to complete a transmission of a command n n-1 n n-1 IF 2 channel and FLIRS node, RC: T = T mod 1100 n n o IF 3 channel and FLIRS node, RC cannot increment based on time calculation o + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 115 of 196 4.5.13.5.2 Transmission Count (TC) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Statistics - Type = 0x01 | | | | | | | | +| Statistics – Length = 1 | | | | | | | | +| Statistics – Value = Transmission Count | | | | | | | | + +Transmission Count (1 byte) + +Total number of transmissions sent by all Z/IP Clients through the Z/IP GW to the specified Z-Wave destination node. + +4.5.13.5.3 Neighbors (NB) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Statistics - Type = 0x02 | | | | | | | | +| Statistics – Length = N * 2 | | | | | | | | +| Statistics – Value = NodeID 1 | | | | | | | | +| Statistics – Value = Repeater 1 | Reserved | | Statistics – Value = Speed 1 | | | | | +| … | | | | | | | | +| Statistics – Value = NodeID N | | | | | | | | +| Statistics – Value = Repeater N | Reserved | | Statistics – Value = Speed N | | | | | + +NodeID (N * 1 byte) + +The NodeID of the actual neighbor. + +Speed (N * 4 bits) + +Table 37, Statistics Report::Speed Encoding + +| Bitmask | Speed | +| --- | --- | +| 0x01 | 9.6 kbit/sec | +| 0x02 | 40 kbit/sec | +| 0x04 | 100 kbit/sec | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 116 of 196 Repeater (N * 1 bit) + +If this bit is set then the node is a repeater. + +4.5.13.5.4 Packet Error Count (PEC) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Statistics - Type = 0x03 | | | | | | | | +| Statistics – Length = 1 | | | | | | | | +| Statistics – Value = Packet Error Count | | | | | | | | + +Packet Error Count (1 byte) + +Also sometimes referred to as PER. PEC is measured by the Gateway. The PEC value MUST be incremented each time the Gateway detects a failing transmission for each specific Z-Wave destination node. + +4.5.13.5.5 Sum of transmission times (TS) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Statistics - Type = 0x04 | | | | | | | | +| Statistics – Length = 4 | | | | | | | | +| Statistics – Value = Sum of transmission times 1 (MSB) | | | | | | | | +| Statistics – Value = Sum of transmission times 2 | | | | | | | | +| Statistics – Value = Sum of transmission times 3 | | | | | | | | +| Statistics – Value = Sum of transmission times 4 (LSB) | | | | | | | | + +Sum of transmission times (4 bytes) + +The sum of all transmission times. This may be used to calculate the average transmission time. The time is given as a 32-bit unsigned integer MSB in milliseconds. + +1 ∑ 〈𝑇〉= 𝑇 𝑖 𝑁 + +Where N is the number of transmissions. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 117 of 196 4.5.13.5.6 Sum of transmission times squared (TS2) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Statistics - Type = 0x05 | | | | | | | | +| Statistics – Length = 4 | | | | | | | | +| Statistics – Value = Sum of transmission times squared 1 (MSB) | | | | | | | | +| Statistics – Value = Sum of transmission times squared 2 | | | | | | | | +| Statistics – Value = Sum of transmission times squared 3 | | | | | | | | +| Statistics – Value = Sum of transmission times squared 4 (LSB) | | | | | | | | + +Sum of transmission times squared (4 bytes) + +The sum of the square of all transmission times. This may be used to calculate the variance of the transmission time. The time is given as a 32 bit unsigned integer MSB in milliseconds^2. + +The Variance may be calculated as follows: + +1 ∑ 〈 2 〉 2 𝑇 = 𝑇 𝑖 𝑁 + +(König-Huygens theorem) + +Where N is the number of transmissions. + +A high variance is a sign of a bad link. + +## 4.5.13.6 Statistics Clear + +This command is used to clear all statistic registers maintained by the node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = STATISTICS CLEAR _ | | | | | | | | + +A receiving node MUST set all counters to 0. + +## 4.5.13.7 Use Cases + +4.5.13.7.1 Intranode network management: TV OSD System controlling lamps Intranode network management is the process close to Z-Wave API programming. No messages ever leave the device. Messages only flow between different software modules. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 118 of 196 Use Case: TV OSD System (island mode) + +Figure 22, TV OSD System controlling lamps + +Using UDP/IP for carrying the messages allows for a simple integration interface between applications designed by different partners. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 119 of 196 4.5.13.7.2 Intranet network management: Remote controlling a primary controller Intranet network management extends the use of command messages to separate physical devices. Messages flow between software modules but the modules reside in separate physical entities having individual IP addresses – or at least separate NodeIDs. + +Use Case: Managing a primary static controller from a remote control + +| <> Management device Home User | Primary controller Add Node Delete Node Reset Z-Wave commands OR Z-Wave commands in UDP packets | <> New node <> Existing node | +| --- | --- | --- | + +Figure 23, Managing a primary static controller from a remote control + +Network management via messages allows for sophisticated interfaces to the primary controller of a network. Controllers with SUC/SIS capability may also leverage from the Network Management command classes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 120 of 196 4.5.13.7.3 Internet network management #1: Call-center support for TV OSD user Internet network management uses the same command messages. Messages flow between software modules but the modules reside in separate physical entities in a non-trusted environment such as the Internet. Remote access technologies should be used to protect the communication. + +In this use case a TV user may call the service provider for support in adding a new lamp to the network. + +Use Case: TV OSD System (Connected) + +Figure 24, TV OSD System + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 121 of 196 4.5.13.7.4 Internet network management #2: Remote management of Z/IP Network In this use case a user may use an IP based home control management system running in the LAN for setting up the Z/IP network. The user may use normal UDP transport in the LAN environment. Due to the critical nature of the network management command classes the user however should use remote access protection technologies over LAN as well as over Internet. The benefit of designing a home control system using remote access protection by default is that it may be moved from a location in the LAN to any place in the Internet and work completely unaffected. + +Use Case: Z/IP Router in Consumer Premises + +Figure 25, Z/IP Router in consumer premises + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 122 of 196 4.5.13.7.5 Traffic flow: Gathering node information The following sequence diagram introduces a new concept of gathering Node Information. + +The node list provides an overview of the nodes in the network; as good as the Z/IP gateway can provide this information. Using that node list, the requesting host may request information on individual nodes from the Z/IP Gateway. The ”Node Info Cached Get” command reports all supported and controlled classes. + +| | Z/IP Gateway | | | +| --- | --- | --- | --- | +| | | | | +| | | | | +| | | #4 | | + +| | Z-Wave Node | | +| --- | --- | --- | +| | | | +| | | | + +Figure 26, Gathering node information + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 123 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.14-network-management-installation-and-maintenance-command-class-version-2.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.14-network-management-installation-and-maintenance-command-class-version-2.md new file mode 100644 index 0000000..9c00898 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/04.05.14-network-management-installation-and-maintenance-command-class-version-2.md @@ -0,0 +1,68 @@ + +# 4.5.14 Network Management Installation and Maintenance Command Class, version 2 + +## 4.5.14.1 Compatibility considerations + +The Network Management Installation and Maintenance Command Class, version 2 is backwards compatible with the Network Management Installation and Maintenance Command Class, version 1. + +All commands and fields not mentioned in this version MUST remain unchanged from version 1. + +The following commands have been added to allow a supporting node to report the RSSI it measured in each channel of the network: + + [RSSI Get Command](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md#45142-rssi-get-command)  [RSSI Report Command](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md#45142-rssi-get-command) + +## 4.5.14.2 RSSI Get Command + +This command is used to query the measured RSSI on the Z-Wave network from a node. + +[The RSSI Report Command MUST be returned in response to this command.](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md#45142-rssi-get-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = COMMAND RSSI GET (0x07) _ _ | | | | | | | | + +## 4.5.14.3 RSSI Report Command + +This command is used to advertise the measured RSSI on the Z-Wave network for each used channel. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| COMMAND CLASS = NETWORK MANAGEMENT INSTALLATION MAINTENANCE _ _ _ _ | | | | | | | | +| COMMAND = COMMAND RSSI REPORT (0x08) _ _ | | | | | | | | +| Channel 1 RSSI | | | | | | | | +| Channel 2 RSSI | | | | | | | | +| Channel 3 RSSI | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 124 of 196 Channel 1 RSSI (8 bits) + +This field MUST carry the measured RSSI value on channel 1. [This field MUST be encoded as using signed representation in the dBm unit and according to Table 38.](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md#45143-rssi-report-command) + +Channel 2 RSSI (8 bits) + +This field MUST carry the measured RSSI value on channel 2. [This field MUST be encoded as using signed representation in the dBm unit and according to Table 38.](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md#45143-rssi-report-command) + +Channel 3 RSSI (8 bits) + +This field MUST carry the measured RSSI value on channel 3, if applicable. [This field MUST be encoded as using signed representation in the dBm unit and according to Table 38.](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md#45143-rssi-report-command) + +Table 38, RSSI encoding + +| Value (signed) | Description | +| --- | --- | +| 127 (0x7F) | RSSI NOT AVAILABLE. _ _ This value is returned for unused channels or if no RSSI measurement is available. | +| 126 (0x7E) | RSSI MAX POWER SATURATED _ _ _ This value is returned if the measured RSSI is above the maximum power. | +| 125 (0x7D) | RSSI BELOW SENSITIVITY. _ _ This value is returned if the measured RSSI is below the receiver’s sensitivity. | +| -32..-94 (0xE0..0xA2) | These values represent the actual RSSI measurement value from respectively -32 dBm to -94 dBm | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 125 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/index.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/index.md new file mode 100644 index 0000000..4413b9a --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.05-network-management-command-classes/index.md @@ -0,0 +1,25 @@ + +# 4.5 Network Management Command Classes + +## Contents + +- [4.5.1 Compatibility considerations](04.05.01-compatibility-considerations.md) +- [4.5.2 Scope of Network Management](04.05.02-scope-of-network-management.md) +- [4.5.3 Security considerations](04.05.03-security-considerations.md) +- [4.5.4 Network Management Proxy Command Class, version 1](04.05.04-network-management-proxy-command-class-version-1.md) +- [4.5.5 Network Management Proxy Command Class, version 2](04.05.05-network-management-proxy-command-class-version-2.md) +- [4.5.6 Network Management Proxy Command Class, version 3](04.05.06-network-management-proxy-command-class-version-3.md) +- [4.5.7 Network Management Basic Node Command Class, version 1](04.05.07-network-management-basic-node-command-class-version-1.md) +- [4.5.8 Network Management Basic Node Command Class, version 2](04.05.08-network-management-basic-node-command-class-version-2.md) +- [4.5.9 Network Management Inclusion Command Class, version 1](04.05.09-network-management-inclusion-command-class-version-1/index.md) +- [4.5.10 Network Management Inclusion Command Class, version 2](04.05.10-network-management-inclusion-command-class-version-2.md) +- [4.5.11 Network Management Inclusion Command Class, version 3](04.05.11-network-management-inclusion-command-class-version-3.md) +- [4.5.12 Network Management Primary Command Class, version 1 [OBSOLETED]](04.05.12-network-management-primary-command-class-version-1-obsoleted.md) +- [4.5.13 Network Management Installation and Maintenance Command Class, version 1](04.05.13-network-management-installation-and-maintenance-command-class-version-1.md) +- [4.5.14 Network Management Installation and Maintenance Command Class, version 2](04.05.14-network-management-installation-and-maintenance-command-class-version-2.md) diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.06-no-operation-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.06-no-operation-command-class-version-1.md new file mode 100644 index 0000000..7af5cdb --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.06-no-operation-command-class-version-1.md @@ -0,0 +1,18 @@ + +# 4.6 No Operation Command Class, version 1 + +The No Operation Command Class is used to check if a node is reachable by sending a Command less frame to the specified destination. Feature used by the Z-Wave protocol in many situations e.g. checking that an excluded node is non-responding. This Command can also be used on application level e.g. checking if a SUC/SIS is reachable from a new node in the network. This command class contains no command identifier and data. + +Notice: It is not necessary to announce the No Operation Command Class in the NIF. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NO OPERATION _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 126 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.07-node-provisioning-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.07-node-provisioning-command-class-version-1.md new file mode 100644 index 0000000..755ab34 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.07-node-provisioning-command-class-version-1.md @@ -0,0 +1,335 @@ + +# 4.7 Node Provisioning Command Class, version 1 + +The Node Provisioning Command Class is used to manage a list of unique nodes (Node Provisioning List) in a Smart Start enabled controller or gateway. + +## 4.7.1 Terminology + +Smart start allows a controller to include new nodes in a network (or keep them out) without user interaction. + +A Smart Start enabled controller or gateway maintains a Node Provisioning List or Provisioning List (PL). The Provisioning List is a list of unique nodes and their additional associated meta data necessary for performing their network inclusion and security bootstrapping. + +A Provisioning List entry represents a node and its associated data. Provisioning List entries may also be used for ignoring nodes. + +A Z/IP Client or controller can read and edit the Provisioning List entries of a Z/IP Gateway or controller using this Command Class. + +## 4.7.2 Compatibility considerations + +This Command Class MAY be carried in Z/IP Packets or in Z-Wave frames. However, this Command Class SHOULD only be used in Z/IP Packets. + +A node supporting this Command Class MUST support at least 232 entries in its Node Provisioning List. + +## 4.7.3 Security considerations + +This Command Class allows a controlling node to include new nodes in the Z-Wave network and grant them all the security keys. + +A node supporting this Command Class MUST NOT support it in a Z-Wave network if its highest Security Class is lower than S2 Access Control. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 127 of 196 + +## 4.7.4 Node Provisioning Set Command + +This command is used to create or update an entry in the node provisioning list of a supporting node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE PROVISIONING _ _ _ | | | | | | | | +| Command = COMMAND NODE PROVISIONING SET (0x01) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK N | | | | | | | | +| Meta Data Extension 1 (Optional) | | | | | | | | +| … | | | | | | | | +| Meta Data Extension M (Optional) | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05-network-management-command-classes/04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 16. + +DSK (N bytes) + +This field is used to advertise the DSK for the entry being added or updated. + +A receiving node MUST add a new entry in the provisioning list if it does not have any entry with the advertised DSK value. A receiving node MUST ignore a command attempting to create a new entry if the Provisioning List is full. A receiving node MUST update the corresponding entry in the provisioning list if it already has an entry with the advertised DSK value. + +The length of this field (in bytes) MUST be according to the DSK Length field value. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 128 of 196 Meta Data Extension (M bytes) + +This field is used to carry additional metadata associated to the node. + +This field MAY contain zero, one or several extensions. [Each extension MUST comply with 4.7.10 Meta Data extension format and [23].](04.07-node-provisioning-command-class-version-1.md#479-node-provisioning-list-iteration-report-command) + +If the Bootstrapping mode Type (0x36) is omitted from this command, the Bootstrapping mode value 1 (Smart Start Mode) MUST be assumed by the receiving node when creating a new entry. + +If the SmartStart Inclusion Setting Type (0x34) is omitted from this command, the Inclusion setting value 0 (Pending) MUST be assumed by the receiving node when creating a new entry that has a SmartStart Bootstrapping mode. + +The Network Status Type (0x37) MUST NOT be carried in this command. The Network Status Type (0x37) MUST be ignored if received in this command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 129 of 196 + +## 4.7.5 Node Provisioning Delete Command + +This command is used to delete one or all entries in the node provisioning list of a supporting node. Already included nodes will stay in the Z-Wave network even if no more corresponding node provisioning list entry is kept by the controller. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE PROVISIONING _ _ _ | | | | | | | | +| Command = COMMAND NODE PROVISIONING DELETE (0x02) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK N | | | | | | | | + +Seq No (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05-network-management-command-classes/04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 0 or 16. + +The value 0 MUST indicate that the receiving node MUST delete all entries in its Node Provisioning List. The value 16 MUST indicate that the receiving node MUST delete the entry in its Node Provisioning List that match the advertised value in the DSK field. + +DSK (N bytes) + +This field is used to advertise the DSK for the entry being deleted. + +A receiving node MUST delete the corresponding entry from the Node Provisioning List if it has an entry with the advertised DSK value. A receiving node MUST ignore this command if it has no entry with the advertised DSK value. + +The length of this field (in bytes) MUST be according to the DSK Length field value. This field MUST be omitted if the DSK Length field is set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 130 of 196 + +## 4.7.6 Node Provisioning Get Command + +This command is used to request the metadata information associated to an entry in the node Provisioning List of the receiving node. + +[The Node Provisioning Report Command MUST be returned in response to this command.](04.07-node-provisioning-command-class-version-1.md#477-node-provisioning-report-command) + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE PROVISIONING _ _ _ | | | | | | | | +| Command = COMMAND NODE PROVISIONING GET (0x05) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 | | | | | | | | +| … | | | | | | | | +| DSK N | | | | | | | | + +Seq No. (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05-network-management-command-classes/04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 16. + +DSK (N bytes) + +This field is used to advertise the DSK for the entry being requested. + +A receiving node MUST return the corresponding DSK entry if it has an entry matching the requested DSK in its Provisioning List. A receiving node MUST return a report containing no DSK (DSK Length set to 0) if the requested DSK value is not in its Provisioning List. + +The length of this field (in bytes) MUST be according to the DSK Length field value. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 131 of 196 + +## 4.7.7 Node Provisioning Report Command + +This command is used to advertise the contents of an entry in the node Provisioning List of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE PROVISIONING _ _ _ | | | | | | | | +| Command = COMMAND NODE PROVISIONING REPORT (0x06) _ _ _ | | | | | | | | +| Seq No | | | | | | | | +| Reserved | | | DSK Length | | | | | +| DSK 1 (Optional) | | | | | | | | +| … | | | | | | | | +| DSK N (Optional) | | | | | | | | +| Meta Data Extension 1 (Optional) | | | | | | | | +| … | | | | | | | | +| Meta Data Extension M (Optional) | | | | | | | | + +Seq No. (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05-network-management-command-classes/04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 0 or 16 + +The value 0 MUST indicate that the requested DSK is not present in the Provisioning List. + +DSK (N bytes) + +This field is used to advertise the DSK for the Provisioning List entry being advertised. + +The length of this field (in bytes) MUST be according to the DSK Length field value. This field MUST be omitted if the DSK Length field is set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 132 of 196 Meta Data Extension (M bytes) + +This field is used to carry additional metadata associated to the Provisioning List entry. + +This field MAY contain several extensions. [Each extension Type, Length and Value MUST comply with 4.7.10 Meta Data extension format and [23].](04.07-node-provisioning-command-class-version-1.md#479-node-provisioning-list-iteration-report-command) + +A supporting node MAY set the critical flag to 0 even when advertising critical extensions. + +If the DSK Length field is set to 0, this field MUST be omitted. + +If the DSK Length field is not set to 0:  A sending node MUST advertise the SmartStart Inclusion Setting extension (type 0x34)  CC:0078.01.06.11.009 A sending node MUST advertise the Bootstrapping mode extension (type 0x36)  A sending node MUST advertise the Network Status extension (type 0x37)  A sending node MUST advertise all other extension data kept in the Provisioning List + +## 4.7.8 Node Provisioning List Iteration Get Command + +This command is used to read the entire the provisioning list of a supporting node. + +[The Node Provisioning List Iteration Report Command MUST be returned in response to this command](04.07-node-provisioning-command-class-version-1.md#479-node-provisioning-list-iteration-report-command) unless it is to be ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +[A sending node MUST follow the frame flow in 4.7.11.1.](04.07-node-provisioning-command-class-version-1.md#47111-zip-client-requesting-the-entire-node-provisioning-list) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE PROVISIONING _ _ _ | | | | | | | | +| Command = COMMAND NODE PROVISIONING LIST ITERATION GET (0x03) _ _ _ _ _ | | | | | | | | +| Seq No. | | | | | | | | +| Remaining Counter | | | | | | | | + +Seq No. (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05-network-management-command-classes/04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 133 of 196 Remaining Counter (8 bits) + +This field is used to iterate over the Provisioning List. The field indicates the remaining amount of CC:0078.01.03.11.005 entries in the Provisioning List. This field MUST be in the range 0x01..0xFF. + +This field MUST be set to 0xFF to start a new iteration. A supporting node MUST return the first entry and the actual amount of remaining entries in the returned report, i.e. If the Provisioning list has 3 elements the first response Remaining Count field MUST be set to 2. + +A sending node MUST subsequently set this field to the returned value ”Remaining Count” value received in the returned Report if the ”Remaining Count” value is higher than 0x00. A supporting node MUST ignore this field if it is not set to the expected next iteration value. + +This command MUST be ignored by a supporting node if this field is set to a value lower than 0xFF and no iteration has been started. + +[Refer to 4.7.11.1.](04.07-node-provisioning-command-class-version-1.md#47111-zip-client-requesting-the-entire-node-provisioning-list) + +## 4.7.9 Node Provisioning List Iteration Report Command + +This command is used to advertise the contents of an entry in the Provisioning List of the sending node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS NODE PROVISIONING _ _ _ | | | | | | | | +| Command = COMMAND NODE PROVISIONING LIST ITERATION REPORT (0x04) _ _ _ _ _ | | | | | | | | +| Seq No. | | | | | | | | +| Remaining Count | | | | | | | | +| Reserved | | | DSK Length N | | | | | +| DSK 1 (Optional) | | | | | | | | +| … | | | | | | | | +| DSK N (Optional) | | | | | | | | +| Meta Data Extension 1 (Optional) | | | | | | | | +| … | | | | | | | | +| Meta Data Extension M (Optional) | | | | | | | | + +Seq No. (8 bits) + +[Refer to 4.5.1.1 Sequence Number management.](04.05-network-management-command-classes/04.05.01-compatibility-considerations.md#451-compatibility-considerations) + +Remaining Count (8 bits) + +The field MUST indicate the remaining amount of entries in the Provisioning List iteration. This field MUST be in the range 0x00..0xFE. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 134 of 196 DSK Length (5 bits) + +This field MUST indicate the length of the DSK field in bytes. This field MUST be set to 0 or 16. + +The value 0 MUST indicate that the Provisioning List of the sending node is empty or the Provisioning List Entry has been deleted after the start of the iteration. The value 16 MUST indicate that the sending node advertises the DSK of a Provisioning List entry. + +DSK (N bytes) + +This field is used to advertise the DSK for the Provisioning List entry being advertised. + +The length of this field (in bytes) MUST be according to the DSK Length field value. This field MUST be omitted if the DSK Length field is set to 0. + +Meta Data Extension (M bytes) + +This field is used to carry additional metadata associated to the Provisioning List entry. + +This field MAY contain several extensions. [Each extension Type, Length and Value MUST comply with 4.7.10 Meta Data extension format and [23].](04.07-node-provisioning-command-class-version-1.md#479-node-provisioning-list-iteration-report-command) + +A supporting node MAY set the critical flag to 0 even when advertising critical extensions. + +If the DSK Length field is set to 0, this field MUST be omitted. + +If the DSK Length field is not set to 0:  A sending node MUST advertise the SmartStart Inclusion Setting extension (type 0x34)  A sending node MUST advertise the Bootstrapping mode extension (type 0x36)  A sending node MUST advertise the Network Status extension (type 0x37)  A sending node MUST advertise all other extension data kept in the Provisioning List + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 135 of 196 + +## 4.7.10 Meta Data extension format + +Each Meta Data extension MUST be parsed according to the following format: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Meta Data Type | | | | | | | Critical | +| Length | | | | | | | | +| Value 1 (Optional) | | | | | | | | +| … | | | | | | | | +| Value L (Optional) | | | | | | | | + +Meta Data Type (7 bits) + +This field is used to advertise the type of the data contained in the corresponding extension. + +[For the list of defined valid extensions, refer to [23]. Values not defined in [23] are reserved and MUST](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) NOT be used by a sending node. + +Critical (1 bit) + +This field is used to advertise the criticality of the extension. + +A supporting node MUST discard and ignore the entire command if this flag is set to ‘1’ and the Meta Data Type field advertises a value that the node does not support. A controlling node which controls only (i.e. does not support this Command Class) SHOULD keep the Provisioning List entry in its record even if this flag is set to ‘1’ and the node does not know what the extension means. + +If this flag is set to ‘0’ and the Meta Data Type field advertises a value that the receiving node does not CC:0078.01.00.11.004 support, the actual extension MUST be ignored and left out the provisioning list entry. In this case, a receiving node MUST continue processing of the encapsulation command after the discarded extension. + +Length (8 bits) + +This field MUST indicate the length of the corresponding Value field in bytes. + +Value (L bytes) + +This field MUST indicate the value of the Meta Data type being advertised in the extension. + +The length of this field (in bytes) MUST be according to the corresponding Length field value .This field MUST be omitted if the corresponding Length field is set to 0. + +[The encoding of this field MUST be interpreted with the Meta Data Type field as defined in [23].](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 136 of 196 + +## 4.7.11 Usage and frame flows + +### 4.7.11.1 Z/IP Client requesting the entire Node Provisioning list. + +The frame flow for Z/IP client requesting the entire Provisioning List of a supporting node is shown in [Figure 27.](04.07-node-provisioning-command-class-version-1.md#47111-zip-client-requesting-the-entire-node-provisioning-list) + +![Figure 27, Reading the entire Node Provisioning List](assets/img-5f06f48277.png) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 137 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.08-powerlevel-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.08-powerlevel-command-class-version-1.md new file mode 100644 index 0000000..1917411 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.08-powerlevel-command-class-version-1.md @@ -0,0 +1,183 @@ + +# 4.8 Powerlevel Command Class, version 1 + +The Powerlevel Command Class defines RF transmit power controlling Commands useful when installing or testing a network. The Commands makes it possible for supporting controllers to set/get the RF transmit power level of a node and test specific links between nodes with a specific RF transmit power level. + +NOTE: This Command Class is only used in an installation or test situation. + +## 4.8.1 Powerlevel Set Command + +This command is used to set the power level indicator value, which should be used by the node when transmitting RF, and the timeout for this power level indicator value before returning the power level defined by the application. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS POWERLEVEL _ _ | | | | | | | | +| Command = POWERLEVEL SET _ | | | | | | | | +| Power level | | | | | | | | +| Timeout | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 138 of 196 Power level (8 bits) + +This field indicates the power level value that the receiving node MUST set. + +[This field MUST be encoded according to Table 39:](04.08-powerlevel-command-class-version-1.md#481-powerlevel-set-command) + +Table 39, Powerlevel Set::Power level encoding + +| Value | Description | +| --- | --- | +| 0x00 | NormalPower | +| 0x01 | minus1dBm | +| 0x02 | minus2dBm | +| 0x03 | minus3dBm | +| 0x04 | minus4dBm | +| 0x05 | minus5dBm | +| 0x06 | minus6dBm | +| 0x07 | minus7dBm | +| 0x08 | minus8dBm | +| 0x09 | minus9dBm | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +Timeout value is ignored if Power level is set to normalPower. + +Timeout (8 bits) + +The time in seconds the node should keep the Power level before resetting to normalPower level. It is fundamental, that the timeout IS implemented and followed by the application, for keeping the network consistent. Valid values are 1-255 resulting in timeouts from 1 second to 255 seconds. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 139 of 196 + +## 4.8.2 Powerlevel Get Command + +This command is used to request the current power level value. + +The Powerlevel Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS POWERLEVEL _ _ | | | | | | | | +| Command = POWERLEVEL GET _ | | | | | | | | + +## 4.8.3 Powerlevel Report Command + +This command is used to advertise the current power level. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS POWERLEVEL _ _ | | | | | | | | +| Command = POWERLEVEL REPORT _ | | | | | | | | +| Power level | | | | | | | | +| Timeout | | | | | | | | + +Power level (8 bits) + +This value is the current power level indicator value in effect on the node. + +[This field MUST be encoded according to Table 39.](04.08-powerlevel-command-class-version-1.md#481-powerlevel-set-command) + +If the returned value is normalPower, the timeout value is ignored. + +Timeout (8 bits) + +The time in seconds the node has back at Power level before resetting to normal Power level. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 140 of 196 + +## 4.8.4 Powerlevel Test Node Set Command + +This command is used to instruct the destination node to transmit a number of test frames to the specified NodeID with the RF power level specified. After the test frame transmissions the RF power level is reset to normal and the result (number of acknowledged test frames) is saved for subsequent read-back. The result of the test may be requested with a Powerlevel Test Node Get Command. + +[A receiving node SHOULD return an unsolicited Powerlevel Test Node Report Command when it](04.08-powerlevel-command-class-version-1.md#486-powerlevel-test-node-report-command) completed the Powerlevel test initiated by this command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS POWERLEVEL _ _ | | | | | | | | +| Command = POWERLEVEL TEST NODE SET _ _ _ | | | | | | | | +| Test NodeID | | | | | | | | +| Power level | | | | | | | | +| Test frame count (MSB) | | | | | | | | +| Test frame count (LSB) | | | | | | | | + +Test NodeID (8 bits) + +The test NodeID that should receive the test frames. + +A power level test will not work with a test NodeID which is either a sleeping or FLiRS node. A controller SHOULD NOT initiate a powerlevel test towards sleeping or FLiRS nodes. + +Power level (8 bits) + +The power level indicator value to use in the test frame transmission. + +[This field MUST be encoded according to Table 39.](04.08-powerlevel-command-class-version-1.md#481-powerlevel-set-command) + +Test frame count (16 bits) + +The Test frame count field contains the number of test frames to transmit to the Test NodeID. The first byte is the most significant byte. Valid Test frame count range is 1..65535. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 141 of 196 + +## 4.8.5 Powerlevel Test Node Get Command + +This command is used to request the result of the latest Powerlevel Test. + +The Powerlevel Test Node Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS POWERLEVEL _ _ | | | | | | | | +| Command = POWERLEVEL TEST NODE GET _ _ _ | | | | | | | | + +## 4.8.6 Powerlevel Test Node Report Command + +This command is used to report the latest result of a test frame transmission started by the Powerlevel Test Node Set Command. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS POWERLEVEL _ _ | | | | | | | | +| Command = POWERLEVEL TEST NODE REPORT _ _ _ | | | | | | | | +| Test NodeID | | | | | | | | +| Status of operation | | | | | | | | +| Test frame acknowledged count (MSB) | | | | | | | | +| Test frame acknowledged count (LSB) | | | | | | | | + +Test NodeID (8 bits) + +This field advertises the NodeID of the node, which is or has been under test. + +If a test has been performed, this field MUST reflect the NodeID used in the last test initiated with the Powerlevel Test Node Set Command. + +If no test has been performed, this field MUST be set to 0. In this case, the Status of operation and Test frame acknowledged count fields MAY be ignored. + +It is OPTIONAL to save the last Powerlevel test result in the NVM. If a node saves the last Powerlevel CC:0073.01.06.13.003 test result in the volatile memory, it MAY set this field to 0 after going to sleep or losing power. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 142 of 196 Status of operation (8 bits) + +This field indicates the result of the last test initiated with the Powerlevel Test Node Set Command. It [MUST be encoded according to Table 40..](04.08-powerlevel-command-class-version-1.md#486-powerlevel-test-node-report-command) + +Table 40, Powerlevel Test Node Report::Status of operation encoding + +| Value | Description | +| --- | --- | +| 0x00 | Test Failed No frame was returned during the test | +| 0x01 | Test Success At least 1 frame was returned during the test | +| 0x02 | Test in Progress The test is still ongoing | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be CC:0073.01.06.11.004 ignored by a receiving node. + +A controller MAY return ”Test Failed” for a non-existing NodeID without carrying the test. However, it MUST return ”Test in Progress” if carrying the test even if it knows that the test will fail. + +Test frame acknowledged count (16 bits) + +This field indicates the number of test frames transmitted, which the Test NodeID has acknowledged. The first byte is the most significant byte. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 143 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.09-zip-command-class-version-1-obsoleted.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.09-zip-command-class-version-1-obsoleted.md new file mode 100644 index 0000000..65b743f --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.09-zip-command-class-version-1-obsoleted.md @@ -0,0 +1,12 @@ + +# 4.9 Z/IP Command Class, Version 1 [OBSOLETED] + +THIS COMMAND CLASS VERSION HAS BEEN OBSOLETED + +New implementations MUST use the Z/IP Command Class Version 2. diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.10-zip-command-class-version-2.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.10-zip-command-class-version-2.md new file mode 100644 index 0000000..bb9e52f --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.10-zip-command-class-version-2.md @@ -0,0 +1,381 @@ + +# 4.10 Z/IP Command Class, Version 2 + +The Z/IP Command Class is a special Command Class intended for encapsulation of Z-Wave commands in IP packets. + +Z/IP Packets may be exchanged between IP hosts running over physical layers such as Ethernet or WiFi. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 144 of 196 + +## 4.10.1 Security considerations + +This Command Class is used to encapsulate Z-Wave Commands in an IP network. A Z/IP Gateway will forward some of the encapsulated Z-Wave commands into the Z-Wave Network. + +The Z-Wave nodes may use encryption to protect the integrity of the Z-Wave network (refer to Security 0 and Security 2 Command Classes). IP nodes should always assume to be in a hostile network and support an encryption mechanism, such as DTLS. + +If an IP node implements IP LAN security (DTLS or equivalent): + +Z/IP Packet received via secure IP channel MUST be accepted and a Z/IP Gateway MUST o forward the optional Z-Wave Command in the Z-Wave network. + + Z/IP Packet received via non-secure IP channel: + +Z/IP Discovery Command Class MUST be accepted. o All other encapsulated Command Classes MUST be discarded. o + +If an IP node does not implement IP LAN security (DTLS or equivalent): + + All Z/IP Packet received via non-secure IP channel MUST be accepted. + +If the Z/IP Command Class interface is used to communicate between applications within the same machine, the use of DTLS is OPTIONAL. + +If the Z/IP Command Class interface is used to communicate between applications across an IP network, the use of DTLS is REQUIRED. + +## 4.10.2 Interoperability considerations + +Any Z-Wave Command Class SHOULD be sent encapsulated in a Z/IP Packet if a transmission takes place in an IP network. + +Commands part of this Command Class MUST NOT be encapsulated in a Z/IP Packet Command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 145 of 196 + +## 4.10.3 Z/IP Packet Command + +   IP UDP:4123 Z/IP Packet Command Optional Z-Wave command IP  UDP:41230  DTLS  Z/IP Packet Command  Optional Z-Wave command + +A Z/IP Packet Command MUST be carried in a UDP packet, using destination port 4123 when no LAN security is used. + +A Z/IP Packet Command MUST be carried in a UDP packet, using destination port 41230 when DLTS is used. + +A node returning an answer to a Z/IP Packet (Ack/NAck Response) MUST swap the UDP source and destination ports. + +The Z/IP Packet may carry a Z-Wave command or it may be used to communicate positive or negative acknowledgement for the delivery of another Z/IP Packet. + +The Z/IP Packet MUST NOT be used for transmission between native Z-Wave nodes. The Z/IP Packet is intended for transport of encapsulated Z-Wave commands inside IP packets in an IP environment. + +For that reason, normal Z-Wave MAC layer frame size limitations do not apply to this command, however Z-Wave MAC Layer frame size and Z-Wave Transport Service Command Class size limitations apply to the Z-Wave Command field. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP (0x23) _ _ | | | | | | | | +| Command = COMMAND ZIP PACKET (0x02) _ _ | | | | | | | | +| Ack Request | Ack Response | NAck Response | (NAck flags) | | | Reserved | | +| | | | Waiting | Queue Full | Option Error | | | +| Header ext. included | Z-Wave Cmd Included | More Information | Secure Origin | Reserved | | | | +| Seq No | | | | | | | | +| Res | Source End Point | | | | | | | +| Bit address | Destination End Point | | | | | | | +| Header extension 1 (Optional) | | | | | | | | +| ... | | | | | | | | +| Header extension N (Optional) | | | | | | | | +| Z-Wave Command 1 (Optional) | | | | | | | | +| ... | | | | | | | | +| Z-Wave Command M (Optional) | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 146 of 196 A receiving node MUST inspect the header flags in order to determine the offset to use for accessing the optional fields. If the packet contains invalid data, e.g. the ACK_RES and NACK_RES bits are both set to 1 or if the length of the extended header does not add up, a receiving node MUST ignore the packet. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 147 of 196 Ack Request (1 bit) + +This flag signals that the receiving node MUST return an Ack or NAck message in response to the actual Z/IP Packet. + +[This field MUST be encoded according to Table 41.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +Table 41, Z/IP Packet::Ack Request Flag encoding + +| Value | Description | +| --- | --- | +| '1' | Return Ack or NAck | +| '0' | No confirmation needed | + +If this flag is set to 1, the Z/IP Packet MUST contain a Z-Wave Command. A receiving node MUST discard the packet if this flag is set to 1 but no Z-Wave Command is included. + +This field is intended for delivery acknowledgement for Z-Wave Commands encapsulated in Z/IP packets. Z-Wave link-level acknowledgement SHOULD always be used between Z-Wave nodes when Z-Wave is used as link layer. + +A Z/IP Gateway MUST return a ”NAck+Waiting” indication no later than 200ms after receiving an Ack Request if the Z-Wave Command is still being processed or pending delivery. A sending node that has requested an Ack and has waited for more than 300ms without receiving an Ack or NAck indication MAY conclude that the Z-Wave Command is lost and retransmit the Z/IP Packet. + +In case of successful delivery to a Z-Wave node, a Z/IP Packet with Ack Response indication MUST be returned by the Z/IP Gateway upon reception of the Z-Wave Ack. In case of successful delivery to a Z/IP node, the Z/IP node itself MUST return a Z/IP Packet with Ack Response indication. + +Ack Response (1 bit) + +This flag MUST be used to indicate that the destination has received the Z-Wave Command encapsulated in a preceding Z/IP packet. + +This field MUST NOT be interpreted as a confirmation that the destination has accepted the application command carried in the Z-Wave Command field. + +[This field MUST be encoded according to Table 42.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +Table 42, Z/IP Packet::Ack Response Flag encoding + +| Value | Description | +| --- | --- | +| '1' | This Z/IP Packet acknowledges a preceding packet that requested an Ack Response | +| '0' | This Z/IP Packet does not acknowledge a preceding packet that requested an Ack Response. A receiving node MUST inspect the NAck Response field | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 148 of 196 If this field is set to 1, the field value MUST be the same as the Z/IP packet being Seq No acknowledged. + +NAck Response (1 bit) + +This flag MUST be used to indicate that the destination has not (yet) received the Z-Wave Command encapsulated in a preceding Z/IP Packet. + +This field MAY be set to 1 by intermediate nodes such as a Z/IP Gateway. This field MUST be encoded [according to Table 43.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +Table 43, Z/IP Packet::NAck Response Flag encoding + +| Value | Desription | +| --- | --- | +| '1' | This Z/IP Packet negatively acknowledges a preceding packet that requested an Ack Response. (i.e. the Z-Wave Command was not delivered to the destination) A receiving node MUST inspect the NAck flags fields. | +| '0' | This field and the NAck flags fields may be ignored. | + +If this field is set to 1, the Seq No field value MUST be the same as the Z/IP packet being negatively acknowledged. + +If this field is set to 1 but none of the NAck flags field is set to 1, the Z-Wave Command was lost but no specific reason is provided. + +(NAck flags) Waiting (1 bit) + +This flag is a companion flag to the NAck Response flag. It SHOULD be inspected only if the NAck Response flag field is set to 1 and SHOULD be ignored otherwise. + +This flag MUST be ignored if the flag is set to 1. Queue Full + +This flag MUST be used to indicate that the destination may have a long response time. i.e. the Z-Wave [Command has not timed out yet and is pending delivery. This field MUST be encoded according to Table 44.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 149 of 196 Table 44, Z/IP Packet::Waiting Flag encoding + +| Value | Description | +| --- | --- | +| '1' | Waiting: the preceding Z/IP Packet encapsulated Z-Wave Command is not yet delivered to the destination and delivery will be attempted later on | +| '0' | Not waiting: the preceding Z/IP Packet encapsulated Z-Wave Command will not be delivered later on. | + +An ”Expected Delay” Option MAY be returned by a Z/IP Gateway, indicating how long it should take CC:0023.02.02.12.003 [before the final delivery acknowledgment status is known, refer to 4.12.3.1. A sending node SHOULD](04.12-zip-command-class-version-4.md#41231-expected-delay-option) use this information to provide better user responsiveness. A default value of 90 seconds MUST be used by the sending node if no ”Expected delay” Option is provided. + +A Z/IP ”NAck+Waiting” indication is returned for every packet that is queued up. If a sending node triggers to queue up three Z-Wave Commands, it will receive a ”NAck+Waiting” indication after each packet. It may be desirable to queue up three configuration commands if the intention is to perform a few configuration changes and allow a battery node to return to sleep. + +If a sending node wants to transfer larger amounts of data or commands, e.g. probing capabilities or CC:0023.02.02.12.004 downloading a new firmware image, it is RECOMMENDED to send a single Z/IP Packet using the More Information field to make the destination node stay awake. When a Z/IP Ack Response indication is returned to the sending node, it can start transferring packets at a higher rate. + +A Z/IP Gateway MUST return a ”NAck+Waiting” indication no later than 200ms after receiving an Ack Request indication if the Z-Wave Command is still pending delivery. + +If a message has been delayed for more than 60 seconds, an intermediate receiver, such as a Z/IP Gateway, MUST transmit a new ”NAck+Waiting” indication every 60 seconds to let the sending node know that it is still operational. + +A sending node waiting for more than 90 seconds after receiving a ”NAck+Waiting” indication MAY conclude that the Z-Wave Command is lost and retransmit a new Z/IP Packet. + +A Z/IP Gateway issuing a ”NAck+Waiting” indication MUST subsequently issue an Ack Response indication when the Z-Wave Command has been delivered. + +A Z/IP Gateway MUST return a Z/IP NAck Response indication if the Z-Wave Command delivery is aborted or not successful. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 150 of 196 (NAck flag) Queue Full (1 bit) + +This flag is a companion flag to the NAck Response flag. It SHOULD be inspected only if the NAck Response flag is set to 1 and SHOULD be ignored otherwise. + +This flag MUST be used by a Z/IP Gateway for packets targeting battery nodes, in a busy network, during bulk data transfers or route re-discovery. This flag MAY also be returned for always listening Z-Wave destinations. + +A sending node MUST wait for at least 10 seconds before re-transmitting a new Z/IP Packet. + +This flag MUST be returned by a Z/IP Gateway if there is no more room in the queue system used for [delivering Commands into the Z-Wave network. This field MUST be encoded according to Table 45.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +Table 45, Z/IP Packet::Queue Full Flag encoding + +| Value | Description | +| --- | --- | +| '1' | Queue is full: the preceding Z/IP Packet Command is discarded and will not be delivered to the destination | +| '0' | Queue OK | + +(NAck flag) Option Error (1 bit) + +This flag is a companion flag to the NAck Response flag. It should only be inspected if the NAck Response flag is set to 1 and SHOULD be ignored otherwise. + +This flag MUST be set to 1 if a critical option is not recognized by the receiving node and the entire Z/IP Packet was discarded. This flag MUST NOT be set to 1 if an elective option is not recognized by the receiving node. Elective options MUST be silently ignored by a receiving node. + +Table 46, Z/IP Packet::Option Error Flag encoding + +| Value | Description | +| --- | --- | +| '1' | Option Error: A critical extension was not understood and the entire Z/IP Packet was discarded | +| '0' | (no error) | + +A node setting this flag to 1 SHOULD include the offending Option in the ”NAck+OptionError” indication returned to the originating node. + +A node receiving a ”NAck+OptionError” indication MUST NOT process the Z/IP Packet Options in the Header Extension field as it is only included for debugging purposes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 151 of 196 Header extension Included (1 bit) + +This flag is used to indicate that a Header Extension field is included in the Z/IP Packet. Refer to the Header Extension field description below. + +[This flag MUST be encoded according to Table 47.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +Table 47, Z/IP Packet::Header Extension Included Flag encoding + +| Value | Description | +| --- | --- | +| '1' | Header Extension field MUST be included in the Z/IP Packet | +| '0' | Header Extension field MUST NOT be included in the Z/IP Packet | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Z-Wave Command Included (1 bit) + +This flag is used to indicate that a Z-Wave Command field is included in the Z/IP packet. Refer to the Z-Wave Command field description below. + +[This flag MUST be encoded according to Table 48.](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +Table 48, Z/IP Packet::Z-Wave Command Included Flag encoding + +| Value | Description | +| --- | --- | +| '1' | Z-Wave Command field MUST be included in the Z/IP Packet | +| '0' | Z-Wave Command field MUST NOT be included in the Z/IP Packet | + +If a Z/IP Packet is received with payload length = 0 and the ”Z-Wave command included” bit set to 1, a receiving node MUST treat the Z/IP Packet as if the ”Z-Wave command included” bit was set to 0. + +If receiving a Z/IP Command with the Ack Request field set to 1 and no Z-Wave Command included, a Z/IP Gateway MUST issue a NOP frame to the destination and return a Z/IP Packet with Ack Response if the destination acknowledged the NOP frames. + +More Information (1 bit) + +This flag is used to indicate the Z/IP Gateway that it should prevent a sleeping node from returning to sleep during the next minute. + +This flag MUST indicate that more Z/IP Packets with Z-Wave Commands will be subsequently transmitted. A sending node knowing that it will be sending more commands to the destination node MAY set this flag to 1. + +[This flag MUST be encoded according to Table 49](04.10-zip-command-class-version-2.md#4103-zip-packet-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 152 of 196 Table 49, Z/IP Packet::More Information Flag encoding + +| Value | Description | +| --- | --- | +| '1' | The Z/IP Gateway should keep the sleeping node awake | +| '0' | The Z/IP Gateway should put the sleeping node to sleep | + +Secure Origin (1 bit) + +This field indicates if the Z-Wave Command is to be treated securely. + +The value 1 MUST indicate that the Z-Wave Command MUST be treated securely (i.e. it was or will be sent using encryption in the Z-Wave network). + +The value 0 MUST indicate that the Z-Wave Command MUST NOT be treated securely. (i.e. it was or will be sent non-securely in the Z-Wave network) + +A Z/IP Gateway forwarding the contents of an encrypted Z-Wave frame MUST set the Secure Origin flag to ‘1’. A Z/IP Gateway forwarding the contents of a non-encrypted Z-Wave frame MUST set the Secure Origin flag to ‘0’. + +A Z/IP Gateway MUST inspect the Secure Origin flag when forwarding a Z-Wave Command contained in a Z/IP Packet from an IP network to a Z-Wave network. A Z/IP Gateway MUST NOT use secure communication via Z-Wave if this flag is set to ‘0’ and MUST use secure communication via Z-Wave if this flag is set to ‘1’. + +Seq No (8 bits) + +This field is used to identify Z/IP Packet duplicates or retransmissions. + +This field MUST carry a unique sequence number. Each sequence number MUST be generated from an 8-bit counter that is incremented by 1 whenever a new sequence number is generated. When a node powers up, the sequence counter MUST be initialized to a random value. The counter MAY be shared with other Command Classes. + +Retransmitted Z/IP packets MUST carry the same value as the original Z/IP Packet. A Z/IP Ack or NAck packet MUST carry the same Seq No value as the Z/IP packet being acknowledged. + +Multiple Z/IP Packets may be received in case of link-layer retransmissions. Z/IP Packet duplicates MUST be ignored by a receiving node. + +Source End Point (7 bits) + +This field is used to indicate the originating end point from which the Z-Wave Command was sent. This field MUST be in the range 0..127. + +The Source End Point value 0 represents the Root Device. Refer to the Multi Channel Command Class for more details. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 153 of 196 Bit address (1 bit) + +This field is used to advertise if the destination End Point field is specified as a bit mask. + +The value 0 MUST indicate that the Destination End Point field is specified as a single End Point. + +The value 1 MUST indicate that the Destination End Point field is specified as a bit mask. Only destination end points 1..7 are bit addressable. + +Bit addressing MUST NOT be used if the encapsulated command is a request (requiring a reply from the destination). + +Destination End Point (7 bits) + +This field is used to indicate the destination End Point of the actual Z-Wave Command. + +If the Bit address field is set to 0, this field MUST carry a single End Point identifier value in the range 0..127. + +The value 0 MUST represent the Root Device. Values in the range 1..127 MUST represent an actual End Point. + +If the Bit address field is set to 1, this field MUST use the following encoding: + + Bit 0 in the Destination End Point indicates if End Point 1 is a destination  Bit 1 in the Destination End Point indicates if End Point 2 is a destination  … + +The bit value 0 MUST be used to advertise that the corresponding End Point is not a destination. The bit value 1 MUST be used to advertise that the corresponding End Point is a destination. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 154 of 196 Header Extension (variable) + +This field is used for advertising additional Z/IP Packet Options that are necessary in certain cases. A Z/IP node MUST support and parse this field. + +This field MUST be omitted if the Header extension Included field is set to 0. + +If the Header Extension Included field is set to 1, this field MUST be formatted as follows: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Header Extension Length | | | | | | | | +| Z/IP Packet Option 1, 1 | | | | | | | | +| … | | | | | | | | +| Z/IP Packet Option P, 1 | | | | | | | | +| … | | | | | | | | +| Z/IP Packet Option 1, N | | | | | | | | +| … | | | | | | | | +| Z/IP Packet Option P, N | | | | | | | | + +Header Extension Length (1 byte) + +This field MUST indicate the combined length in bytes of the Z/IP Header Extension Length and all the Z/IP Packet Options included in the Z/IP Header Extension. + +This field MUST be in the range 1..255. The length of the Header Extension field cannot exceed 255 bytes. + +Z/IP Packet Option (variable) + +Each Z/IP Packet Option MUST be treated parsed as a block using the following format: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Critical | Option Type | | | | | | | +| Option Length | | | | | | | | +| Option Data 1 (Optional) | | | | | | | | +| ... | | | | | | | | +| Option Data L (Optional) | | | | | | | | + +A receiving node MUST accept receiving supported options in any order. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 155 of 196 (Z/IP Packet Option) Critical (1 bit) + +This field is used to indicate if the whole Z/IP Packet Command must be ignored if the option is not recognized by the receiving node. + +The value 0 MUST indicate that the option is elective and a receiving node MUST ignore this option only and continue processing the frame if the option is not recognized. + +The value 1 MUST indicate that the option is critical and a receiving node MUST discard the entire Z/IP Packet Command and return a Z/IP Packet Command with the Option Error flag set to 1 if the option is not recognized. + +An option MUST be considered as recognized even if: + +The Option Length field is set to a greater value than expected - Reserved fields in the Option Data field are not set to 0. - + +An option MUST NOT be considered as recognized when: + +- The Option Type field is set to an unknown value. A field value in the Option Data field value which is out of expected range or seems to be using - reserved values. + +(Z/IP Packet Option) Option Type (7 bits) + +This field is used to indicate which format to use for parsing the corresponding Option Data field. The [list of defined Option Type is specified in 4.12.3](04.12-zip-command-class-version-4.md#4123-list-of-defined-zip-packet-options) + +A receiving node MUST accept supported Z/IP Packet Options in any order. + +(Z/IP Packet Option) Option Length (8 bits) + +This field MUST indicate the length of the corresponding Option Data field in bytes. + +(Z/IP Packet Option) Option Data (L bytes) + +This field is used to carry the actual Option data. It MUST be parsed and interpreted using the corresponding Option Type field value. + +The size of this field in bytes MUST be according the corresponding Option Length field. This field MUST be omitted if the corresponding Option Length field is set to 0. + +Z-Wave Command (M bytes) + +This field carries a complete Z-Wave command. This field MUST be formatted according to the [corresponding command class as defined in [15], [16], [17] and in this specification.](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +A sending Z/IP client SHOULD be aware that this command will be transmitted over a Z-Wave network and therefore respect the Z-Wave Command length limitations. A Z/IP Client SHOULD limit the length of this field to 45 bytes for non-S2 destination nodes and 117 bytes for S2 supporting nodes. + +This field MUST be omitted if the Z-Wave Cmd Included field is set to 0. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 156 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.11-zip-command-class-version-3.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.11-zip-command-class-version-3.md new file mode 100644 index 0000000..a9ea5d3 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.11-zip-command-class-version-3.md @@ -0,0 +1,34 @@ + +# 4.11 Z/IP Command Class, version 3 + +The Z/IP Packet Command Class, version 3 adds the support of the Encapsulation Format Info Option to the Z/IP Packet Option types. + +## 4.11.1 Compatibility considerations + +Z/IP Packet Command Class, version 3 is backwards compatible with the Z/IP Packet Command Class, version 2. + +A device supporting Z/IP Packet Command Class, version 3 MUST support Z/IP Packet Command Class, version 2. + +All fields and commands not described in this version MUST remain unchanged from version 2. + +[A node supporting the Z/IP Packet Command Class, version 3 MUST support the Encapsulation Format Information Option and respect the requirements specified in 4.12.3.4 Encapsulation Format Information Option.](04.12-zip-command-class-version-4.md#41234-encapsulation-format-information-option) + +## 4.11.2 Z/IP Packet Command + +The frame structure MUST remain unchanged from version 2. + +Secure Origin (1 bit) + +[This field is superseded by the Encapsulation Format Information Option.](04.12-zip-command-class-version-4.md#41234-encapsulation-format-information-option) + +A version 3 sending node MUST use the Encapsulation Format Information Option with a version 3 receiving node. + +This field MUST be ignored by a receiving node if an Encapsulation Formation Information Z/IP Option is included in the Z/IP Packet. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 157 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.12-zip-command-class-version-4.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.12-zip-command-class-version-4.md new file mode 100644 index 0000000..e57719a --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.12-zip-command-class-version-4.md @@ -0,0 +1,456 @@ + +# 4.12 Z/IP Command Class, version 4 + +The Z/IP Packet Command Class, version 4 adds the support of a Keep Alive command in order to prevent the closure of a Z/IP DTLS session and introduces new Z/IP Packet Options. + +## 4.12.1 Compatibility considerations + +Z/IP Packet Command Class, version 4 is backwards compatible with the Z/IP Packet Command Class, version 3. + +A device supporting Z/IP Packet Command Class, version 4 MUST support Z/IP Packet Command Class, version 3. + +All fields and commands not described in this version MUST remain unchanged from version 3. + +A node supporting the Z/IP Packet Command Class, version 4 MUST respect the requirements specified [in 4.12.3.5 Z-Wave Multicast Addressing Option.](04.12-zip-command-class-version-4.md#41235-z-wave-multicast-addressing-option) + +[The Z/IP Keep Alive Command is introduced in this version in order to prevent a DTLS session to time](04.12-zip-command-class-version-4.md#4122-zip-keep-alive-command) out between a Z/IP Client and server. The default DTLS timeout configured in Z/IP deployments is 60 seconds, i.e. a peer will close the DTLS connection if no command is sent or received in 60 seconds. + +The Installation and Maintenance Report Option is extended with new TLVs and a new option is added to indicate a receiving client the addressing method that has been used on the Z-Wave network. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 158 of 196 + +## 4.12.2 Z/IP Keep Alive Command + +This command is used to as a Keep Alive probe for a DTLS session between two IP nodes. + +This command SHOULD be issued at a minimum interval of 25 seconds and at a maximum interval of 55 seconds after the last sent or received command in order to prevent session closure. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP (0x23) _ _ | | | | | | | | +| Command = COMMAND ZIP KEEP ALIVE (0x03) _ _ _ | | | | | | | | +| Ack Request | Ack Response | Reserved | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Ack Request (1 bit) + +This field is used by a sending node to request an acknowledgement for this command from a receiving node. + +The value 1 MUST indicate that an acknowledgement is requested. The value 0 MUST indicate that an acknowledgement is not requested. + +If this flag is set to 1, a receiving node MUST return a Z/IP Keep Alive Command with the Ack Response flag set to 1. + +This field MUST NOT be set to 1 if the Ack Response field is set to 1. + +Ack Response (1 bit) + +This field is used by a node to acknowledge that it received a Z/IP Keep Alive Command with the Ack Request flag set to 1. + +The value 1 MUST indicate that this command is an acknowledgement for a received Z/IP Keep Alive Command. The value 0 MUST indicate that this command is not an acknowledgement + +This field MUST NOT be set to 1 if the Ack Request field is set to 1. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 159 of 196 + +## 4.12.3 List of defined Z/IP Packet Options + +[The list of defined Z/IP Packet Option Types is listed in Table 50 and each type is defined in the](04.12-zip-command-class-version-4.md#4123-list-of-defined-zip-packet-options) following subsections. + +[A sending node using a given option MUST support as a minimum the version indicated in Table 50 for](04.12-zip-command-class-version-4.md#4123-list-of-defined-zip-packet-options) the Z/IP Command Class. + +Table 50, Z/IP Packet Option types + +| Option Type | Type value | Class | Version | +| --- | --- | --- | --- | +| Expected delay | 1 | Elective | 2 | +| Installation and Maintenance Get | 2 | Elective | 2 | +| Installation and Maintenance Report | 3 | Elective | 2 | +| Encapsulation Format Information | 4 | Critical | 3 | +| Z-Wave Multicast Addressing | 5 | Elective | 4 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be CC:0023.00.02.11.002 ignored by a receiving node. + +A receiving node MUST accept supported options in any order. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 160 of 196 + +### 4.12.3.1 Expected Delay Option + +This option is used to advertise an expected delay when issuing a Z/IP Packet command with ”NAck+Waiting” indication. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Critical = 0 | Option Type = ZIP OPTION EXPECTED DELAY = 1 _ _ _ | | | | | | | +| Option Length = 3 | | | | | | | | +| Seconds 1 (MSB) | | | | | | | | +| Seconds 2 | | | | | | | | +| Seconds 3 (LSB) | | | | | | | | + +Critical (1 bit) + +The Critical field MUST be set to 0. + +Option Type (7 bits) + +The Option Type field MUST be set to 0x01 to indicate the Expected Delay Option. + +Option Length (8 bits) + +The Option Length field MUST indicate the length of the Seconds field. + +Seconds (24 bits) + +The Seconds field MUST indicate the expected time in seconds before issuing a new Z/IP Packet Command with a new status. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 161 of 196 + +### 4.12.3.2 Installation and Maintenance Get Option + +This option is used to request a receiving node to return a Z/IP Packet Command containing the Installation and maintenance Report Option. + +In order to trigger an Installation and Maintenance Report to be returned, a sending node MUST: + + Add this Option in the Z/IP Packet Command  Add a Z-Wave Command in the Z/IP Packet Command (NOP Command Class MAY be used if the sending node does not have any other Z-Wave Command to transmit)  Set the Ack Request flag to 1 in the Z/IP Packet Command + +A receiving node MUST: + + Return a Z/IP Packet Command containing the Installation and Maintenance Report Z/IP Option after the transmission of the contained Z-Wave Command to the destination.  If returned, the Installation and Maintenance Report Z/IP Option MUST advertise the statistics associated to the Z-Wave Command transmission. + +A receiving MAY ignore the request for an Installation and Maintenance Report if it does not support this Option. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Critical = 0 | Option Type = INSTALLATION MAINTENANCE GET = 2 _ _ | | | | | | | +| Option Length = 0 | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 162 of 196 + +### 4.12.3.3 Installation and Maintenance Report Option + +This option is used to advertise Z-Wave transmission data about the communication between the Z/IP Gateway and a Z-Wave device in the network. + +The Installation and Maintenance Report Option is used for data relating to the transmission of an actual frame. Statistical data may be accessed via the Network Management Installation and Maintenance Command Class. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Critical = 0 | Option Type = INSTALLATION MAINTENANCE REPORT = 3 _ _ | | | | | | | +| Option Length | | | | | | | | +| IME – Type 1 | | | | | | | | +| IME – Length 1 | | | | | | | | +| IME - Value 1, 1 | | | | | | | | +| ... | | | | | | | | +| IME - Value L, 1 | | | | | | | | +| … | | | | | | | | +| IME – Type N | | | | | | | | +| IME – Length N | | | | | | | | +| IME - Value 1, N | | | | | | | | +| ... | | | | | | | | +| IME - Value L, N | | | | | | | | + +Critical (1 bit) + +The Critical field MUST be set to 0. + +Option Length (1 byte) + +This field MUST indicate the combined length (in bytes) of the following IME-TLV fields. + +IME – Type / Length / Value (TLV) (variable) + +This field is used to carry values advertising Z-Wave transmission statistics. Each TLV block MUST be [encoded according to one of the Types defined in Table 51 and in the following subsections.](04.12-zip-command-class-version-4.md#41233-installation-and-maintenance-report-option) + +[A sending node using a given TLV MUST support as a minimum the version indicated in Table 51 for the](04.12-zip-command-class-version-4.md#41233-installation-and-maintenance-report-option) Z/IP Command Class. + +The Z/IP Gateway MAY send any combination of the IME TLVs when using this Z/IP Packet Option. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 163 of 196 Table 51, Z/IP Packet::IME-Type/Length/Value encoding + +| IME – Type | Name | IME – Length | Version | +| --- | --- | --- | --- | +| 0x00 | Route Changed | 1 byte | 2 | +| 0x01 | Transmission Time (TT) | 2 bytes | 2 | +| 0x02 | Last Working Route (LWR) | 5 bytes | 2 | +| 0x03 | RSSI | 5 bytes | 4 | +| 0x04 | ACK channel | 1 byte | 4 | +| 0x05 | Transmit channel | 1 byte | 4 | +| 0x06 | Routing scheme | 1 byte | 4 | +| 0x07 | Routing attempts | 1 byte | 4 | +| 0x08 | Last failed link | 2 bytes | 4 | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +4.12.3.3.1 Route Changed (3 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x00 | | | | | | | | +| IME – Length = 1 | | | | | | | | +| IME – Value = Route Changed | | | | | | | | + +Route Changed (8 bits) + +This field is used to indicate if the last working route was changed for the current transmission. + +If the last working route was changed, this field MUST be set to 0x01. If the last working route was not changed, this field MUST be set to 0x00. + +4.12.3.3.2 Transmission Time (4 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x01 | | | | | | | | +| IME – Length = 2 | | | | | | | | +| IME – Value = Transmission Time 1 (MSB) | | | | | | | | +| IME – Value = Transmission Time 2 (LSB) | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 164 of 196 Transmission Time (16 bits) + +This field is used to indicate the time it took to send the command until the reception of an Ack. The value MUST be encoded using unsigned representation and MUST be specified using the ms (milliseconds) unit. + +4.12.3.3.3 Last Working Route (7 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x02 | | | | | | | | +| IME – Length = 5 | | | | | | | | +| IME – Value = Repeater 1 | | | | | | | | +| IME – Value = Repeater 2 | | | | | | | | +| IME – Value = Repeater 3 | | | | | | | | +| IME – Value = Repeater 4 | | | | | | | | +| IME – Value = Speed | | | | | | | | + +This TLV is used to advertise the last used Working Route. If multiple Last Working Routes exist, this MUST be the one used to transmit the frame. + +Repeater 1-4 (4 bytes) + +This field contains the NodeID of the repeaters used for the last working route. + +The value 0 MUST indicate that the actual repeater was not used. Values in the range 1..232 MUST indicate an actual NodeID used as repeater. + +The first Repeater byte set to 0 MUST indicate that no more repeaters were used for the transmission. If the first Repeater byte is set to 0, it means that the Last Working Route (LWR) is a direct transmission. + +Speed (8 bits) + +This field is used to advertise the transmission speed used to reach the destination node. This field [MUST be encoded according to Table 52.](04.12-zip-command-class-version-4.md#41233-installation-and-maintenance-report-option) + +Table 52, IME Speed Encoding + +| Value | Speed | +| --- | --- | +| 0x01 | 9.6 kbit/sec | +| 0x02 | 40 kbit/sec | +| 0x03 | 100 kbit/sec | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 165 of 196 4.12.3.3.4 RSSI (7 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x03 | | | | | | | | +| IME – Length = 5 | | | | | | | | +| IME – Value = RSSI hop 1 | | | | | | | | +| IME – Value = RSSI hop 2 | | | | | | | | +| IME – Value = RSSI hop 3 | | | | | | | | +| IME – Value = RSSI hop 4 | | | | | | | | +| IME – Value = RSSI hop 5 | | | | | | | | + +The IME - Values advertise the RSSI value measured in the incoming direction (back towards the source of the message). + +RSSI Hop (5 bytes) + +The RSSI values MUST be encoded as using signed representation in the dBm unit and according to [Table 53.](04.12-zip-command-class-version-4.md#41233-installation-and-maintenance-report-option) + +Table 53, RSSI encoding + +| Value (signed) | Description | +| --- | --- | +| 0x7F (127) | RSSI NOT AVAILABLE. _ _ This value is returned for unused hops or if no RSSI measurement is available. | +| 0x7E (126) | RSSI MAX POWER SATURATED _ _ _ This value is returned if the measured RSSI is above the maximum power. | +| 0x7D (125) | RSSI BELOW SENSITIVITY. _ _ This value is returned if the measured RSSI is below the receiver’s sensitivity. | +| … | Reserved | +| 0xE0 (-32) | -32 dBm | +| 0xDF (-33) | -33 dBm | +| … | … | +| 0xA2 (-94) | -94 dBm | +| 0xA1 (-95) | Reserved | +| … | Reserved | +| 0x80 (-128) | Reserved | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 166 of 196 4.12.3.3.5 ACK channel (3 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x04 | | | | | | | | +| IME – Length = 1 | | | | | | | | +| IME – Value = ACK channel | | | | | | | | + +ACK channel (8 bits) + +This value reports the RF channel on which the ACK for this frame was received. + +4.12.3.3.6 Transmit channel (3 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x05 | | | | | | | | +| IME – Length = 1 | | | | | | | | +| IME – Value = Transmit channel | | | | | | | | + +Transmit channel (8 bits) + +This value reports the RF channel on which the Z-Wave Command was transmitted. + +4.12.3.3.7 Routing scheme (3 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x06 | | | | | | | | +| IME – Length = 1 | | | | | | | | +| IME – Value = Routing scheme | | | | | | | | + +Routing scheme (8 bits) + +This value reports the routing scheme that was used to find the successful route for delivering the Z-Wave Command. [The Routing scheme value MUST encoded according to Table 54](04.12-zip-command-class-version-4.md#41233-installation-and-maintenance-report-option) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 167 of 196 Table 54, Routing Scheme IME::Routing Scheme encoding + +| Value | Description | +| --- | --- | +| 0x00 | Idle | +| 0x01 | Direct transmission (no routing) | +| 0x02 | Application static route | +| 0x03 | Last working route | +| 0x04 | Next to last working route | +| 0x05 | Return route or controller auto route | +| 0x06 | Direct resort | +| 0x07 | Explorer frame | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +4.12.3.3.8 Routing attempts (3 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x07 | | | | | | | | +| IME – Length = 1 | | | | | | | | +| IME – Value = Routing attempts | | | | | | | | + +Routing attempts (8 bits) + +This TLV reports the number of routing attempts that were performed before successfully delivering the Z-Wave Command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 168 of 196 4.12.3.3.9 Failed link (4 bytes) + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| IME - Type = 0x08 | | | | | | | | +| IME – Length = 2 | | | | | | | | +| IME – Value = Failed Link Neighbor NodeID 1 | | | | | | | | +| IME – Value = Failed Link Neighbor NodeID 2 | | | | | | | | + +Failed Link Neighbor NodeID (16 bits) + +This TLV is used if the transmission of the Z-Wave Command failed. The value reports the neighbor NodeIDs of the failing link in the last attempted route. + +If the last node failed, Failed Link Neighbor NodeID 2 SHOULD be set to 0x00. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 169 of 196 + +### 4.12.3.4 Encapsulation Format Information Option + +The Encapsulation Format Information Option is used to carry information about the Z-Wave encapsulations that were or must be used to communicate between the Z-Wave node and the sending host (e.g. a Z/IP Gateway). + +The purpose of this Option is to preserve the encapsulation between a Z-Wave node and a host (e.g. Z/IP Gateway). + +A Z/IP Gateway MUST use the encapsulation indicated in the Encapsulation Format Information Option when transmitting Z/IP Commands over in a Z-Wave Network. + +A Z/IP Gateway receiving a Z-Wave Command that must be forwarded over an IP network MUST indicate in the Encapsulation Format Information Option what the Z-Wave encapsulation was. + +If a Z/IP client receives this Option and the Z-Wave Command requires to return a response, the Z/IP client MUST apply the encapsulation indicated by the Option when sending a reply. + +A Z/IP client MAY use this Option to dictate the encapsulation format when sending unsolicited messages. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Critical = 1 | Option Type = ENCAPSULATION FORMAT INFO = 4 _ _ | | | | | | | +| Option Length = 2 | | | | | | | | +| Security 2 Security Class | | | | | | | | +| Reserved | | | | | | | CRC16 | + +Critical (1 bit) + +This field indicates that the whole frame MUST be discarded if the extension is not supported. This field MUST be set to 1 when using the Encapsulation Format Info Option. + +Option Type (7 bits) + +The Type field MUST be set to 4 for the Encapsulation Format Information Option. + +Option Length (8 bits) + +The Option Length field MUST indicate the length of the Option Data fields, which is currently defined as 2 bytes long. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 170 of 196 Security 2 Security Class (1 byte) + +This Security 2 Security Class field indicates which Security 2 Security Class MUST be used for communication with the target node. + +A receiving node MUST replace previous information about a node’s secure capabilities with the information contained in this field and attempt subsequent communication with the target node using the highest security key contained in this command. + +[This field MUST be encoded as a bit field and according to Table 55.](04.12-zip-command-class-version-4.md#41234-encapsulation-format-information-option) + +Table 55, Security 2 Security Class field encoding + +| Bit set to 1 | Security 2 – Security Class | +| --- | --- | +| None | NON SECURE _ | +| 0 | S2 UNAUTHENTICATED _ | +| 1 | S2 AUTHENTICATED _ | +| 2 | S2 ACCESS CONTROL _ _ | +| 7 | S0 | + +CRC16 (1 bit) + +The CRC16 field indicates whether communication with the target node use CRC16 encapsulation or not. + +The value 1 MUST indicate that CRC16 encapsulation is used and MUST be used for subsequent communication with the Z-Wave node. + +The value 0 MUST indicate that CRC16 encapsulation is not used and MUST NOT be used for subsequent communication with the Z-Wave node. + +The CRC16 field MUST NOT be set to 1 if the Security 2 Security Class field is different than ”NON_SECURE” + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 171 of 196 + +### 4.12.3.5 Z-Wave Multicast Addressing Option + +This option is used to advertise if Multicast Addressing has been used by the sending node in the Z-Wave network. + +A Z/IP Client SHOULD NOT use this option when sending a Z/IP Packet Command. CC:0023.00.02.12.002 + +A Z/IP Gateway supporting Z/IP Command version 4 or newer MUST use this option in a Z/IP Packet Command if forwarding a command that has been received using Multicast addressing from a Z-Wave node. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Critical = 0 | Option Type = ZWAVE MULTICAST ADDRESSING = 5 _ _ | | | | | | | +| Option Length = 0 | | | | | | | | + +Critical (1 bit) + +The Critical field MUST be set to 0. + +Option Type (7 bits) + +The Option Type field MUST be set to 0x05 to indicate the Z-Wave Multicast Addressing Option. + +Option Length (8 bits) + +The Option Length field MUST indicate the length of the Option Data field. No Option Data is currently defined for this option; this field MUST be set to 0 and the Option Data field MUST be omitted. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 172 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.13-zip-6lowpan-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.13-zip-6lowpan-command-class-version-1.md new file mode 100644 index 0000000..1bb2122 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.13-zip-6lowpan-command-class-version-1.md @@ -0,0 +1,14 @@ + +# 4.13 Z/IP 6LoWPAN Command Class, version 1 + +The Z/IP 6LoWPAN Command Class supports the transmission of IPv6 Packets over Z-Wave networks. + +[The Z/IP 6LoWPAN Command Class, version 1 is defined by [18].](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 173 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.14-zip-gateway-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.14-zip-gateway-command-class-version-1.md new file mode 100644 index 0000000..cf71e53 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.14-zip-gateway-command-class-version-1.md @@ -0,0 +1,363 @@ + +# 4.14 Z/IP Gateway Command Class, version 1 + +The Z/IP gateway Command Class is used for configuration and management of a Z/IP gateway, e.g. to enable portal communication. + +## 4.14.1 Interoperability considerations + +The Z/IP Gateway Command Class is intended for use together with the Z/IP Portal Command Class to provide a streamlined workflow for preparing and performing installation of Z/IP Gateways in consumer [premises. Section 4.16.1.1 presents the concepts of tunnel creation, maintenance and bootstrapping of](04.16-zip-portal-command-class-version-1.md#41611-on-the-use-of-zip-gateway-and-zip-portal-command-classes) a Z/IP Gateway. + +A Z/IP Gateway may operate in a standalone environment where it is only accessed locally or it may create a tunnel to a portal provider to allow remote access. + +Commands defined in this Command Class MUST be encapsulated in Z/IP Packets. + +## 4.14.2 Gateway Mode Set Command + +Any host may send the Gateway Mode Set command during initial configuration of the gateway. Most likely, a service provider or an OEM will use the command in a central facility when preparing deployment at customer premises. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = GATEWAY MODE SET _ _ | | | | | | | | +| Mode | | | | | | | | + +Mode (1 byte) + +This field sets the communication mode of the Z/IP Gateway + +Table 56, Gateway Mode Set::Mode encoding + +| Value | Mode | +| --- | --- | +| 0x01 | Stand-alone (default) | +| 0x02 | Portal | + +If Mode is set to ”Stand-alone”, the Z/IP Gateway MUST NOT do any attempts to create secure tunnels to other peers in the LAN or in the Internet. The default mode SHOULD be ”Stand-alone”. By default, peer profiles SHOULD NOT be defined. + +A Mode value set to ”Portal” MUST be ignored if the actual gateway does not support the Z/IP Portal Command Class, If Mode is set to ”Portal”, the Z/IP Gateway MUST use the peer profile defined with + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 174 of 196 the Gateway Peer Set command to create a secure connection to the portal server. Once the Z/IP Gateway has been configured for portal connection creation, the Z/IP Gateway SHOULD [be locked for unauthorized access by issuing a Gateway Lock Set; refer to 4.14.8.](04.14-zip-gateway-command-class-version-1.md#4148-gateway-lock-set-command) + +## 4.14.3 Gateway Mode Get Command + +The Gateway Mode Get command is used to request the current Z/IP Gateway operational mode. + +The Gateway Mode Report Command MUST be returned in response to this command except if the Z/IP Gateway is locked with the Gateway Lock Set command and the Hide parameter of the Gateway Lock Set command was enabled. In that case, the Gateway Mode Get command MUST be silently ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = GATEWAY MODE GET _ _ | | | | | | | | + +## 4.14.4 Gateway Mode Report Command + +This command is used to advertise the mode. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = GATEWAY MODE REPORT _ _ | | | | | | | | +| Mode | | | | | | | | + +Mode (1 byte) + +This field indicates the communication mode of the Z/IP Gateway. + +[Refer to 4.14.2 and Table 56 for details.](04.14-zip-gateway-command-class-version-1.md#4142-gateway-mode-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 175 of 196 + +## 4.14.5 Gateway Peer Set Command + +The Peer Set Command is used to define one or more peers to which the Z/IP Gateway connects. The peer may be a portal server or one or more Z/IP Gateways. + +A Peer Set command MUST always carry the peer identity as an IPv6 address and an IP port number. The command SHOULD also specify the symbolic peer name as a FQDN. + +If the Gateway Mode is set to ”Portal”, there MUST NOT be defined more than one Peer profile. If the Gateway Mode is set to ”Stand-alone”, there MUST NOT be defined any peer profiles. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = GATEWAY PEER SET _ _ | | | | | | | | +| Peer Profile | | | | | | | | +| IPv6 Address 1 | | | | | | | | +| .. | | | | | | | | +| IPv6 Address 16 | | | | | | | | +| Port 1 | | | | | | | | +| Port 2 | | | | | | | | +| Reserved | | Peer Name Length | | | | | | +| Peer Name 1 (UTF-8) (Optional) | | | | | | | | +| ... . (Optional) | | | | | | | | +| Peer Name N (UTF-8) (Optional) | | | | | | | | + +Peer Profile (8 bits) + +This field identifies the actual peer profile. + +The value 0 (zero) is reserved for future use. The first peer profile MUST be number 1. + +IPv6 Address + +Full IPv6 address with no compression. The address SHOULD be in the ULA IPv6 prefix or in a globally routable IPv6 prefix. The address MAY be an IPv4-mapped IPv6 address. The field MUST NOT carry a link-local IPv6 address. + +The IPv6 address MAY be specified as ::/128 (all zeros), i.e. the unspecified address. If setting the IPv6 address field to the unspecified IPv6 address, the Peer Name field MUST be set to a DNS-resolvable FQDN. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 176 of 196 Port (16 bits) + +This field MUST carry the port number that the peer is listening on. The peer SHOULD use port number [44123 [21].](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Peer Name Length (6 bits) + +May be any value from 0 to 63. The value indicates the number of Peer Name bytes following this field. The number of readable characters may be less since some UTF-8 characters are represented by two or more bytes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 177 of 196 Peer Name (N bytes) (optional) + +This field is only present if the Peer Name Length field has a value greater than zero. + +The Peer Name field MUST be formatted as a UTF-8 based FQDN string such as ”example.com”. + +Only if that fails, the Z/IP Gateway SHOULD try connecting to the peer using the Peer Name and the Port. + +A Z/IP Gateway SHOULD try connecting to the peer using the IPv6 address and the Port. + +## 4.14.6 Gateway Peer Get Command + +The Gateway Peer Get Command is used to request active peer profiles. + +The Gateway Peer Report Command MUST be returned in response to this command except if the Z/IP Gateway is locked with the Gateway Lock Set command and the Hide parameter of the Gateway Lock Set command was enabled. In that case, the Gateway Peer Get command MUST be silently ignored. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = GATEWAY PEER GET _ _ | | | | | | | | +| Peer Profile | | | | | | | | + +Peer Profile (8 bits) + +This field identifies the actual peer profile. + +A requesting host SHOULD start specifying the Peer Profile value 1 (one). This will cause the Z/IP Gateway to indicate the number of actual peers in the returned Gateway Peer Report command. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 178 of 196 + +## 4.14.7 Gateway Peer Report Command + +The Gateway Peer Report Command is used to report details of a peer profile. + +A Gateway Peer Report command MUST always carry the peer address as an IPv6 address and MUST include the peer resource name if it was previously specified. + +| 7 | 6 | | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | | +| Command = GATEWAY PEER REPORT _ _ | | | | | | | | | +| Peer Profile | | | | | | | | | +| Peer Count | | | | | | | | | +| IPv6 Address 1 | | | | | | | | | +| .. | | | | | | | | | +| IPv6 Address 16 | | | | | | | | | +| Port 1 | | | | | | | | | +| Port 2 | | | | | | | | | +| Reserved | | Peer Name Length | | | | | | | +| Peer Name 1 (UTF-8) (Optional) | | | | | | | | | +| .. . (Optional) | | | | | | | | | +| Peer Name N (UTF-8) (Optional) | | | | | | | | | + +Peer Profile + +This identifier is used to identify the actual peer profile. + +The value 0 (zero) is reserved for future use. + +Peer Count (8 bits) + +This field indicates the number of peer profiles currently defined. If the Peer Count field has the value 0, all other fields of the Gateway Peer Report MUST be 0. + +IPv6 Address + +This field MUST carry a full IPv6 address with no compression. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 179 of 196 Port (16 bits) + +This field MUST carry the port number that the peer is listening on. The peer SHOULD use port number [44123 [21].](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Peer Name Length (6 bits) + +May be any value from 0 to 63. The value indicates the number of Peer Name bytes following this field. The number of readable characters may be less since some UTF-8 characters are represented by two or more bytes. + +Peer Name (N bytes) (optional) + +This field is only present if the Peer Name Length field has a value greater than zero. + +The Peer Name field MUST be formatted as a UTF-8 based FQDN string such as ”example.com”. + +If the Peer Count value is zero, the Resource Name string MUST be unspecified (zero-length). + +## 4.14.8 Gateway Lock Set Command + +The Lock Set command MUST lock down access to configuration parameters in the Gateway relating Z/IP to secure connections and portal login. Once the Z/IP Gateway has been locked, it MUST NOT be possible to unlock the device. Two exceptions apply: + + A factory default reset MUST unlock the Z/IP Gateway and revert settings to default.  An unlock command received via an authenticated secure connection to the portal MUST unlock the Z/IP Gateway. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = GATEWAY LOCK SET _ _ | | | | | | | | +| Reserved | | | | | | Show | Lock | + +Lock (1 bit) + +This field controls if Z/IP Gateway configuration parameters may be changed by the customer. + +The value 0 MUST indicate that the parameters are unlocked and can be changed by the customer. The value 1 MUST indicate that the parameters are locked and cannot be changed by the customer.The Z/IP gateway MUST accept to receive the Lock=1 flag from any connection. The Z/IP gateway MUST NOT accept to receive the Lock=0 flag from any connection; except for an authenticated secure connection to the portal. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 180 of 196 To prevent users and trojan viruses from creating tunnels to rogue portals, the Z/IP Gateway SHOULD automatically lock access to secure tunnel configuration parameters 24 hours after a factory default reset. + +Show (1 byte) + +This field controls if Z/IP Gateway configuration parameters may be read by the customer after the Z/IP Gateway has been locked. + +The value 0 MUST indicate that parameters are not available to the customer. The value 1 MUST indicate that parameters are available to the customer. + +If the Show parameter is ‘0’ the Z/IP Gateway MUST NOT respond to any queries for Z/IP Gateway parameters. + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +## 4.14.9 Unsolicited Destination Set Command + +The Unsolicited Destination Set Command is used to configure the destination information that the Z/IP Gateway must use for incoming unsolicited frames. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = UNSOLICITED DESTINATION SET _ _ | | | | | | | | +| Unsolicited IPv6 Destination 1 | | | | | | | | +| … | | | | | | | | +| Unsolicited IPv6 Destination 16 | | | | | | | | +| Unsolicited Destination Port 1 | | | | | | | | +| Unsolicited Destination Port 2 | | | | | | | | + +Unsolicited IPv6 Destination (16 bytes) + +Unsolicited Z-Wave frames received from any Z-Wave node MUST be forwarded to the Unsolicited IPv6 Destination address. + +Unsolicited Destination Port (2 bytes) + +Unsolicited Z-Wave frames received from any Z-Wave node MUST be forwarded to the Unsolicited IPv6 Destination Port. Byte 1 is the Most Significant byte. + +The Unsolicited IPv6 Destination Port SHOULD be port 4123. + +IPv6 enabled Z-Wave nodes MAY send Z-Wave commands encapsulated in Z/IP Packets to the Unsolicited IPv6 Destination address. The Z/IP Gateway MUST translate the destination port of Z/IP + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 181 of 196 Packets destined for the Unsolicited IPv6 Destination address from port 4123 to the port number defined for the Unsolicited Destination Port. + +## 4.14.10 Unsolicited Destination Get Command + +The Unsolicited Destination Get Command is used to request the destination information that the Z/IP Gateway uses for incoming unsolicited frames. + +The Unsolicited Destination Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = UNSOLICITED DESTINATION GET _ _ | | | | | | | | + +## 4.14.11 Unsolicited Destination Report Command + +The Unsolicited Destination Report Command is used to report the destination information that the Z/IP Gateway uses for incoming unsolicited frames. + +The command format is outlined below: + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = UNSOLICITED DESTINATION REPORT _ _ | | | | | | | | +| Unsolicited IPv6 Destination 1 | | | | | | | | +| … | | | | | | | | +| Unsolicited IPv6 Destination 16 | | | | | | | | +| Unsolicited Destination Port 1 | | | | | | | | +| Unsolicited Destination Port 2 | | | | | | | | + +Unsolicited IPv6 Destination (16 bytes) + +[Refer to 4.14.9](04.14-zip-gateway-command-class-version-1.md#4149-unsolicited-destination-set-command) + +Unsolicited Destination Port (2 bytes) + +[Refer to 4.14.9](04.14-zip-gateway-command-class-version-1.md#4149-unsolicited-destination-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 182 of 196 + +## 4.14.12 Application Node Info Set Command + +The Application Node Info Set Command is used to set the application specific part of the Node Information that a Z/IP Gateway returns when queried by a Z-Wave node. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = COMMAND APPLICATION NODE INFO SET _ _ _ _ | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | + +*) Command classes may be extended  spanning two bytes for one command class + +Command Class (N bytes) + +[See description in 4.5.4.4 Node Info Cached Report Command and in Table 8.](04.05-network-management-command-classes/04.05.04-network-management-proxy-command-class-version-1.md#4544-node-info-cached-report-command) + +## 4.14.13 Application Node Info Get Command + +The Application Node Info Get Command is used to request the Node Information that a Z/IP Gateway returns when queried by a Z-Wave node. + +The Application Node Info Report Command MUST be returned in response to this command. + +This command MUST NOT be issued via multicast addressing. A receiving node MUST NOT return a response if this command is received via multicast addressing. The Z-Wave Multicast frame, the broadcast NodeID and the Multi Channel multi-End Point destination are all considered multicast addressing methods. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = COMMAND APPLICATION NODE INFO GET _ _ _ _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 183 of 196 + +## 4.14.14 Application Node Info Report Command + +The Application Node Info Report Command is used to report the Node Information that a Z/IP Gateway returns when queried by a Z-Wave node. Only the application specific part is returned. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP GATEWAY _ _ _ | | | | | | | | +| Command = COMMAND APPLICATION NODE INFO REPORT _ _ _ _ | | | | | | | | +| Command Class 1 *) | | | | | | | | +| ... | | | | | | | | +| Command Class N *) | | | | | | | | + +*) Command classes may be extended  spanning two bytes for one command class + +Command Class (N bytes) + +[Refer to 4.14.12.](04.14-zip-gateway-command-class-version-1.md#41412-application-node-info-set-command) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 184 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.15-zip-nd-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.15-zip-nd-command-class-version-1.md new file mode 100644 index 0000000..f7a2652 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.15-zip-nd-command-class-version-1.md @@ -0,0 +1,156 @@ + +# 4.15 Z/IP ND Command Class, version 1 + +[Z/IP ND Command Class builds on the same principles as IPv6 ND [4], [5] and is inspired by the frame](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) formats. Z/IP ND does however not implement the full range of functions defined for IPv6 ND. + +## 4.15.1 Interoperability considerations + +Z/IP ND commands allow a Z/IP Gateway to translate between an IPv6 address and a Z-Wave NodeID (Link-Layer address) when requested by an IP host located in a Z-Wave HAN or anywhere else in an IPv6 environment. + +The Z/IP ND Commands are not intended for classic Z-Wave applications. Z/IP ND messages MUST always be carried in UDP datagrams without Z/IP Packet encapsulation. + +## 4.15.2 Security considerations + +The commands defined in this Command Class MUST always be accepted by a receiving node, regardless of whether IP security (such as DTLS) was used for the transmission. + +## 4.15.3 Z/IP Node Solicitation Command + +The Z/IP Node Solicitation Command is used to resolve an IPv6 address of a Z-Wave node to the NodeID (Link-Layer address) of that node in its actual Z-Wave HAN / IP subnet. Several IPv6 addresses MAY be resolved to the same NodeID. + +The Zip Node Solicitation MUST be transmitted in unicast to the Z/IP Gateway of the actual Z/IP HAN. A Z/IP Gateway MUST NOT respond to Zip Node Solicitation commands received via multicast. + +A Zip Node Advertisement MUST be returned in response to the Zip Node Solicitation. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP ND _ _ _ | | | | | | | | +| Command = COMMAND ZIP NODE SOLICITATION _ _ _ | | | | | | | | +| Reserved | | | | | | | | +| NodeID = 0 | | | | | | | | +| IPv6 Address 1 | | | | | | | | +| … | | | | | | | | +| IPv6 Address 16 | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 185 of 196 NodeID (8 bits) + +The NodeID field is not used in the Zip Node Solicitation. The field MUST be set to zero by a transmitting host and ignored by a receiving host. + +IPv6 Address (16 bytes) + +The IP address of the target Z-Wave node. It MUST NOT be a multicast address. + +## 4.15.4 Z/IP Inverse Node Solicitation Command + +The Z/IP Inverse Node Solicitation Command is used to resolve a NodeID (link-layer address) of a Z- Wave node to an IPv6 address of that node in its actual Z-Wave HAN / IP subnet. + +The Zip Inverse Node Solicitation MUST be transmitted in unicast to the Z/IP Gateway of the actual Z/IP HAN. A Z/IP Gateway MUST NOT respond to Zip Inverse Node Solicitation commands received via multicast. + +A Zip Node Advertisement MUST be returned in response to the Zip Inverse Node Solicitation. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP ND _ _ _ | | | | | | | | +| Command = COMMAND ZIP INV NODE SOLICITATION _ _ _ _ | | | | | | | | +| Reserved | | | | Local | Reserved | | | +| NodeID | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Local (1 bit) + +The flag indicates that the requester would like to receive the site-local address (a.k.a. ULA) even if a global address exists. The flag is typically used by a configuration tool when creating an association between HAN nodes within the same site. Using ULA addresses for intra-HAN association serves to decouple long-term associations in the home from frequently changing global prefixes. + +NodeID (8 bits) + +The NodeID (Link-Layer Address) that is to be resolved to an IPv6 address. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 186 of 196 + +## 4.15.5 Z/IP Node Advertisement Command + +The Z/IP Node Advertisement Command is sent by a Z/IP Gateway in response to a unicast Zip Node Solicitation or a unicast Zip Inverse Node Solicitation. The Zip Node Advertisement SHOULD advertise valid information in both the IPv6 Address and NodeID fields if such information. + +A Zip Node Advertisement MUST NOT be transmitted in unsolicited messages. A Zip Node Advertisement MUST NOT be transmitted in multicast. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP ND _ _ _ | | | | | | | | +| Command = COMMAND ZIP NODE ADVERTISEMENT _ _ _ | | | | | | | | +| Reserved | | | | | Local | Validity | | +| NodeID | | | | | | | | +| IPv6 Address 1 | | | | | | | | +| … | | | | | | | | +| IPv6 Address 16 | | | | | | | | +| Home ID 1 | | | | | | | | +| … | | | | | | | | +| Home ID 4 | | | | | | | | + +Reserved + +This field MUST be set to 0 by a sending node and MUST be ignored by a receiving node. + +Local (1 bit) + +The flag indicates that the requester asked for the site-local address (a.k.a. ULA). A ULA address is returned. A global address may exist. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 187 of 196 Validity (2 bits) + +A two-bit codeword that indicates the validity of the returned information. + +Table 57, Zip Node Advertisement::Validity parameter encoding + +| Value | Validity identifier | Comment | +| --- | --- | --- | +| 0x00 | INFORMATION OK _ | The Node Advertisement contains valid information in both the IPv6 Address and NodeID fields. | +| 0x01 | INFORMATION OBSOLETE _ | The information in the IPv6 Address and NodeID fields is obsolete. No node exists in the network with this address information. The information should only be used to inform a user that the actual node is no more present in the network. | +| 0x02 | INFORMATION NOT FOUND _ _ | The responding Z/IP Gateway could not locate valid information. IPv6 Address and NodeID fields MUST be ignored. | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +NodeID (8 bits) + +The NodeID MUST correspond to the IPv6 Address contained in this Zip Node Advertisement message. + +IPv6 Address (16 bytes) + +The IPv6 Address MUST correspond to the NodeID contained in this Zip Node Advertisement message. + +An IPv6 host may have more than one IPv6 address. If the Zip Node Advertisement is a response to a Zip Node Solicitation, the IPv6 Address MUST be the same as the one carried in the Zip Node Solicitation. + +A Z/IP Gateway returning a Zip Node Advertisement in response to a Zip Inverse Node Solicitation may have several IPv6 addresses to choose from. The reported IPv6 Address MUST be selected according to the following priority list: + +If ”local” flag is set: + +1. Unique Local Address (ULA) prefix + +If ”local” flag is not set: + +1. Global routable address + +2. Unique Local Address (ULA) prefix + +In other words, if the Z/IP node has a globally routable address then that address MUST be reported. Else the locally routable address constructed from a ULA prefix and the NodeID MUST be reported. + +If a Z/IP Inverse Node Solicitation command is transmitted in an IPv6 packet the returned Z/IP Node Advertisement MUST carry the IPv6 address of the actual node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 188 of 196 If a Z/IP Inverse Node Solicitation command is transmitted in an IPv4 packet the returned Z/IP Node Advertisement MUST carry the IPv4 address of the actual node formatted as an IPv4-mapped IPv6 [address [8].](04.16-zip-portal-command-class-version-1.md#4166-gateway-unregister) + +The IP address carried in the Z/IP Node Advertisement MAY be all zeros. The reason may be that the Z/IP Gateway is still waiting for a DHCP response after including a new node. A Z/IP client MAY re-issue another a Z/IP Inverse Node Solicitation command after a delay of 2 seconds. The delay MUST be doubled before each new attempt. The delay SHOULD be capped at 32 seconds. + +Home ID (4 bytes) + +Unique network address of the link layer network. All nodes in a Z-Wave network share the same Home ID. The Home ID MAY be used for bookkeeping of complete node information in managed installations. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 189 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.16-zip-portal-command-class-version-1.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.16-zip-portal-command-class-version-1.md new file mode 100644 index 0000000..0bec256 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/04.16-zip-portal-command-class-version-1.md @@ -0,0 +1,223 @@ + +# 4.16 Z/IP Portal Command Class, version 1 + +The Z/IP Portal Command Class is used for configuration and management communication between a Z/IP portal server and a Z/IP gateway through a secure connection. + +The Z/IP Portal command class is intended for use together with the Z/IP Gateway command class to provide a streamlined workflow for preparing and performing installation of Z/IP Gateways in consumer premises. + +## 4.16.1 Interoperability considerations + +This Command Class MUST NOT be used outside trusted environments, unless via a secure connection. This Command Class SHOULD be further limited for use only via a secure connection to an authenticated portal server. + +Commands defined in this Command Class MUST be encapsulated in Z/IP Packets. + +### 4.16.1.1 On the use of Z/IP Gateway and Z/IP Portal command classes + +This section presents the concepts of tunnel creation, maintenance and bootstrapping of a Z/IP Gateway. + +A secure connection is established by the Z/IP gateway connecting to a peer. The Z/IP Gateway::Gateway Peer Set command is used to define a peer. + +A secure connection to a portal is a special case of the general secure connection. When connecting to a portal, the Z/IP Gateway is operated in portal mode; having most network configuration parameters pushed from the portal. In Portal mode, the Z/IP Gateway only accepts the creation of one peer. + +The gateway Mode Set command controls whether the Z/IP gateway operates as a normal IP router; learning IP network information from the network or if the configuration is pushed from a portal. + +A Z/IP Gateway has two modes of operation, each mode determines how the Z/IP Gateway can be configured and how it should react to a number of command classes. The mode of operation is determined by the customer depending on the type of product they wish to develop. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 190 of 196 1. Service Provider (SP) (Only Portal Mode available) + +a. Through Secure Tunnel connection (Locked & Unlocked): MUST accept Portal & Gateway Command Classes, Firmware Command Class + +b. Factory default: Device remains locked, and attempts communication to portal, reverts to default firmware configuration. + +c. Any other attempt to use above command classes MUST be ignored + +2. Consumer Electronics (CE) (Portal and Stand-Alone Mode available) + +a. Portal Mode: + +i. Through Secure Tunnel connection (Locked & Unlocked): MUST accept Portal & Gateway Command Classes, Firmware Command Class + +ii. Local Access (Unlocked only): MUST accept Portal & Gateway Command Classes, Firmware Command Class + +iii. Any other attempt to use above command classes MUST be ignored + +iv. Factory default: Device is unlocked, and may connect to portal if there is a default configuration containing portal configuration + +b. Stand-Alone Mode + +i. Local access (Unlocked only): MUST accept Portal & Gateway Command Classes, Firmware Command Class + +ii. Any other attempt to use above command classes MUST be ignored + +iii. Factory default: Device is unlocked, and may connect to portal if there is a default configuration containing portal configuration + +3. Gateway Lock MUST prevent any configuration parameter in Portal and Gateway from being modified locally. Configuration through portal is always allowed. + +4. Only the secure tunnel is considered a trusted environment when locked. When unlocked the LAN is also considered "trusted". + +5. In all cases, a Factory Default does not perform Z-Wave Default set, meaning the Z-Wave network is left intact. If required, Network Management Default Set MAY be called manually following a Factory Default. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 191 of 196 + +## 4.16.2 Gateway Configuration Set + +The command is used by a portal server to push settings to a Z/IP Gateway via a secure connection. + +The Z/IP gateway MUST return a Gateway Configuration Status message in response to a Gateway Configuration Set message. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP PORTAL _ _ _ | | | | | | | | +| Command = GATEWAY CONFIGURATION SET _ _ | | | | | | | | +| LAN IPv6 Address 1 | | | | | | | | +| … | | | | | | | | +| LAN IPv6 Address 16 | | | | | | | | +| LAN IPv6 Prefix Length | | | | | | | | +| Portal IPv6 Prefix 1 | | | | | | | | +| … | | | | | | | | +| Portal IPv6 Prefix 16 | | | | | | | | +| Portal IPv6 Prefix Length | | | | | | | | +| Default Gateway IPv6 Address 1 | | | | | | | | +| … | | | | | | | | +| Default Gateway IPv6 Address 16 | | | | | | | | +| PAN IPv6 Prefix 1 | | | | | | | | +| … | | | | | | | | +| PAN IPv6 Prefix 16 | | | | | | | | + +LAN IPv6 Address (16 bytes) + +The LAN IPv6 address MUST be assigned to the LAN interface of the Z/IP Gateway in the consumer premises network. The LAN IPv6 address MUST be used in combination with the LAN IPv6 prefix length. + +If the LAN IPv6 address is all zeros, the gateway MUST auto-configure a /64 IPv6 ULA prefix for use by IPv6 enabled hosts in the consumer premises network. + +The LAN IPv6 prefix MUST be advertised in IPv6 RAs on the LAN. + +LAN IPv6 Prefix Length (1 byte) + +The LAN IPv6 prefix length MUST be used by the LAN interface of the Z/IP Gateway in the consumer premises network. + +Portal IPv6 Prefix (16 bytes) + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 192 of 196 The Z/IP Gateway MUST route all IP traffic for the Portal IPv6 Prefix into the secure connection connecting the Z/IP Gateway to the Portal network. The Portal IPv6 Prefix MUST be used in combination with the Portal IPv6 prefix length. + +Portal IPv6 Prefix Length (1 byte) + +The Portal IPv6 prefix length MUST be used to scope the routing entry created for the Portal IPv6 Prefix by the Z/IP Gateway. + +Default Gateway IPv6 Address (16 bytes) + +The Z/IP Gateway MUST send IP packets to the default gateway if the Z/IP Gateway has no routing information for the actual prefix; i.e the prefix is neither the LAN nor the PAN. + +The Z/IP Gateway MAY be an address in the Portal IPv6 Prefix. + +PAN IPv6 Prefix (16 bytes) + +The PAN IPv6 address MUST be assigned to the PAN interface of the Z/IP Gateway. The PAN IPv6 address MUST be scoped by a /64 IPv6 prefix. + +If the PAN IPv6 address is all zeros, the gateway MUST auto-configure a /64 IPv6 ULA prefix for use by Z- Wave nodes. + +## 4.16.3 Gateway Configuration Status + +The message is submitted by a Z/IP Gateway to confirm the reception and processing of a Gateway Configuration Get to a portal. + +The Z/IP gateway MUST return a Gateway Configuration Status message in response to a Gateway Configuration Set message. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP PORTAL _ _ _ | | | | | | | | +| Command = GATEWAY CONFIGURATION STATUS _ _ | | | | | | | | +| Status | | | | | | | | + +Status (1 byte) + +Table 58, Gateway Configuration Status::Status encoding + +| Value | Status indication | +| --- | --- | +| 0x01 | Invalid Configuration Block | +| 0xFF | OK | + +All other values are reserved and MUST NOT be used by a sending node. Reserved values MUST be ignored by a receiving node. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 193 of 196 + +## 4.16.4 Gateway Configuration Get + +The message is used by a portal to read back configuration settings from a Z/IP Gateway via a secure connection. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP PORTAL _ _ _ | | | | | | | | +| Command = GATEWAY CONFIGURATION GET _ _ | | | | | | | | + +## 4.16.5 Gateway Configuration Report + +The message is used by a Z/IP Gateway to return actual settings to a portal via a secure connection. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP PORTAL _ _ _ | | | | | | | | +| Command = GATEWAY CONFIGURATION REPORT _ _ | | | | | | | | +| LAN IPv6 Address 1 | | | | | | | | +| … | | | | | | | | +| LAN IPv6 Address 16 | | | | | | | | +| LAN IPv6 Prefix Length | | | | | | | | +| Portal IPv6 Prefix 1 | | | | | | | | +| … | | | | | | | | +| Portal IPv6 Prefix 16 | | | | | | | | +| Portal IPv6 Prefix Length | | | | | | | | +| Default Gateway IPv6 Address 1 | | | | | | | | +| … | | | | | | | | +| Default Gateway IPv6 Address 16 | | | | | | | | +| PAN IPv6 Prefix 1 | | | | | | | | +| … | | | | | | | | +| PAN IPv6 Prefix 16 | | | | | | | | + +LAN IPv6 Address (16 bytes) + +Actual IPv6 address assigned to the LAN interface of the Z/IP Gateway in consumer premises. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 194 of 196 An all zeros address may have been configured by the portal using a Gateway Configuration Set command. The portal MUST accept receiving an auto-configured /64 IPv6 ULA address even if an all- zeros address was specified previously. + +LAN IPv6 Prefix Length (1 byte) + +Actual LAN IPv6 prefix length used by the LAN interface of the Z/IP Gateway in consumer premises. + +Portal IPv6 Prefix (16 bytes) + +Actual IPv6 Prefix used by the Z/IP Gateway to reach the portal end of the secure tunnel. + +Portal IPv6 Prefix Length (1 byte) + +Actual IPv6 Prefix Length used by the Z/IP Gateway to reach the portal end of the secure tunnel. + +Default Gateway IPv6 Address (16 bytes) + +Actual IPv6 default gateway address used by the Z/IP Gateway to reach off-link subnet prefixes. + +PAN IPv6 Prefix (16 bytes) + +Actual IPv6 Prefix used by the Z/IP Gateway to construct IPv6 addresses for Z-Wave nodes. + +It may be the ULA prefix if ::/128 was specified in the set. + +## 4.16.6 Gateway Unregister + +The message is used by a portal to force the client to close the existing tunnel. + +| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Command Class = COMMAND CLASS ZIP PORTAL _ _ _ | | | | | | | | +| Command = GATEWAY UNREGISTER _ | | | | | | | | + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 195 of 196 REFERENCES + +[1] Silicon Labs, SDS10242, Z-Wave Device Class Specification. [2] Silicon Labs, SDS12657, Z-Wave Command Class Specification A-M. [3] Silicon Labs, SDS12652, Z-Wave Command Class Specification N-Z. [4] IETF RFC 4861, Neighbor Discovery for IP version 6 (IPv6), [http://tools.ietf.org/pdf/rfc4861.pdf](http://tools.ietf.org/pdf/rfc4861.pdf) [5] IETF RFC 3122, Extensions to IPv6 Neighbor Discovery for Inverse Discovery Specification, [http://tools.ietf.org/pdf/rfc3122.pdf](http://tools.ietf.org/pdf/rfc3122.pdf) [6] IETF RFC 2119, Key words for use in RFCs to Indicate Requirement Levels, [http://tools.ietf.org/pdf/rfc2119.pdf](http://tools.ietf.org/pdf/rfc2119.pdf) [7] IETF RFC 2460, Internet Protocol, Version 6 (IPv6) Specification, [http://tools.ietf.org/pdf/rfc2460.pdf](http://tools.ietf.org/pdf/rfc2460.pdf) [8] IETF RFC 4291, IP Version6 Addressing Architecture, [http://tools.ietf.org/pdf/rfc4291.pdf](http://tools.ietf.org/pdf/rfc4291.pdf) [9] Silicon Labs, SDS11846, Z-Wave Plus Role Types Specification. [10] Silicon Labs, SDS11847, Z-Wave Plus Device Types Specification. [11] Silicon Labs, SDS14224, Z-Wave Plus v2 Device Type Specification [12] Graphical UI elements, [http://en.wikipedia.org/wiki/Graphical_user_interface_elements](http://en.wikipedia.org/wiki/Graphical_user_interface_elements) [13] Silicon Labs, SDS13425. Z-Wave Plus Assigned Manufacturer IDs. [14] Silicon Labs, SDS13548, List of defined Z-Wave Command Classes [15] Silicon Labs, SDS13783, Z-Wave Transport-Encapsulation Command Class Specification [16] Silicon Labs, SDS13782, Z-Wave Management Command Class Specification [17] Silicon Labs, SDS13781, Z-Wave Application Command Class Specification [18] IETF RFC 7428, Transmission of IPv6 Packets over ITU-T G.9959 Networks, https://tools.ietf.org/pdf/rfc7428.pdf [19] Silicon Labs, SDS11633, Software Design Spec., Z/IP Resource Directory. [20] Silicon Labs, SDS11756, Software Design Spec., Z/IP DNS Discovery Support. [21] IANA Service Name and Transport Protocol Port Number Registry [http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt](http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt) [22] Silicon Labs, SDS13968, Smart Start User Input Identifier Registry [23] Silicon Labs, SDS13944, Node Provisioning Information Type Registry (QR code, Z/IP Gateway, Smart Start) [24] + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 196 of 196 diff --git a/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/index.md b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/index.md new file mode 100644 index 0000000..8d0f1f3 --- /dev/null +++ b/docs/specs/network-protocol-command-class-specification/04-command-class-definitions/index.md @@ -0,0 +1,31 @@ + +# 4 Command Class Definitions + +The following subchapters contain definitions of Network and Protocol Command Classes. + +[silabs.com | Building a more connected world.](https://www.silabs.com/) Page 5 of 196 + +## Contents + +- [4.1 Inclusion Controller Command Class, version 1](04.01-inclusion-controller-command-class-version-1.md) +- [4.2 IP Configuration Command Class, version 1 [OBSOLETED]](04.02-ip-configuration-command-class-version-1-obsoleted.md) +- [4.3 Mailbox Command Class, version 1](04.03-mailbox-command-class-version-1.md) +- [4.4 Mailbox Command Class, version 2](04.04-mailbox-command-class-version-2.md) +- [4.5 Network Management Command Classes](04.05-network-management-command-classes/index.md) +- [4.6 No Operation Command Class, version 1](04.06-no-operation-command-class-version-1.md) +- [4.7 Node Provisioning Command Class, version 1](04.07-node-provisioning-command-class-version-1.md) +- [4.8 Powerlevel Command Class, version 1](04.08-powerlevel-command-class-version-1.md) +- [4.9 Z/IP Command Class, Version 1 [OBSOLETED]](04.09-zip-command-class-version-1-obsoleted.md) +- [4.10 Z/IP Command Class, Version 2](04.10-zip-command-class-version-2.md) +- [4.11 Z/IP Command Class, version 3](04.11-zip-command-class-version-3.md) +- [4.12 Z/IP Command Class, version 4](04.12-zip-command-class-version-4.md) +- [4.13 Z/IP 6LoWPAN Command Class, version 1](04.13-zip-6lowpan-command-class-version-1.md) +- [4.14 Z/IP Gateway Command Class, version 1](04.14-zip-gateway-command-class-version-1.md) +- [4.15 Z/IP ND Command Class, version 1](04.15-zip-nd-command-class-version-1.md) +- [4.16 Z/IP Portal Command Class, version 1](04.16-zip-portal-command-class-version-1.md) diff --git a/docs/specs/network-protocol-command-class-specification/assets/img-08e1758c21.png b/docs/specs/network-protocol-command-class-specification/assets/img-08e1758c21.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e2ae8543e8eab555d0d2d14970a9e654eafe98 GIT binary patch literal 24662 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

    uZ5BREg3{2ae8{XysufL8k3UA z4Lpg-tO&NV4Ula~i7 z6bLU*PkgW|$`E~KMe`O_p<X-d#mhG6dPvec@Ui znX3!4Z3J3BoliqhIkfXUBXzw0B$W8fEB2=so1_c>~8&35j@(ibDQks6w0-Cb0xl+ z!XVP5V95}hWoc}p0!=B)Io)U2RWVaUb#!o-C*Z8+As`HNYp}+g#0@Db9$F1qa`*UE zo*GyQHs}DIt5D!^fe!GdJPBdJ!8^nMPyd^S@jH%{ubW89%HfVqRPtFox+--k_8@lmcxN>?bU4>#9yG(+y(fKXF$fXyvC#MM8Mk4Ey_BlSEOY;H7Y-bS zLJ^&sUt;Nds}71qtEes%!QJDaG}E8@EbqDCoD3=y^wik!J5NcB>PUMZOl3`cxGuq` zzhvk?<`p4si7j0HzRv0czzG8bgYT&{GY}t4N5}`pWP~Y|vi~rr=Bb&zeS~_;{aQMG z8Rtk{{8!O9Tke86o_m-5VPZEc-*nk7gMuRyuov)hd9 zXsSoZ_bRsWisLF@OQlk5R%dtjhE!m9WF%KFC5^$5i?A^pFJJw4s(@$1e`l{ua7 jdKYcnbPqHTMF{eGy&i`B>>=< z;9tW$@hJo!05=@v^;`hpc01-5E0*In4S)q`C_H)VJ$`1?n zr@Y^&9e~0CfWIx${pt^Z@CJd^)n5-vqHr;P+`sn!0NFJd6UibKPbB`&i$d`g0I(mB;jqcg z6_WvutD6lEkIyyysNUn+N+K+CG zh$CRaiK>#hGo@$S8iWVTckN$eUOdB5uX)Rr6|TRq;G$;Gf0CDT{qATbCA36WTnb$6 zC67AafEo})vo57?#apvbnKUZ2j+JHSWUuq!+x9iUgnLtp&^2(E90eYXT$iY2s;uTEXXX@y#DKpzIg%~O!&em` z{Z@V$N=H^2CD`ee4cBO#O)PeVAW&G<5}k zf(Di%SdjWdYLc88-MyBE5;XvTFRkDyk_@V;nti#qao~lP><)Rtv(34-F=YAtTk72> zljP#IjGzz3IW;`#Zr_a=rey1?YoH60=YtBc#la_y9P+}!eFaYi?f`)LPp`MpAuFso z5cLQ*Z*lTZuh9>9Pt!x~3Q;cEeYpT2^YDNj7hM{Ki)%S!6lwGE7u)f`h?{627GPCl z^yM{Y*4q}n>hVQ=CK1J$VJaFdAa@a*5i{Q6?|5AmWtbcuz(yTU_z52Lh*ubt`DGZB z99;VmaQ~Lht^auFP^hX0JR#o@Tx=-;UGSedKt<`6+Vj&95)fFKID#isL#}XOs-k)y zXns;S1;=Y^m7-qc4c_I~iTXP^;*ryuC>sF0a7vNtt}~Y3mC_yRKW(d-3wr-YuvhAF zzdq9h)e5^8OqB&__ILaU4$_n7x8o-?WhkU?ndfXU64GTBLA#2jqg6X3KA5LchzWX*GUr)VI?We!^Nq^Dh zch<$@cig+}cX=91LIL=1Ej0)()uE2{S1r$j@GH6S`WdMhS=`rL z(Y8~+TrW5L&WrE(%wt#2dTo&DyxhT-{Ef}weR`W5@W1?cIQi(C6)K{pL7etbcSNj3 zB4VMw{uTE^?Z~fB1Y=}_ohRMfwtAdz;zkw*}u4W?&Z;Jf&Qt*}Nu8)*t{O zoJ%-jXWtBFSW~zzLyI7yl#M2dZw#EQCPqb`eUJ26m8O5}w9wvbbWkQI@#ka5`&)pn z1y!-iz{4*Zokgql3sc_VBXCt%N4tEYdt$X{ww%TDPTjpE{!UgA6J~Zqyh&7}Nr2oin~By9SxTDsAA`#UN>eHlQoPApxMkk}3aV$w z$!;TC=Df6{khG(zrt_&7R<*{nC7#Q*w2L(s2sZE|8a~c4CorVLqFd^__UPbbaxeCV zAoG?swbsqoXzp~~-~NI;akB6iYV5i*l+wmrqVJ7DsXlhy)|&MX)DTg^%}hD!h$F=& zXB>&q_Bss8s~F~8W&>CMy2k{wsCSOaU|-+FllJ;9P3PRpRozF9EcWQ&Xxu(+t!{qR30LHQgHKMqX)(_B}_Yq`ZPK9EM7gk)#&2g)R7z_ z>fRBdjafUS;WV`HhZ1#2aN)$;kV^P$xOyyA zHmfWoc0ZS2UPNpkMR>j47ij>1jvhCK&<6idx4?!Gp-{J7*=WJ{{fOS!uS5oMrrlmQ z%(5%ruRKxeK%@3#0~X_iOpFyuDIoHU#qWH=*=uD7XC*`oV-61AQG^LEzc-;^d~P4j zkuxAofAZsw-%*>;jO(zH(Vu7qm6Gc#P=qc_r=+Epe?WL~ImzK7b^ADV!tZi5^1@Pl z@*iQG6^MB%2e`Z-rFGi@8ys=W#7=~pQDv_2abIbzcTKxbZkp9rzQ@asH`Vaobn2xk zDb6x7Bt*vROErRyQu)h=RlsT!M;aM(^ClF+x5QHGyngme?cx_#^|bT({&>?~HczEm zffvC6^!y!xps@S$XA2|P{%HB-QPK8EQJ2^wqgxW$Fc{3BrbU0%$2h>oPDx)P=inVQJ zks|CR`!hsIO4JLrkU;b4BUOxZ%u5jm-}M~dbkm(4H^(w2f+ADLvd1hm=IlW=?oGN1(Yf59Z4gWpG)YsJFGG@vo za7TO`9qW~QM7Q5Fz0e5`KSO;Eung}IgfWcBVBrOS7SpX2?Qk% z>aa_E%Sp}mPYi2-EH;SZu=|VUpaeamRgD_;&?!R{)lxVU%1UTvv^wm35+bS;T8rmx zMJ#O#L6{n9mBLl7D~-g^LXGh5e-JNXA+{4rPoYPns#<@fBqh|U{u-g(In6X?+#u4(L$KT<<2~w z8*TUZiehMeZwv%@naULq(~j4-voqNS3qGO_?}SZm{I+x^a;!F$yBH zibFnVzNyX9l;wFt3MIc={(O?OiP)WG97>GX znxMIVI4&q3sM{S7wIEp2Y5WrlDpjZMuG$adlWb$J{d{Bb(?~q=)u&BIVNH}`PFTRI z(XLXo2U+S7>&^gqviD}R?2H$W>2oh8Xr!WiZJi7G@SV@J@N&jd-D{;EmthaNgv+ZA z#|%iqsI-&4GxNG`>&*IZ=E93Q@JYNBRy8Q@+3jGWvzv0@&>JhJZF%ziX(ra3(;(xc zpkr2~j*;im;01cH2wiDVQcbg2fc_Kv^2Tz!-*LQJs@QSL+;K|zr7svg`F48w!5XOD z#zR~)kA~vqV!-OOO?*ZEX{)>?d){;LEY2Aj^9ok^+oE|C*@w#=`pmdLypvaF{cn54 z^Gpq~33bOFE@0!`o^~5IEDzetH`>qZk~k>s5v_D^0Ac4tr^T%08)_b{wC>Y8?W__` z2Xnhi70;_aUIXrf2clV0R1RAS5&&(I#~U$JgZf0*ZDh%kR}nL2*!o?VW{+r)q*T{7 z2O4Nv`eL6?g7RJZy}g&knZ!nshU`M!-D|h$#EuUAE)RufJr=cf4BZAqRtmr^{{Y6lD$eHT$M0Cheh!FkCxdQqIyr7{ zZ%bS}pn&R=MxUjul%DsM2GG29{?08#bT%OXuXN2pS>V$XgX z?)u-Y8831;T3)&i$&5;!SgCpI|G!^4+F2}yZQ6wC%d1&)H|!xX!F}6%?$qe=WL)xm zO|6(>6`~IS%Qd{||3cbk;GQ`pR)pvV$&uxwYm4-kN6v9y_uc*w7$3D-Gn|Vy?TT_{ zVFA|{THpN}hJ(?k>?nE8L(EwIaqD}$}M%A$VK&mZozzBAd@97tsJ9{rw|Ff)@+lF|ZqVabS&+N9%VbZyrcL)HCDc%@Y zZp*oF_od8bgLlef3Qo&8=goci>Ookm{jAN8C!`ZOJbvfu)bbXo;mAIS>B znUg6Ojzzu<3k%X_zGiSS3F7~rjCX6p+g8D5ZE=mtvq$&Lv{`$sR@XCt6>LSY3C#d%`HU}=zYf@3h6(jFV z31L%FFXM^9jP&F+8vZu&+1oF{CpS% z=wUpL0yzlVa_K0qwJRS*W8#(fcEcgY1HrR#JKe0FbLyhSNa8ane&};ho_3CmZ+v7R zwxTaW(`zM>hzqo@pHn}6X2WO7ob@m@tyXpMq`hpmK;umY*I)+HiQH(mQIkc-*6X*` z<_Kf8fs(Lwf27r<)86L3w%)A$hn#AXd%37O4fGCGnp8|dS^?(pG58boltj?4z&ssW zF2ZwKv^l=Adzw)!@=h)T8-qq7CmKHq_^0R3HvFC*`q zk#Q`_zXQ70{ONzlGj8k$izl!;#hN@QgEoeyUUvPthS2tTbPEVZ9>8;avr}u9iwD@D zjOXMoFKk7#=9{5+pJ+w(hZt5+C^Rh11F~f0qB8_3S_9X-ZVu25BjKAGgqf2?aBbUI zFOLCedrPUbW}TzG0=__k$4C**!4X_7T|w14f=(RtjHbheZCD%4tYbHG{0ITlVeA=T zHx~e{RjfSQda^&X$C(N50;9KL;ef|_IL)q%nc2DiHX&lvbf9$r9S~00k^J*|*9)tO z3E!A8AA>){Qw{=z#yxtW*S#NgiWNS!ATtk}_2ykhsqT*;tw*tMS2^r)M1*MgE=1q6 zE-@{!=R_3mJbcuBBI5ezSNE~hK-PFejP4l}NCua#LeZ~X+-LnhL& z^&{}ElL%IT)x8o-#l4_33UmSO3 z)|`}YsyHv*J87XmYr!Z3jJS9bzu$tw$nba#{h7rSb?$Sp!&OP^2!TN_!TT_JW#CE3 zWa^HxHHg^47uq!*zG331`r5_FqDy~o>C3Z9Tb)Q+BYNXpmEg^ln{5*j!g*F5Xx?>= zwVxs8KGNg7D$E-u$)P5(xmZI}I(b>Q)>1bB<`2JYo~g0EMXgzqCjROX*^`#slP+i8 zlRRsa>?7~n_UID5IEuW)gs~lg@s}=OeS3D=bb0DG?EsUoj%bzs4gjjOeI9UybYT@z z)(Axiqh6_icVogieggH*2+1c}9Sqh1!HZ3nn zTi8pniM3~ni2KHMJQk28w1dBO?O29SX+KECB-8t2vJobZd5>!A^j};SA+{0=<1Bhx zL7?K-u=X`+t9B(73@z1x^zqbhkM+F{E@AZAz>}wslXiqzgBDzeDbkUXMs^ePN-wVT z=eVG={kYH^QI`-wtPL&A9O4yQ#K-Mw5iZ#0D#aVmr6J^@3_%v8F8_fd1eiy>o;P~< zXlLL)vznuPWUd^*SgzT3`-yEARSv%(B0+xJ{a%lv^D!7jF8#J#(vr9mB=^6m!Oj-x z(+V^4)1ue^XrMA%T<= zwoM`ETjWKVOyg%*lU9xBq56s9-zpA(t~VGYGFTit$Vr~Nyl@gME7O2?QTR7N1SdE< z_=u+lX*w03H#$Mb6fOI8WTx$HU7_nV9CJU(&G_{rHl?iCs}v_8;noc7zH>(2h*{N7 zoZ-SWeW*9xb@G2~j8CcQ1*Vb-mM@*H$}&>5FF{j`Fw{h2J=<%y~OhKRn*taRU*Q zA=7cVgU@2V@%cLJaAv%d*fn_1e0Ms2YvrZtXAz*#$tbJq`#`m^1TRt5h%;-dnY|8MnriefsB=yHCDe4> z@8tK0w$k=?(dU%B>$`n9AUyVKnrk}iZ31fsS`0%7QbXw{WwjAOj{uXq{HX$Z^5s?E z%ot{f2P$q8nri9E3yn)h8-vJN?)Q-EL1bcz&GKhV0tfRn+P41;H1YMhi_N(=Hp`K| zdzsZBr3&I(4GIk8{PMKVW6YCb#@$u?U%>xV!C9AHMRdH63pR2#ajI>zycC%T>wSY6 zjuV)$1NUYS?;@TI`G@gF^LHOhe?Ku|DP}*;yc+a!%&s%=)vJH%2ya#Aiy>Fz-nACk zNS_on5Y=1P@4?IY54~@ZB(&>p2?Q)0MQwp!o0RGjGHw$;pw; z^955Ir3FmG5{X+!nada@z+fYsrr;QS{c5T^?}Pr4juWD=n7Jl!nX8w@nKk%$qd-8U z0}D|74;ns*MdZ?Qvep?hQ<6jDv98J-$CCd^&+&U2`=k7(ll%=Zj$I<=l4ke5V)VS> z5{C_}Uu{wWY+2GaE+kOR+jeUTfJFsh-PqDH~w$d3jx(Z|4kc`V_2mF>_lB zbz8GFos1S=U<%girt?jcSckMNnz^G+41X{nVNJf@Xi{XFz>}1(mbB8lEP1&r={KA- z>k3wP#%`n97-}2Co2_E9)xf|2SiPiOo~=l(hzyFXB)g35y5a#^H8@{hFC0%Gsevcb zDGfS%xrIzR@13jOf!vaWpurqQ6?t*Pb7Ork=F8n`&L6rKMJ6g4$Pb=At~$!~ytuV_ zTy{LO?R(fG*I(>4nqLI+RG7R}fA*(0@}9__0E+tgS`cMEPdgbgzT7u%nhziV%hLJ} zATg7?1Ne)~UTW~2pY`#r;YH~PIgp-PGb_yb54?bZK$!In$Lw*=aGl;U7yxK?i#-S9 z`a#x`!r&ygb}neod2u%~am5%}Bw>9K2GS4;@9H^<=P{6BmiW zn$Gtc+e`7y(jn#7qEZ!-$YdoXFU8JU>2 z1Gf-cdZ^}!Nlj-O{7RN!ACepAZy(ZaucWjNV~3d1U-Dun(r?qocz7JS`$ow~o<8h2 z_c*rLXGzKU1X(3%ePFf!0~@&6MTYfvlVfv9=*nq5ixjsmFhYVsVnJ?rSFl%4p68PP zXXY{{_!Rn%^pW8M^KIt;v@|1Tli&igR2In^ut(y4U)?_wtSu6hUl#d|oDH})#zZD! z0obiU*nbz;ngth_0~gr;2$IMyX{X8OLwoh#Zj&Q>dzUliB4-_&Vj~mh&X$FCHTVIO zFExo@UMHskH^=wAV@g@X7UBFxhjrsKV1x%Z5Z?&9Noikj7hA1 ze^^JcD~@xi0N!gajsG@PH-0vB8*!w<4km==e0DMVo{*}$P}%k*P$5S)MkZP;(+f0# zr|#xE;se6yzOg=^5ki0xkNff8Q{6w9eOa`ttT+rSudcdjeZk6XN$&p;ke(z=N53k(wioI1#Q=>B+ za?Kk5_4rli`=*ye*_^cBX|>;Jgy_~0c$Rw@w{!42ol2n>03ArpdvZ7x^sPVOzJRBj zhRko_f1B=3+bW$?s~8o26>6}mN^S%___z@4jR3$C9>tf;lf9Glr=|25j&}%|_}LtM z9qi)2*s3dS$mX;8JFW~#5yP2ubqzpv&)gAS43zk~*tZ(Qz@Ri!+KfyI#}5y2Y%C@XSUDdK>Z0KA7V(B`*4 zd93xyC7!1kt2qIjLw$x3=D6`}t`rn&K{+pI?>5NfQ1XLIk^7lRxLsuX80Y)N1T|u} z%)9w7ZHegPvP^i``ZsdMpP*LpnfC#MO&ie zz!QU-cG+BVBwlr`oc^ef;`rjdhF-u+c{p`R&Mk#`(rdg>*7VaaG*=!4Vnb@c$U>AV zaKw8XeNTGE)rk@HmbIz&U*f!S`4Hrq%=x^IZe`UFI!&s=zb)JWN*?Y~qP!*ueI43ku9VQ)o~~N@&yu4$^=nlI{DSM7G={4p>*2vS9{=xglv8Cjz1`yoI@ZbO zFu%>_-Qw+k>+Yh{r{$o#(ToZ(7qqpl=oPMJ-OE+>j0H?r3T}B@rGBDSc9wCv_sKMd z8sX)5H{$`=gB9$oN*l}M<5L6{beGn%JvE`c-DDk3_~c>MdJ{{p@xJ8*3TjEldCq>^ zI02pL2RUYMD~|Sb%kEj&$s`g^z7GeU2D-&sSr!59BKbV<_YF);=2~~Q6u&>vh2;6b z5E`=R*70HuWG>CUD3h6A_eib<({ebmwHpyf^X1{WGruM(phOD^e&?LDp?W%cIL=-3 zP7;BAWelKaHI(*m%j1o(rkwO?CkNtgutR>`yf18_LUXe;{#_P)U9q=Y?}(jxUE8Pd zI^NShL#w%>{5!$L_RbMEuyDHA?fzMZgNxPTXFesN!X3@E@hw9uD!VB^>qBz2O z1<-%=<>|%xvLVf>*HoR0agyB-gw3htxNVjwB`Hl=Hw%>LU6<;qYJ@uO zvu{)8z=7`d{~UrVO&s{>V7&oPR0c0kElY@dac~RZ)qiQqXv@tV&Y5L*aOU7?pVKEC z=lV&pPpd0&I+8K7^+Ji7Abk+@mQHl_knorzF({j9as#u~Np8oeD zEI205xNmE;86}6%{Exvj+8tD{jbs-K55mM#bFTp#Z#OL8ts{lS`{ok3dT{JDlMGJZ z#5Edr7L4a6WfNH#W@egD_Io=CnlmklvS|>7>ame^co0VvpyI{7_63s&gFWDT_cE!S z#snVUd_PoAVewp6voVmEEIlDebBIFIHcIcAd1AGV)={}AxWS@KqP(sT_a=Y3XEg+n zw8u8|{6g0DvRRGvBZG^JkQ%#>_Mzyk0BJ3rIWYpnd2VZqsRnE`zdi17)NPATab4uA zz(Rh$>xh_21Fh({`MaaNLW8aLbMjB`l!;^)A9!_5Uxb^;)esSa(P6_9hdVsum)=*6 z8673`q>#%fc!G{`eW_oEl(aN&Aj|G@Jnj{GNIn`soUjd;ixjkQCQIi%dVo96`B_{g zGd?$qILn;jMIW7=H+)BqJn3wL78nD@hww)ir3KxO%E)<%IoV5I2>%pSpTUQ&;$t!f z7k4&Mp3-6`k?)UdlsCr6bUBiL)8<~F8%x`4u`m(K>fL!0WY?U_yz_a8E4piQsa zu&Qg@#$2TP(BEPE^9T3UG~g$1R~*3`cT*QqUP<89J2*Ke|A`~HD z1Ff1fi&1Ov=k)Xf9e6`^y5W0vR?F zuc7JCqf^FSKp{^PqdN+2@%9}W@T90w&(e)Y+d97*AhU;RDlF=A-9;oD8aE>L_y`*h9l3eg4PR-{M0A{d+$0$@1ttFqPK` z*b(ie%(TF<8o&9Tlne^nGffKRis`+0j;LhK1AzCzpoy$)E#%KkiX%BbDFnKlm{R=S z)Yg~hj>(_!@-+MMX@}6>me_@txFOD=m`BUZL8@272Xchedf&=sHm*(Wj$5qLEnx56 zy2B?(-LfJ5@#TGXAiKEA`}4EZx1Ar$+y&H_D5Hs*c&>vCzK1NA1sQ_JER4rQ6n#=; zVsi`8YhUMWy0fbzW{ZgnpfuJDFiX}YJg!f*1F5_-AzX9y%2MMbcI#i?5ecNW;Ff2t zg|#c(nWdu_{f>%rD-Dd{P2EQY=;3sw8#Qt#lxYg1f{AiUhq%k*AHl(^Bt(#>E0W=Y zX5Ll_pJtSJ{eL~n@Nx|eoukA9>GkPPD70lJZp+rAJUK`nXWn+PopaMI z1+pc)#iofb8{ghZRRwNp8vD+7zcyk9QQYz_Ay7j_+3UA##mSQn`#Yhu$zGp9WTO|n zXbaEM?7f%%gi$uRv(qHt#$v&zAvq6EZ}bxZG?@QeJlgASz}Cbc%TzAYeE#*ZqRqza zE?O15r8Hw+U0NgO<&p%_NmpUPPRzD1;ghl^1#(oj0bU#*yQydb{X9<&D~h>WE>6k; z5xt&C9MUqrs9@PLOGlQ+C)|mT=c3&EU^^XxRJKWP972`pD6x97`RJj#9&iCp!EgpU zB$#ob1TBU)LU1?)86uR$0b^S)f&ttPG~Bci7q){(u&QBRx;J9K^%2b7m`E1>A^bWk zGk6X|1xB6Yy**H7UJEJT~+cColwYLbqTYUY>I;BC_XPWcmBM^Nhes<*47D_ROrgfp_=5p zs%N~jk|=a1h&f4;e~esy)B0RP`S6*FE0X%r`_=)akY{~5H`**k@~)f5C!~M|smuG# zq@tx0tS417`80d*5JlAmwvei+@UU;pI3|a&94bz1pRztVsq2%I4DHS+J+?9vEflhJ zU+4UsY*L~uWusDOBfT$*e2&q|4yct^m-#aa#$#nG^aI`Riv5KPHR=Rga~)n@(!vSr{>@%G7x=JWa{WK+S(lChH1Nk_FpZvG<~@kx4q%Cf6u zg$gPvR_d?I68~N(01Lo_6^JSe-X2>Pkv}0K__w-- z?RnYzO;9SUnJc|)I^0lbY06^*8@ei#hqSEiz;CoH`e1Vl9tAfFa4UbbP+;RqN|@=% zGw>Cj1z#j4%Ss5=EKN6|X!I+3W?5Yj8LP>s^n3t~W>BR0$>#Im7O>&}PY4lR*_Pk_ z?4q9OKU7d$r_s69F|I0wg7%Vl#+k+IJmz~$7AC+Hky^$qXpGRaAZQT`A4|U8o|{4K zAb+EeLbl;Lf&d}M$jFGF|AeKr$Nt^4ABC!i_Sb z6=ULpbs=Dr=fFCX77m&8lIL1NOa~E5D`6F&bj56KV?KmqHG5zRXV`=OxdfRWTO=x> zVMFjSb=?+TRuah_PH|f}kBvh6zUINhh@t!WU&v-6JHO}*dBfn8 z{w#HVA3odjkRvhLSnP1+m1^_O8viUF*)7qrR>s3bGj>7+JR9z?eO1>MZUSN#Yl}8+ZS`ji&ww~gP(L1~3sXy!hSVCn7$xfSJk{oQiXX5v-NKMP%0rtmgFVysQsD zfl`~)gE0YwZK;^d0c^C_MnQ|Rg`l3+LI9i|BeL=4G7=wXe!Rn#wPCXs-qF@6c>IhS z=)@#Duu*w=v8i)DUA%QcFIjE%QXN7KOLGGJHCM;Oq!C>d1Xh3J@VC3KTvmPs(w{5M zaQ+1O9^-WvpkZwJ;6~~sh*!Emk_H|69mCxmoekQ)ipQA15qN~WhzAmXcH+;r?})DW zowm@gohse}fY4pZ@}SKaOe-U*k zgKfD}Ct<-D_^W%T)TJPN)2ve*x!M0401EYCk`Cu5{11j_I=1B$ITAFDR50imr@k0Z}NgoF3|0h5&A{MFC>h2T+2rO8*{;{(1t zBu9EGyQ@;Ui-X2dN(>s~CBK0%yM%2)zXujTRT4E22%ZU0lDc>Ocjw2B=LmPuUYbiv zqXx`eE?=4XfJWgjkWuWLp92;3lS>3sFd;s{npmE9)*YuSy*@KOp%W{Rs1$XF1O9!w z@+%rMjN&sQvlu$;%QFhwv@0xqn=@-SVN0?y>B^kjj^k%aj-DlAtONzVQrZ-CWs37< zwQiX^H1rq+JOQ7#fT;!WxAW>=SShZNqXuvzf?Vl9QY>leECRGCM`71@IZ*6od2knI zYp=|v89^Q1yKUqXpaxEG4v z+5YEn7!Eyu*r_XD+nT}<t2M<^W%>`yiiaUqupdqByJ@%es+%x3O5IH>L5_L@&1aFhX$jE6D5H=t=buzqXY%Ox3r7@2o-C z4G!=-p0a_G443@~?tO%*q=4o}Nw(&G*6yu6Sqh6P)Hm#H6@*~>0*i+Oi%BV}p3;i9 z%Nkq|a?;9KfeGGznerydaY3>#zpgDXBx6u1aP->Gy4ofCqxo#@^e2ffx3N6DWr8UP z{XPZ0UkPk6(XkI<;rsf<9f|S zv0{={y*M-)&LMqiG}^WZL zAmlaSePPQ3^+#xChHn*yRv1dgH*-OaW9^=cxGh2tA!>2jW61`=>lz*p<}op*FeSg0 zq@tuq_?4eSB(*9(-XGW6WoOhLZ0Z8d7IjC@PU_pX^(V~xx@{Xj+wgg-+A0U7(8R2C z8RD8m8t_KHZ{T#Gh*3m=rjQA4=t@7N#FK}chO_qWg$_3&s*oDICdQ|xA+o070TO2^(XP}W~yTlGpS_WpQ@?!cyf$pAbF;k)ZLI3 zZtXb!T49zG?UB(l9{4DjIkq&ETEWc0@m&f{paF|OZNQDM-z;8fz2rtKJ)1x>CD`kB zbinMCA$@*+77!39zB1EUpkMAv*=NEop-FQr9y>|4Ip{OVOFPiIX+jJ0MrZLzb+3GK((Sfd&kG`0Ith#J@#lAZ(o$=6T)PR|Th*3_AP0_Zt z3?E9AR9PHUfwR%j1+}KQUA1g${IIG_MnOckQ@+Y`u?Jweqr^)9Nw`hPIPB+$U3Q80 z<_h}Ijq0EVn$YiK4Nq(uTPQER42JXNjcXz3kX36f^a@)OrOVKqq|z?eO=cp zo9eq%53%5p4N+Sh?80Df%+!~6!DPSR69pgwsF?<{&}wh{h`X!sEigY|FfM>U2@<`k zwII{`gYm_XbPJfJ*XxA;#$7Z0^QH6erLl&630RzqGhZCRd^C@V$oDPlJgg60bAF^X zT?5#z5?EpfE(Ui2bfdme5@p7|x~|B{a+zg=&|1_?*mT ztSmoECLzv*oB5rF6k#*9DML!v8@I?u|7=Jcxj)y-X~D2*u*Ho>&Pk%p%&_z>)DCXf zDIGVh%8=9lQsg5gE)i3YMSY-?mrO!o8hs7-*hMp#dU&fZN4931(pL9$LYd!XfwtnpZs{UUs5`$gNly-G$GQ4UlbD*Jom2;Rk%%ogH4<$~mGSPrTG8Cw#IC))vlA|;7w(g2757sR$kWZZcdBs&$ zUGC~sVz&Iob`TxT2W7;3_ic{-!K-3T$anmL*&v>!Tp(a3#N2d>kh~X}GNZ*SkI)nU zZX(z66}dn-Mz$y?1kY^N2;oKCE5is_wT7*xB_c3G-7Ka5`3D{iq>2r3V9l7>zIadB zf=5wCTAb3UAfuDjj%_b1qpTz;yyt;1X=CoED4!6vr!2o_eTq}Q5+y)JEMs@kUM4!A zv?H!NC8a0DdSKVGPg`v>b&K%ND>E;u%+Q%{WlB`}D8Mv~>LbpF2O?tTZ0%b;eXYTA zR*DMG2sP32%Dgr1o|zir49*o@!Wtq{M1TDtksG9L@3ppduJ7^5k|E^4=$OgR%M2hg zo`$Hvjn{-~MG@!lewNoCc}Zia#fc!_-$k?^Y}gf5Y@>(tgeWET&F>LJsJsJHjQ4c)WW zr#*fnfu-&f3Jjui>C zXeQbjLAa_|elF35nv{3SmQK9aLt&@BfH256WWv2!bDGLBpqsIKxMdP>$O`2%OaTpk zWf+Wj-%=;VX-7cU-E2|cxQ^Zrq>L^L{VkCCVkqLdGP_891zl`ZvfU&N37?8mi;j4q zDeuR3_%QQCbV^AS9kp4X2rf~aFM0GFrhc{WY%r1O4}`rMVcohB{wuTx;#tVW6n;j z0zQz#v<$91yoD7kFEGUp3MJBlDLYYc?-mfOH~V91lsXR->eE%;zq7ao-tYQb<&^H> zy^;8P96De%^ml9~*jc}-%z!&)t(eOPxbMJiDEXQEjpKGPm|)FzH7P9AJ4>mV6sOkp zs>{D&V%6G=;pCdZ{PF7SEtT75KbcorfGf!pyar{l$qfisUX^H>*=oVCz2gD&uBP!* zasg@^`?{l>Qxykfg17Giguy#s`;$CC%DJIi92v0ea(!EGYLql93DcGr>Q!46(y8bV z9LlF;7V!>S@7StqF0T&1zdviRc|9Y%aNR=U2rTjm6aG#T4jMF3qS|u3g`LjxD6l|* zsCdWGkGjQKZWvZmhy43`fQWa>=4(RD?S=;KFH^Y}f37OE*PTg%4huwZ2kTcdaox#> z1)J74kt%ZH1G&kDIkc6Wdae_}8u0S!3ZuOuZ?V5KtThB0-JeALxmaqrxQz`^z5{FM zqN0apCSsyE9IY0qHr|yT60p&jDbB?WrM1@a#32o(2IUGYLOK?+RcG@dCOXFYC3Yy2 zmvIYu@>BP+FK7~}Yl_R~cUs@EWxbc1$bp3JN=k{i@CPsIJ-`7t)b;dtI zFnua8l{56RChz|G+uLVJ*F$Lji~RqtF!7;#c2q1Z*JF>*i^-~1G>nQS2Jdz21lVN| z4$v!8UvPS#g|{|MHi{Su*1b+;w?(IeVPq(y{@F%JDJ;M{i;Tk}3A4bY`N2z)b}t2E zEb}lr{|mLuev}b4i@7TiT3m!6yUXk5tq&dJLBu69iKQA2bE{H=8V=8te;ohsaj3Ws zL)FIF{ez*mYgKMM39w)+z+4~3zx^wKk9eAqOJ8IvnKcdU9xP6${xB;cf&j);Y3~~z zsrB4usm&0+tyroMZYVB{ukn$skc!4^N^L`fii#OWKhb4~!;*->6?s>8rZ*!1^ zo31ve8-fKEuk%YAMrHT=~D7 zP|4JT5Qys;=QheGw`IG2Bu^5*KadL-hFJ;rK^Oo=XQyEBpC>3!%m3fO6S?dIpn4MR zGL404rxz?F0Fz%eiL$~KZqXYV{R!EH%70jV2iSWNaJ^y;AtlCvI$60E-o(QN+aCEI zclC@1q~+@Dp*u|X^h$ZW_txzMsqXGju8GJB{0A-WgU8G+g(+uwvQYPvNJOnOZG=^> zfHM4^&M^KoqaA_jU7Z8=7^M~N%q+}0jdhB0{lg}wYj z8_epAgH8W$D+y!&rRfi2ye|IzJv<_L=hr5!+c1~!GBzL^k#F^G?Lr*sQ#r-u8E2(+ zI7*B-=zqB{+YTf%m*-gR5yxr;RB*P34*XFGm8txKvn={V@3svu!AcZ+crcc*(i^qm zRc7{YI97VWWaV;GbY^EC$2$igTi3DuoffUBLE@8iT*l;)u9iumW2^hxkB^IIOSHiM zq3x}ss_NQz;cbf&(hW*?ONWA_NS8`CigdSv#HK?+HXxnSptML!NpHHlM7qDZwm#4M z{>~ZW8)uB~JO8rQo@=hT=Dg#&uKT7n^zJKQxw}RBzuhh_{PtqjZ@WJ=X@27FP1tpg44wTBd}>cwjh{z3wbLL(=_pM z8Ng6~0d%&vKJeXF1~$`$lkmXf09+fYgG$P-kj9bEI|H{i0npQUD^!YfoBwNzACM6M z=+3Wua^6D~h}n>AUl(Xnpz{Ku@vIqD5TJI1a9*fx@q61)d+i&@vBHWQp(xZR;#zNm z*NzfCv@aDP;2MjRc{w(_<9qvw_yf4$isX#}cK@rl*A7kWdQA9!#Q_}@-;x1#ECnyY z#kJihKZP^)pUXINC+obTXqXb;Wiw>1Oik41O4i&=Lex>lg@sG<)fF6{cE|}~xO2*_ zUE5-Qjz4@iBUB1^V3}+YICY{gZ@ckN9L+B&EC~8_)=h_najZr+ct z&DLloXxwT-xADu=Lt-+Sp*>hZmOuF84^q1#!rk9R6!CuAT79q0g_dneFP ze$~}wcdwdO^uTY?edn8tb*Cn{-4l`%Q*Y7G8 z4b{fw_^j8w`}}aDP`!)-MO8q1U!o>^?4?Z6*#KX3;Qu{RUSu(6voUpe;ES|`1yi2< zQ(k8Zm%<+lnnj!S&ag-0;JgL8A(3~MD}=vt@?TS;BWPspL4zyH7exIm5}hw`KYSQ} z&z>VM2q**sH7IkCn~zI;RoQW0-eTyd#ohhT*4Vlif*lgGo!>-9TOUz5d&2*40L0z<2)Nr0Gd3HKwh; zkXh!{Gb2CsrxU4@W(AKoVhTerOvpXJcaa7MQ>Dl-tB2HXVE>{el@~^SBKO5E!`6ys zYTQ%~qOk;G2{JS3o~x~oBuxw!GOv?8yjr486853bz1S-53Q__Pz6R`QvZJj0)Yegf zD$0x-Pal&dxXoj{%(uqkW#fIw8J^XzW|VLy`N7Y?8XUB8yhWQ-UXnD10Z)&Ncp*;MIQ-FJ zz#3}EG*ioj0f z7Ougr@vIS|rb&;3sBr#u5^^A&mZL3TXG@)bk|7F#4y@ z$}@r8(p%ZHx9JDR3brD>fQ53q1&av+Q`x{GeL1?AsMxGP?J)$vA@+JFobQz{liQ>5 zYij!=`*O7k9@y^1u$CN;bql_{U1?Fi#ByH>f5=5bPQRXGjTNZ_FeqhW&g<)@7R{QP zt2wS8-GrP}elQH>^C&i3HK5g;&k)$&Yi8NVYOarol0ui-LhFB#1MthO;r)MS5jvT5 z_zx@J@&79;zd+Osug7Ii*PpMtD)Tz~QmeM za!(Ds*N;-Knp-?z<^2kvluqC%z~LKcyiGdZMvx*?7J-R7@^n;_PRh67orZ%LiLb8Y z_CBW}tl!wfTGqWY&r8~k*VUZj8tfBK*KO*J%a|K_n_&iuLZwCW)f;y^{42a}7WedD zobl;QP%X!S?K`7$H3$&f%srcQh>q+HlzRqub1WHQsagUrvZq0K|3b?jLUreV69_ET& z>^2M^+5*+%jofZxpf{cp*vy^u3_yd)l>Zj(1+;kMXIw0=J@$Ri>i`>lzGm;gmODxM zGTSq_yYL2#0sc34Pcph(PG{dZ=tqZXQG4pG%tSa1dWa=-%-;05!Z}s$iW|-`DY&0Q zU%ztc)^)i%BYkeTl#AP1xE)Ohi(uH?^z?pEx9N%0IxV>dBl+_K8=LHtV`eW9^7&Lm zfb{_&Lscg*+5T_xjLU=hogqMFIz`~rxh4c;*WBtxx zTK_&1LUDW?qbpYyp-}iL0B`sm7LMj{E$V@U;M)tCmpclSE;&DPR|z1sEE9@Q4?~F> zZhr(btgJ#QpmG4(V%r!Q4aq2A*SoXsU;$(VzdQ#}djJH@L$ku%Br^l) zDeN62+D2jcK=vxk8%8#dVgqsj2vptl&)OuO5=x@zuh*BkljG2=QA>6!9PyVs073#t zU4agb0SNkR6d!(;1t!7w<==(K3JCu*_c5gHWq;cX){GH))lXJ-)%8ti>&%1S10XPe z**XQ1cK|-ZmL18FJT|E!Q)f2z3`Tya(*C=P_>o;iiMpGjSUVq{Z(!B@&AXJu^GJLW z+XV1A|2#DBR*V&%ceq3B^LqE#QG=|>>pwL=w&t;wJ|NiS;LfPE)QP z{mPwD@4rf^yd#_VA;;N_Cm2|D$OpgPilz-H`Y~Y->OVjtushKMi*Wm@$DU#91?pJ6 zRh=ULFU+>l?ogS=m@@$oL8^3pc^WjzrZ;Wwml_h3BxBRHnc;D%v)xYU&mI-_{2KD< zqic?hm8WPR*@AUu1uy5xJ97(L7StVQS`V+Y=#R)HQ;wUw3uUO;sE=w2T$5aVjZ@}t zyY(s=6n-Q*s-2Y_uRXuDE_nB}^#Q+9qyC-~V$lfqi?13E8U^J(w()Dx=Jcx*-N z9gLRLP68ke0!abvo3&B)NoF|uq0AS)hW|58Tgo84HmU;oHL0S`1jk;S31Vk4TW@!; zDOo>wh4eINqcdrqrlyX+@Fk5{Jy1sFfR9PXhpx$W>c}t;XuHob6L8Dj9M>elo)00f z3#mK$ah+6?DtwYTOk&D(zfn_;$td}!OREv#M3mAabgA6edsgV_eKp*cCR%$BHiQ4r zm&9cql`7x~qABK*s-J$wBo8#j!pOhWqm=Ho6bR`K|;~ zl0q5fM@d(RTK4ev;Ei>iabPDEwa*{Hkc^+CT{nX>L&r|vqB z5|oAiVG~z#CyBQrt$aBjD8$>)0~$U(k`q?Lp4q*i+b{L->+4b)YXT=><;C^KB%g^* zHl|v#45Ra`>xyuQni0M~N~%lO`$70Nh z@hF#*eqGDvj&2H-&|RX>jHI5|RM_>uAco`Yt($m0U=IX5Wwd@0&l#*Q;}%h$6~g7T zjYciN*$WWMNh6!iW=XV%L?LAhKOPa!4!zv1*yyBvrIp5e@SP|D+E=^mB0$dc&v`z3 z^@ZG5a^~j3%rM&WxdL<^c_C-X@|(g! z=%#0nPEizxSS6|AYnr^G4U4tSz*~|*teOOkY=&hA6`$19+`=~p*~l!rN9$EAO@gEB zibEnTcUwPPk*A3LuhEU&I{u!GfJ%kf%OD4}w>)&?0YTSOq*CATz;j62#AIXGH$5&K5mUQcHb6CC|^a(Ep*N$;U){AWsHKxCWY}QIHSdTp*zZkudP7WG)x` zDBtl86|})1ANGC^5)#6ErY+B*N_^CBm&v_=_zzI?T(e!Jn@i!2$Qos)~--kGH3(PSW$N^2R)O;C*G$`ORQ^=I?s~|E|i{%cJDljIJJHDVroR%Vwc@c{#*;2U1QRO*IZt z-`hBg(02d=HLIP6tSIV87cA*r@ag|QQ`LXen!m=8Z0EU?2VGMPMtp{9eJ^)EQ{fyi z;roJ+ROd(~?9P2;k``TMw|)uB5K9V6^Drxr++z-@vvjESU zI=&7LzK_WeyQd`q2w9SJTXPH#%{MTt9ByV^*Vp7>C<)qOKBsdw`;t;J>c@iPZ>W+^ zPjxflXC%_AuKUA5l8E5?&3Wnk5TnMDpkKR$I-P&)6*!ba%jk<;;hwMkb24SrKKPjg z_0?OK%qIQzXCm3)9heK>v@$XJe&5WJm+9`b4|A&EI#ZA_T7O~T#=|j9oPurfLlm(L zL3=2D43((5N!vSj7@er{XO z4m8F!FVZPO>N*wfj2>eyQrul-7!r5;ftpwmfU+KWOTR!=jNFwMfA@^IBE~dPQ$F~! ztcz;^6|$g2*|O4r;J_zaUH-PpHpBc>$7)eQj*dHR-P-~z6vYh0nfXwn;PdHPZ}sr8 z_6NJA#;M%Y*9t{^hDDUk5i#n1MLXqiCxoF&$86?)j^Bdiz*KyM#fv-jYZmyvK{QWR zmO8HW&VV;q5heJBbuMjn93u=st@cM6)x1E86R*O@oi#V%S;Kdtbkjz{Ig5*RXf{3GUaC?I)PPbFH_qS)ONgacP*btA+ zdwM8DJ_99VGwLFmi=ddeh!=PvpDV!agzlo^VrE`25l~jI`JXY@C{_b@hpfPlG(qJ% zsIJckm8~cW-Aq;Ft^IN11K_`z4^qbJfQF(jQ!SCnkK-iO`q`;jPoca=X8$TX7=w@{4- z79o||utmdO-=W$)AZ%ZJmJBNB*U%8l+D;OGr-a2IQtmFSO#usoqiu4~}yXlmcP}=+MB&->sz{*+;cW(A9-R^;3A>%P`e9)ZG1+cvc!MhL%}h8uj-}I5&3F|`1ITRpE{{q zo;Tih_;mVssW{CYDmsN~B#oM4s1)``7FTH}&%^eNWuLMxzo{&Tz1TFNYDYfZ&4RBn z=Y%#63cbU1eR9O}+*#r#yJP}BDe=DDvTW-k?Oi3_Ol;FN|rX!r0g>U#Ys2f8tG zuV?wk8O@q?WuSf1mA$Ae>yvnArqM-@l87pc{CP&F$zu6JuNp;R*KaLMQYA~bsu2d3 z4}H7_3J&LlTwmPD+B~q&P0lX`STKx35E@lY2k-QSOm;U>{PW7VED_JHA?vu^7V)L5 zH(0s-j!j%uC!751dFg&$f5)3P*kJJy?}(8dj{E8@v{*77Pmr3OZ=cXGv7R?Mz<2n{~D|JHi7A_3F zb%#Q?;hEV^Py`$DXCN%n@rkt+=L}!&n?@&d1@+p_vcu&xnzUAx z-BJ*cs>w-(9ve>H>Zgq`N(=E(p+iREe4aD{z2$|4l535uvhO?L6;OQGkTc*EuL&t) z&%CSmT1uLApUYy_a%TvKG(-i9U$b*m-P>at3AJuAQr%k2mOm9Uu^lb3a??&`AhN%2 zYq*eTM?6rl@Sj!BYjnM~c&89G}JyoDTWmuIK+kRWw#{H_x zmyw^e#907nJ@yTF-pRAw!}sae9Iun-N@6Vu82ZAT=bX7HF7FIB=Qzq}pgy~r=d*Qv zdT*UdGnvLvr-Zrzdd~W&`l~+(L}2GBQi&yXJn}zsUC}KT6XRr8+*A^WnXCBo8H`q# zV+rzb8cJ!MeueUQ2JxZw2DVZ3`$sa=1%}>QZ^caSd!PJiDlq=j?mvTUwG^gp*!|uw zEY}V^*E@lvuS7|9>|!Qkz;2b23a%(5Oc0T7a`kMYi7;_9(fS}6L6QDPdRnPWOLX33 z-uC*8y@?M@Xy;?cH>Igr3DeVXl6B~iSy5RjNE!oW8 z&p{8y@!?WZZXAagCIJfDxMmBCZ+1IMD>u)1M8{v#W?7+yR>h>v;96iL5e)r`v$9pOG0A*ebqUXF|1 zNmO-Rx`TqDCPX=N>K&I{ePJ|iQJc}}QG9pT9GkxZ0Y(|N zw)tRihWdxutsICF_hibe)e>g0SEg4!9K6WE&dmE!a5isvhpE?=UCcCGq=;Nd zZ2t7|-9=k&_vw)d<_VVX;l~^u+7~Tf1=U3adhi6^AnJ#1XwWDja;kGV($(-XrGMfJ zV67US^9(P!tYR{FE&->3Ox&+OFHpT4Uu@y)Pkk6sg&;Xd;=WQx!<5CzB`2vYsL1V_ z?Zlk|Dx}9GR0Rv3_C6{>uK2CIfR|;^%YDJtX-4O-s_Qzvsu1QHq3FO_s8GQ#)>qxd zh#E#jxrIkcDwjbne5P40jE)JvFZl7uJd&K(3H9tG)U&;j$T(bY`KRpcdn7rALEN=D zLjE^7aetP)_+X*%UNt7ctfYMHrowScn*T`pfTIjHEne{Fcjr@q8R2XI5jY=CYyHfe-p|}5JRKYZWxRad&N8jJCk&d?O>uwyG@i?xH6cyd= zv-ODx?ty-KyaaNE&j?HCRJ1C1cuVz46d z7;ju{aLYj;BQT-kp^d40TYm+fnFX@5N`-8=mxfQ^%SirRZ{k}0C}r^hyK$Ac`~E|9 zT^8XAMx|?OSDA6{B_yiyaLJY0D8~e<)TRZHNT7>aXj4LrNLWc^*y?tqsBYFdg@u_X zhc?q90b5l7Vqewvtom`3r{pI?lKFI+031nLS|R_eKE}t2b}K;)!@5bwj}_h}ONnee zxQMbbWmHoxd}{Su!f36Lxu0|i_oGci=nAQ)ivP9Bq}Bz*(GCBbvIqEY;T9p`QDky> zAKY~jxw!L#xooezvY&p5Tw?Es6$@Er81+nw^jl9qbFq=JJvU(cU}uCWg!vL)|LkVR zzT?$U_5n(1!iO;%=1bdyY`;0}3v=qI-iZ8ed^t(bMy48UPLP+$U!d1h{H)|o!!H9- zXT%=Dw7Mp~TH7kkv*gTJT7=#Wyp)}1(xds#y|zBdRkkX>mit2ptpQ1_DzAYyTxdn6 zicu?aF~_yp_+TiQs83|16a6!xK@a#c9kJb=c*^3ElH&_m%4UlTs)v>*wDF2^dxpxB zAwe(T1HducFDTs?IVwhID5h~Aw~RV{#Fw^NdK@wg8l%(Fq&zl@*y%ND;*yL}QeH}b zt>l5-Gd~DI0JlG9L%jjJP{})dZ*_8Eni|9M9nzYgaOcjB+_#M3-K+CJ&VejhoHnh@ zoR$$2es;01`HhY&!?^55SqsUpKlcbZ9m=FYd8(7y@t1@*tBNzm)EH;Yqmm5;78bz| zXZC$o3zjp7rZJrspwW`lYX>abfmHpFjO^-J$P~$EGmE>hU4A`LTY&9v;IEIxUtCw% zg5vJ)tE&>uulQcygds_J`#H}=`r8f%ydc3UvV4FV5{O!Xy(EA_hB)@Jol+nq#wj4w zK_0wM+_tMKh_9ZvnJEA%#iSuM`M@-I={ZzVF}%~ClK)+b1a{yL?rwdJ;yz3~)oA*J{U~#C{D6)0L%`k>YokR^qsfrY4-mj3iOsvE??^ z7FBOOu|rR@KO@HFy4JWiBlRUN0r_%)!<(`bTyMkt<>}tk&EnTj^>?_eli0+H0UlKM zqD83NfA3I+GUd)RwTO0<)b!-`*t)mE1H3dXOULi|FYvn=%aWEazEb(qYizguoPHylzPjuAYM$vneTUh!r7#`BwXVt)N2^v|+WQqBsRay~0(~c$ z%Y99(@b~T+(rmJNzwhoWh-J?N5E1ZiyiEF)ry*%?cgLDb0G~SW>%UKNy71K*dVRXp zFgNQxn2JqM;GkZ160Ia>NFwc@_{MZe7Q6;|TjwDJg}GP2oj+piY)4XD>U#0LyI96M zyQk2(=BHV~^l>1gOpq+&-|63due;fKWMkw~Vi*xA5nA#+_dpfLo?mprlABxc6TWDl z1ePKK0SYH`KU;i?vnzDUqU9y_KApLG?lv(XaU$6dPqP91D+CG4JrMg%Zy#_%3fz`V+!CUcVJiR{)kp1*f!)w=dDn z7Hoi<&r&Isc$V^*#dgUun69ADIXk-r$*rfI;u2x-wOG=uvMue;-FL?Bc4e-VC7A1q zQfMW65;Nh%Qx;JZT>b2~n`HAGu%%0gayVCgj$n57Ha}n&58$B=U8^1EOu-VMKH%4b z<&+*tv+I4zBc!Zm9@5H|ju&ADc}o*(OkLlBPcp2^&55Vv%&$V1WUcaZyl?-)?t_MO zLrt2IfCPDMc5h1P9aH?&$5BJ8k-=}^11seg{6kB%0_hm`fjy6S@(rff5^`nk3pOpO z#Va$x^XxsQlg7@w{+gh!)v8nTL!N-pAoX{btzwqZ=-Ay#BQH1NN$CZ#PTUHud8!#k zS5@K?RlnX=lV{P4W8jsRk7S^UtBt>f-HwRW&K&BqA5zb7aJPkz-ji6h3?4~(?BKxp zAT4wy(`@x1ja$rg7MhK~^VPMq=NP9Nz4DS*TLf|w?{I?%$niwA<`@LUNJ?O4m$xWZ zDW}ODpVrASuxa>HA6cIT^c(hda0rMSIB|I<`JKD|9C7Sax?1Iy#MUyAcbD)jJZNzZ zr)6oupGgXhw%}UAKvaIY;K}3%!@8E#tV9gXn4U_PNwOzT2yy4o8RiJa`FD*7ta=i; zKlc2{W&1c(yp2Fx5n%iijX6%$qr46)mM4L@#iyYdC9EQXK8-n3)= zvftQ;6YgNYHl8)q2o4gs_R+3Ryi8Lhy2Z3F_pYRKauz%$D?T*CJhR0ntuAnC?Z>Y< zD%H^*Pb0k5rx+?z!p!@sj%T+0mOrLJM9HCP7mu1b)Vf`kZRy zUI%s;sI-1k_>9xAJl42uji&png4|Ho&nC8|+kFWZ{FYowEi{3=)MhHi{WK!vb^J1= zMPXA;ym`k1nKi)%!Lw0isS*pOvUn<%SpP0rPXpQ?c0N?#B^715<4nNWfo(@kcuJs3 zLakXUqrRZAgGZR6w7ja&x^LEHvE9IdNa%88Zw*z5I~K;gMw@s%6be*u#HH0%# z?%Q8T7R`k`M69iKa8i;F=X7@Mb4di4n#%tt{t~HOhQb$UTaLJAu)l9=^aoA>sYoG&|o7NJUo)DjO z|4-Zn23wb|5dd}(CX)@m^ip?9Y!7Hmi1X(HcuFx>Ku>?r%+PE_0Al^tsMqOae-#Y& zVopbFY4A-(FQMqzIh>4ZIHDgR%S&uuji!C(nn3@SIPKTF!vPzL@2{P_E@~q$TCD4z z3lhQ}J*{1AvkBi@k9k?DS&;bhbLF|Gq_{E7kRYT}9G6#)_VlO|*Dg)5egcNx z)6b>kVFMhpV%0<*r~$+*H@dek>{qp6FxH(|$|k83M>)1g&6*;j6l1nwIsYH~NpI*u zOmTzHwCL;xd)j&WNhht;-jC@g_Ff)bj{O1u9!Xt|DSeB0Rj-;~`n<#uF7pzp1yVoTqtmZqI z?|%AZuSfYQ{!ZLRONEyegLm{j@==fWQO%GEdYa`mD<0dD_*RbHIhG){i~FW;JG|kX z>B>?BwBmT_nwqmuLc%OXV`74>mR7@kN765Y_g0zfFYdsc-XEUE@9tAr)Jvb>=e{hZ zr+gSUwmtz3I^n1oM#n}lz|a$f+n1n4|8_+?G=!_3AxYj*+MWX5Elw?jMY~E9?0Pak zv%j)^TS&~S#(@py6YJ6tUIl`DuqbqWv^83v67TMe9^gMPYUMPO=rZFBHJqN^!z_FC z!AC%|>QCnFz%Ht$ELmd2X~ok)*Jbyyt;K0S+sS)pe>x7egSQVkN5E#MSRHBBE5+iw zxwO`REQwc{tfwN>q)+ISN)Qh+h@f5_3kA^i{B$ z+ipj>R^j~CX#GMbsOZoG^PB}kc8sFewm+<<$TKvt4ilDF5q=S(+a>q&EoLOE9z)&2 z3^&cE<-GXTb_RUOpskMbHnmv?mMmjBMvDD(LSMn~IY&W2?KR9FZo`V1Yp2`xwgW9Q z^ghf*iHxvR7coc`tQfMLCwWTli$0dN;0mZ(ce9CnWd+;?dA@qWk{Z7xK7AwcaKU%> z%CumCUD>LYzQ$m%pkI^6&YQ^%{)~wz+72Y+J%9&Fo_##T?|UX5NtEa2o4U-A;BCdj z`Ni;mb3i}d6NNGQKg|CXjNvFtHyTUf(f?CRW1ri74agMhFY8@3U_Li?z+P>jPNp~x z8D_SNK$xb5j&jDS@N`rz275SEb~L7!Y*ENbF&@0(0uBH~Ek+(O3rcA@6VW(7einRR zjepAc(HPhCQ&5@_MqbLqMM(dE>fCzKUMCT(nCVcgiFsN@H-BBEUlA-vx$ zrK6_DOi_q55A6JS*%mb#N*vZCyVn2q8vK$?2lM$q=Yw(1Xxg}qp2fikG|#WD1DNm3 z#alYwMdu1kW96dlD2Fe0WZ5lzZ-yNEsAJOGa`p0;%H?B0@@*2nXC5&V;ql|3qo1Qa z!^fac9cGQh&GPq0OI;JF2vw(kH)}v0UHzQ9?c@a*2iKe1cU<&JMOs8E`85 zM%0sC$8Ja>khH;cZZ3sZU+Yz^E)Lt69 zWkOlNW_X{AU8MZEBM&1EV}x6dJ!OlcpZp5!_5Hs$g$#q6Mgg%Y_54Hxqi`*|R4hFP zipqkUdtZ4uf&6Lp^0fQXyf*neob|l=8jL0PL}cz{UsDlEDE~fd=_G%#F&D69`f+*Q z18#0x^&3VuQjB1Mw8X%YlGW(3rlcG}^{l$@*Ls;VQrxp@=NeK}Km zaFc8QJPH9J5E#}bpWFqQzBn6lmIQ&g|tbmK0 z5EOAVixIVj9t?e?X0vj@{aFF4mZEzo(qELVQY#*i@=}nTrxi?ke&3x1B|>31?_9RFxGful&KXdJ@-5a22^!<7n~ zR;9y=PAO&mz*pyW83alMagUAZ!Ua-=ml%AuJ$@zHmyjKfA@MtP?>o=*C;q_QpYdAV>3*hkgyQ8R66b^8ECsUC;BNNe@ZZ*y z{qyTTy-He`tX?ktZaWEDj-%(2@(2f%*tgG10io{?U=KPxWeVSJJ(OoZjv)GMb#M6r zdA?w%5+42Vg9h5p_ckQUYUT1-V;Q>HHCDvW?yD8xnw$w6i8Swa;t~&7XN039JsC^h zkzs5T%u+pzu^~in=*01g_pb5)_ zpswga!@CA|8I~Turbp4jNt=!Fp6~5#wZ?Q3FmO4{6uS=Mfq#-*CttGG5X^d>?`CgL z@#=Yqdcg?UFrpgXs)e>s@{%TXa}A4B2-=jeh_Fd=gQn?*#QfvbwXmgl3FkLa#3bqF-u&> zVa?{JUy9e_-cgwi3PClX&=>q7TH$^tAgac+qkazVTEb6?0YG*HXMXx%_bZ<0xS6|M zmc&V4W?R6LZ2BQ)c!og z^nmL%v1-wDUHtJcw~}B1fer?YW#W9QWcK8ScrR*CR4M*_a>|;}y%*b&yoWf>mktN` z9btmy6tz|nN(DVsiOJqgsk;Cu}1MCtHCKq%z=0DLQoGG-BBDd8KYz>+661EXkvNDM3;csKX29xDo) zkOe~7*t4(RTlM#%APJMt?_UrA!y6Lnz>PY`^464MP7U76>A+5lfEN(h&-O>3!Ujjk zDrmalUvIm!YP7}u0vO~k3gIbs4c^}Bq^l#Uj6O*Qz!k6dH~h7&VT#kh^i6@5dAOP7 zE}6SD9QH9n(Kj7`Kevy1^bo8Cs`mniNbTj%^9#>wq^or9$$NJ8t#Zq<`ng>8q=VI8 zpOunJStrsIv+S%b4w2ad!UUy3?r%~BvWAVC-VG1h;S!j7gf=+52yz zugB8rR@cTD^~8k(7X|Z~-#leag6=LG#I#@1dMe^Pdc$+5jCWtES~luiDdfRCPC(WH zR(q#qaX{mO$}=&ffmq>yBsSI~=j+IiH@)J@h=p#Hp_TG$7g5uc+))+-X@q`Kv-geK zFr%XrX7H^A8%~{=4`rt5qU8%*IIG{_rVnAv31=9oXJfO z-_g5LG*5&HHUG&PSgiSs81qb&=lWt?*=I`iWCsqw88f!nQ5WNw34G<4u>5qsqO^Dw zor`aRL6_HE$lJ)+&$|`=Y^1iLhF;Hz&tJt7qRR;Fcy(G#(@bnV%re zo9GZe$q~SM6A-E(T3oQ;osmNM0@}JD_ex1dg#w>yJcZpy{=W7DxL2OiL>`9N?jX6^T_Vc9eKZ|nR^XU$NSuQhcx z&R3PL4nK_^4GbN4d2mkZv;`9V4#ZJ}DLLs~j^wJTmsN5MVPpot02s7{Yo z5OJjFLuiE#g_5v=)i2YZ&nQ-ZQmjVsZA5MGo7#W{zrw9l*x1gH_H;+K&j^mroOh30 zLh)_FBRd;?+d1_g`MgVAs9m;ufc09eLa1CCZWZcJ?r1LJGI>8$s~d1+oGEzpUo_P5 zB%b6C%hKJtMUbugEtsZUr!70Y>W?>b+g%p}QL^5uNPo+9e+>VcEbXG%rB_J#z3$B# zabLXCCDWO$)Sxr~q$z2>AKfY3iAP^Qxyr3176~~<1wi;UIX?l%|7F8bx3`0Lr0yzM z%72W|1!!Lii)orwoFvXDp9ZYgLyO%kjso`w# zK=7Z)Z-R^$9DES;%$%LMQlDc%k>YFUoK<_wq0FM7GvE93`E3yEerpBxFYD5W09sd{ zw1MTOR?)g+O$d48gp3g2*RaB;LCp1afKv6Oh0^=rIWKh43%Uq4@ZXE}AUX3oIu96M z|F5WYuMI*hV6UCmtnauVPHsB>^TU7lAMG-T-Mudl4o>`e`(Jk0o7W^<(?a|2w*x}i z%d?~I&HWFS8CbOJWtP(PcS?@Xd!xT~Df<^iNYdaEB`lDveIE1lRdLPDBkX)0U?|jn@+7$go)h#|r&xE*lC>oKC9i zQ`b9~?B1+V*hR5d67QNfote=^Jr}KdBOv05>gT4vc1h*w^~wf`%*gNBFtoj=T;yY~ z34a`|6Xp9PF|=cXxVej)u+vhQOKuC!AlEk3m#C>MpUZYx9b3H?*NBd_ETEaSqQV#8 z^}B`Hh+>HQ-Vbln4)8y3e^Q~n(QJrZ0uU%n$zf|N^5XY-uLh=}EgjiSlB|z9ELq@T(q)af8I``|0#%Na7zJucCYtvCqj6 ztv%^q2qh2K&gf~Ae>l=sdtrq`3@7ji>$#JP7z&%B=sfZdYqWS`H=3FeGyxb0W}}bl z##0<`=lm8_Ug2b><@}VW>g!@cgb8NCX(T?tP5Vgnew(ay49*MfY9#qSAG7JI*^!Lu zJ6nFB^5QA{Wh2V|j9f~d%$9WLP7bj0lm$yxEs&dj&=w(l-LY?%cG}IvWgYL6j1egx z4T9Jq;OyQH^o5ZA03X3Iw57fyZ0QKUjNa~Ng|u1L_Tr!}_{dZVi_zn;1N+6CD5HL3 zM71Vm3?yPn8-|>Ylh3cLuRV!dXcwd{doH;ILQ;E`E@R`E@pV&WeDI0I9R?YP7WGC- z3#GEOc5kB~FPC9)=j!FDD2r-HM4 zrQ<6x!Jme@4pL(9l z8_g5&F-*=b(ywy89kNv4oYt)F2#Gx8x3pBbD0O$?)C?>8*{dUlE_$2EP(XIr#41di zkokC}ohylWH@nkl4RgIT|Cz91( zoOY*=a}O_mJ|rahb;`Q#NQqVfk*oY~3`$nIRV?P@Hpal8ua8IT@KK?g$GOzWS?zM@ z-cw_8c0*dq?ogIAzOMfchofKSGr=FEsV__AF#ojtXTYjLv z&ntZW5O4v5pA4u|u)R^(Ojct{*`q2gmnynVLxN7YPUSY<#e9?TU`W-o#ykFBPzYd0 zviwiXyb^1Z&$JWf^{jik)WoFwq+6KF<{sz_;;G5)nw42#O^!c+pc*9yfU^`qqE^hh zNL?moc|Q<^wwa;Ap~8#w$+pfhpyZt4mw9Ry0J1{hI8e!wjSgRbuVu#DBz?kjHz;mC zJA1p0IxrZZMEySe($6^@8t5)6P##&`B{xV>fPz4MBQOY%Ky;&o4t=X`@{GVtqkPZ5 zvG<*x$)Xub3P{Ys3xpBeU`?R_85V;$1(I5jn*O;xRmd^~z(+6!$l5G`H$ajAe?i8M z`ViVcrjbqmuk#YwMeQv|k&4srVEg{@XsBeNSO*kEmt{Ly(<)kySm_$oFkTk{!w3s! zH#CD3On(Iusni#Mc6|~ZoiXmd+E3`4YNXHEWL`MME`^IKH@E0ng1FZu!Cply2{N&$ z9P21-QZJ)7U${c(%QC`%dhI$>C7L5+EQe&mOXVFFK18A6UZvu*XhNsb?RHMh_-}J2 zYznn%x{~J@sCLi4l4^QOKZ7nNb(_NS$Aqhf+LKF#k8{!t<=!w)`oYIY6*O&gDiuR7 zqik+6>LS{O(O7hs=9-@_st-;p0s9Ct2iT{TiKH=4XdOmd=6GBM@9x3R)l1+%&F_&Y zjC3h>8|Zi4A6R@I`AsUlAi*W6c1kvP*Jc(4b*!H}uawGm3ZI7INe^QWm2#De*&aM- zvGvDzLb#l2{JUlBoH38I+coDX$7;TrgtxGVM&Mn74UdM^H{+om$w-yLLIaJo$F}#D zQ#ngMN~3jmjRmTWB%h3towAqApeDDlG`My1P)4!(W;Yu_9lnjjhk{#uj6si~2N*21 zRF{@T!`1m->^w-4G6yAf)$-!Gf&$V3BpM$rwQCu^CmgTvwme1zh%25vQATJ5oN-s+ zPz_aN*Ynb&wr=J5n~dlVAx(Hi;NvrdWE{NDpDWJPGx|#q5~7%C&RohD!;-CcG5Hw9b-v72;IA>dSTFe~v@tK;|jSxVJ8OZW%!giff1M(mkaY3Q{}JxltPz$!U7_M}t6 z#XcTK6f(SUFDW$6tkQM1Sa3UDO;BH^z{yM?K6$^;N+}@eRWK`zN1q`Z15eXn5MceA z$LJhEq@fK8Nnr&&>D8P{%!@Mi;kEo5#Ut^L&#rdM*=N4L!$;3_qQthc>B!9~rbsWs zt)BF6NfFZ`9V0_h>TCM;1rPpuldPnY(uI9`yo^EYMpv=@) zfr=VX5j4=jM&Qf5DwJyDOwN20I|0v3Xtb1HjUm=b`%tOm)g+xjbW2}We4+2o6HTm4 zkbf{_@%)dZCU`fa;ECM}QL%Cv@$nC*yfTnK8yIL?D4J=Rvt%4?N&9k@t+1W>yE=N5 zP7moW!cvcn15cT+&|M~6J0uw)o0J`2$eBwKLN7@28mSU4R(fU}V?O5S>u2~72o2l3 zRWzuc_xu5jrbG|StVH%L&!15PQKnH0}*YbZfQLr`}ZXZ~6)3DtgORL@AG~ZmuOS!s)-WzfvC@fL>t# zSMwj!ydm1@qzkN7PJ{=JtLfWGkneQuaC&Crf|%fE(>xaGNia_uW`Fe#Ob9g76T~?3I&=G(h;>eGbr9eD(CD8Y9FSk+t!QS{QPAjV1UpODL^gbVCqrXS` z{l6#OcD{SU*B=nlvTG5);NZBLv^y6qaD%tsMFdQ@2^BIr*LqF2$!$mWyir=Wd#%#P zanepBO@RMH)~|1^L&cpd>7=|SC!<*O3E4>v?Ah|(Nnx^ztqGAJ<~Wm}8Fl#Qog&GmaEl)|XLEEDq{r?es}PSfGjRUV$naTJs$=II$>@VgEoI1RR)|&}g^a+LdqGf6CD2+akvcl1 z!(y6+FC+B)OiP&A?txuj?7U(;Tt8y<#R z;|@BGP`|Y640HVsR<%$3*H#pAAA`6FuC7PD`%Uw}1ESoMj_MZ~K(7X&Q0DYi(`s5C z9S*zKWzJ&jskXdiB<+?Q)U9$LD|tGjbz>>XU4=X)+>~X5W#w6G29t{QXM=PTqTfNz zle?>a?@li$px8{$<*4#<4M4SWdWj{6jSHI@VW7%NZS+4S}t8fvGj&kxUI{ms4c5z#6i0(4Ct)iV>EjaU6@ zy{r`neHAz~ovm#IM(`JgF2Z|R{?EqkuL*EZlzSlEj(X(X=1ap>8t1k@m_J@V3-CcV95pIB(EG?6_J^T6hkJg$n-4QX- zn)l5}GjXsuT{qdLn`RgPrGmq~*+>FM-1{E8t6!h@=&FZzU%OXODQ1jN|DF&1VsVSo zGM3KJJ{h%&U^S()U*mk&6o4=AE2pqaPh8XNG=t>YmzzW~ltSmDuiMoK88rBxBqgJ! zQY~}H>>?%vUvYECDPocgkqJ>g+HG8Wtb_$+fByUXJ)VObu zQy@{gR+gGzUiw7_x@vs)Y`e(!Q#L#X+dZFb=PV3EZaU%dqL%~t^3b29kfEZwq!+2VAJX}X9&<^Oo{5tgY3cv*HZ9AOYfFR#jmq({{ zxn~2`xn#^ZdUOy3qg^|PM08GkJdP!IPx(j0C_aNLLe*P0z(EMtH2{X-sXa(5Ecih4 zl#m8sc*>%#Do0X24M~vAv&05pb&#${H*&83%;BD7AR2<>Rxil^29)B->ZC~t!1obi z?{ea%IKu3{M|Lj!H=I*pebr3o z-TVIk{Rv9v^{)P8$s6>6P=cYZz)U?Fl?f zFqD94LKb>WBo-MNCxiO&&f36sr6wW#Qgr z)uYt}a&du^H2DXE06M~pT5BHNzYjLN;cyZde`go?Ztu62FV&;NIw-BoG8Rce*n_Y?g3tD;KuWaD%n_#V%Ls?*V~IE#+_sq-JF{_I36 zMYC(n?7k3X`+BEJ5JBapx`hHF{*$jswaYLr0;A@44kx!v17*T8o6t)ofW!G@V4Ndn zFbH7vv6JVPO9{^wXQ1~mrs{s4p7%#}-+$!2Upq&InvCy+8F`P8Jo?m4+$3rihws_= z;lW~CrT$%w!OFys-%Uz2NGbfAT$Oh3GF6<(YF`3W}zRO z&>67Oaj$Lb_|fs~ZQjw{qrX_k5}#>B^7DTAaWU%8m&^-t-CgT#6!vh#{FUEJ*2wtu zSeC_vy{#oh$k$+hl|J6LH?-3y%(mB#MA)_CDBwqSa6J`kUrxs34!|%`UwjO-XD80Z6BUh zc2v~VEHCL2H%h%|ey#kC8%IVSA^sN0c>2C<(B-DUR2h!3I1B_MMmsQ=>re0`;{tB; z)gk1C*8Mr-^Q11>oeJK@N0*G+36Ro?h!pW4QAhfd-a?wjaDuFy;7{i$i*A#m2N z3#0)f1f{sne9l?SDZuN5PXD@5ud{7UxaU88CJLy${0SiNZj%|V6N7N9^_zeo%lYQw zDw%QuI2Yt?k-xsW?6pQ7jGD0&JUOhpqv;F`383@dMuNnc8Jnc$?)Ndkw=cr8`1a@_ z6ng$f%Bh$cNnv_4fQU|vej5p^)W#`RAvIPX0T((>_c8`qzsm=(NX8t*!-DQtaIx`r z1=O|bQQ{N%cWpReBLp0M`sYz<#OMsMHLpxf3k$GvT>4ZaJBp(3z0hp+pg0HBPbfP& z{J5YxQsK(`ocLnCL;%0Z^uUFqZ?9u1zG-PI;3;cc_M&5=5n*lKH&+{`i|URut&WH3 zgL}2UDwpX?O>`W07QPZG1%z7`djq=GkJCno=7dM2NuK-C!>DCO_hPmLuRX|nYtxPi z`-^r&2U}7xfvy+ZuOmMVBWt^trefbVBy(o&EFLTZbMtzK+Y7M(GTBLVL0;qeZqbgz$y`-wCg7=i3U17}Ru4fK!ExHW zNDisd&#Y*+560~s=cYxGmpVEcm(Rt&=*AP%+%~oL{~$Cs0bO&(`FMb&00~V#)Eu+T zZ3HsOjtQ~pm}QdpU0%Nkaj9yQsUD_BMWcz96MZkI$NA84D9u>TNGf31T03aY%!Olz zqH!p&WVByNV?BDQvoCwYE~FCR_gx;?7Z3G=N`FhPi8gN*6e6WyI+nJlg}ET^)ID1i zps(cJ+ON3v!I^!ObM*a4IS*Q$e@np#KTlGZ=l5?0lmdfV9|nu@o`|M}#>ca;F)r(v zJi%!aqFaoqPK>Ls%<8eSEsTFq(JKTvl*H9{?Gx!(T)*FAQM^aDm}D8={*(~WJwtV{ z&Q2#6FyvO6+7;DJv@*vAF)0%CC_r@0afmU+*XMMW{=&K<+!APe36d+NbM$>S5JKF0 z>eXD-O9s^L`4g!XN?`U|8kFo7maq96^C&(ZTdwW;UE$KnRCyLMUfXKZC>&ZXfHR0D zc$cg2TafLY+Up3mbTUF+F&3&&kG#*|3j6lvIK@Vbzk|P6n&YaGn2|#^=d?kDXZ^(S zXnc#lGVaY@?}AL>`4Io(1d{sLMfq@pwy4!jKU|$FcK|{1f5v2TBtQ@k$+SM$`fw83vzcxCXO$!YNG3)eN;A zaD>e(>zD5|_|LYre~n+wYEe#3@~^zvL5HQtLk%Q8E}v&#;do*52I+ToJiV3>x9K`u z-~CdzJAM9n+8WjeY6mEGMlv0*ObM8kv&A@oCj5|`E-JtCpy9--<3~`qT9I@SyN6WW z_N=D?J)C<9i>N={8L*55e!Y!1lHl%b6&DfbcwmQd3lY_g}*!N5^qd>R$}Ab~ja zMG<*Ifo_6KEq-tO2eYV9JE|1C)2C#xl%Pc4=R^e9&1SX@*eb{2F~v zJ1X2yJwMzVpPT)cq&eTJY825l^LMof(nf;k!&7$&vs=t{QTd2RE6DTKes=cJWBnui zX2a-eF?sA>!>r6aX4W(B$s<(wA?B5R37if-^z4USnJt$sq>8--toxe2;Uy2CjW!%s zpp;!=H}E726E^r?4Mn<0wdke7q-P4Pyy|pcN2e@5w`(f{&&KQ>@^_Puc(@J5eCYgo z&(X3YJd48B=Ww)ZO0`jNMT3RVS2#ft`;Y&L-waeVG1mwLGvL`n0u zDYI&*z(@7`u41N*asS0TtsINLDYA}VSBCP>d-M;yrH9WAqlK+AT*v9hC!^wypp|&e zoJ`p%7#~D|^J@Mgrg}C&F7y?xgf=yfx$MUNeljm|qfN*|`XnUM9Fwl#RiNOYH5OEC zrUV9s5oI7X+B%!dhcb^a2P`?lxLvz&_ypPISX*Zc3`&eX$?bvxaQiLv;Rk(vwd_mI z5c;a{P58fb+T6wL>#Vg8_%85W&SoQLDY>{sX+(uuf3yZ_bZXQa(W6Kp@uF^3D1Z6BZAXp) zd^bFv+pkM4Z)*}q-ta(4NkF~#e-V(Ps_!UhK)QG!hweV-C&AWSmteZX6C({$ABYmG z#|%C9scV|YpCrkpBDAj83R;$=F7OwcoR^_>=HKIos1 z#$E11iU?yObcG`Iz48j5*qdV?ZgKXVC>LrFN#Hmy3~lSKLA8($NXo>lcFX&KXvJsR zLyafO>ggZJ&S4&d`e(U0D#jP1Bl}Dz#(o4h8#L=1>bVKUCGb>N!fLIa2FRY>Oax2vR)F)VS3E(1&ica4ec6RxoZx(sp zA0Q#QL@I?mj|bi(>Kh(Hl5rrmN3WWqINzFPN&s6mM9WSNAJn`*8+k$sl~9nz&mH8k ziTPlMy5Bezm$R;Kn9mQh#*x?}@w-lOzw% zGLP`lD)4PE*UkQE1Ba2j$Vb|_oG`r`8HoqNkrxa}9^SGCD#g0z;DbJEfgtQ{IG1Ej z^4#g>z@{mL=)8jtIrT0UJ=aZ>)!l(Gp=$EQ)m0g=04D#4br+1?fU*BMHa(i(;;sTU z-SfKhvP-8G8cfhwxc%+I_M!I4fc4~kSOIB6(#Y9w^flRy3+BuIOP(!FHXxq&tcq-i ziXsckaP$X)8)brv#>LxCY5=+LI8FjH3-fe!V(?+Ey>PwMJQ`n1xewD*_7*5S{z)?Q zChaon^87OP&wB!JD{X^??SDjq;(y%=AfN8%=a4?j^H^y;#l!w2`}BkX1iYSBfWKK^ z0oK>X!rcGhDQ2%RP=Zb&+Wi4_Q@Z(f1gPxxaq7Wx54ip(afNXhx z<=54e36=E-91m920rn}9+)2sNhXy3^0&eH}khrVfjoz_Wz-6!M64`cu{p!CS?~aov zKt+397{PQR3IM1#(6YR`_8-ZGy{b2mWC+%gVZC;Wl-dbH@RMFRfB<^{+ZzwUR6SMG ztfyT;4*k!m|EvfH-YJj@3;?_X5`05vy@m3N(;#Gt{+2*qB^NLo9D#xMH^AH1)#8uT z1k#PfUX32aOyFxoQ3clXfw%x%cque|BZgM?hD&#tbS;p5H;Cr~Y6qe`*h+*?xt-OQ4J^ zt~<)+fD{IL%iDI68H%M!*%pc9(CjUFA(=Tr7iHU!6z*b{2XE+q%+^TD?y$Q`Gz1$z zoR5VovPOiu*f7c$V+ib(|SQ7Q@JsG|J3#pa3no5HLP6W-pk6NJTD6&KYZ%+r?z$klNpPxpA| z;zaWZCodx|cQH%Y^yWv=S#d<0ld#Ih_YI_~1x`EJm zPGn6Ju6UnvLx2jjKbT#2(Kfx!^$D9<#t3l5_?#-r9lABb={xws!qb*nsT+)~3O^Ir z>YUvc9@rkNYGPE)1EQkCDDZ{DxB)|Msrk*RzXNYl)KAAU<*>3FCl(V%`HgTkSyd;o z|2OjNrCE*pVAoM=Q?KY&>;kE+?a+n~o-koo{IVe2F3-R1{8Im`7GZ_dVnmDM=;zW* zaKnve7DbI1~b2U#J5k zz|1_1cr{6AQ+Z%)ogQcTh-vlzlcC#sw>Pje+y8@ipk44{9x*wy7>z04$7N+HaZdc8 z2eF4*W4$Rt7n0%~^F?>9Z{cn%8rwa6A)=?2W1J zp|G-Z4!+L@;crZ^_47q0HI}8`m6%Uzj6)c3mk-FT07?Q>H(1o2WngZ`%GEKYgf*w3D*jt39vcC{!eOPl65`cd&I1w$2?uc9^W_Gtvmk`%oBXw&i^y3^-VgA*OHG_P z4-_MaEASD)Ym{uC8V8=l_26pP-P_&iM_Ohyu|y>vtuIf68GRXWCkEH%W-ZwPRA$?h z8>GOQgYZG;98*c&yZeKTT3u;~fgEVIp&%hxaE;bbYw z)6nwk^2Q&H=V2pY`H*6m=a0{=DrpAx<5-HKg}#num+eIgNP`74Zbf{m&`5~wdYK<~ z0OuaH>G-`!KE7gs()J9WK-iv+pUy=pR9_e;#c-MKX>-<{_jol-8%BmSm-9yr{s;!d z3z;}0*5n|b53|J7qIT5DYF;rN16ZR>V2TcIzqvT_fOOF?%le8_uJI#Kr|joGve?v* zf*%zAM}F}?zS(w$q-e0?aG-xGRkKsxjF#iC+wGOjs2qjjAjK zH3$Bd6rm2E{$c|BN9&yE7uMRYr`>?#T=@=goTW>H(UH2087vPtZE_0zfU>@0wZ#PG zOw^GFVQa>tF>L`}!$jV5iJ|a(AKU9V&Fr^_8>nyKXi^jLDpvZ=++<4XU(~Am`4L&_ z((<@}S=|H{Eu-+8w5YawuPoDu#N2s6Wb|msMRx>XOP)EOO6(oWf%AqT3CbY=e|_fw z{#3)QT9yVr(Z% z7qupy{*U{z)46lyp)NdeAQ}4;aJv_~M2z4Hwt4vG|yJF*fA zo&b`^q2&D$(?wSKBMxXH6BD6tq!cs_xB!GOZc)NA}Wt<<@z?qQ-$<5psU|lE&U^EC70ZV2Slp zw*m7W&i-H?bKhDMejK*chk4FQX*2ei!9n86?Z%PB0;2%cH)u493suJUK~qkqfF}d+ z>jGmQui2qftjyBF<*&Hqd3e z^rPI3d2(nSUm3W6{0o}Vuj|g|q$|oGu2mR2^nJEdkZv79q=hki`(8TDBIPJ+L?W%# z$k%A`B1x8{)#G0Htymko&L$}@U8T%>e3qH;S*7_RTZJ~9SxR;J(<4!b7;+YtK`ScO zByblbiSo{9Th?T2ZX;nCmqwAlj!4`mcFQ>>OsgbUTjBHyH5_gGe7VOahM2TG7|9df zccW*9)V*4o3EJoyrTS2faMj%Q4^x(PLf^e=STUv`LGt_`&7YkWYCg|BDJYy3NO+bf zps@*Gj#Ofiv6q2&cD#@YGpwB7-AO%CG+H!S+-m%ep3(e<%TgEzN6`j<`#wu}?j55b z0pdODGowbMX@d(Zszv=pRL9>SvaN-dOGE;@7PtH zX9&=Ar5(3Miw`;U9&^zx@bH9(RO>`}uun`PCLS4pDy?^Ri*$MT>!N%`v2aQUrzLro zTE*Yn$plyP4q|2`2n@sL0E$EZvJjF(wD0f3DTEXW*}&*+gK={ly`LF!J1BPtFVlXu z?I%enADr1gLIaB>G;Z4e)%wm4;?!R zbc7tZ#ro*ark;{R2nZi2^gv(1iB0Js8Hb}&dil-n?*-wiVFx^T!qcI1^NYG=`#D`` z4A+(IZNBALy9+%raSi=WkZw(H&&9X?TzMX=9c?zlNJfL@Rox*=@Zs>*MfX#J^AM)j z)k50+x5jh!0E7E#!bzBuFo;ffJkAjlA8p-T&c8?f_Ng|z5vpJlq9518WgtU{o6bw! z|FnwBFlb9HYCL*>Oh(v7&8C;w(Fn)o*BXxs<;v~XN6Rxyr!zgToPwz{-d79t_>pgn z0C707%?5su?4*bbAnN)sts2{8zSRDz^{I!;MMDF}`0)GkYyfvr2+I$p3{|{daXRjA zwQBO_+IK599Z3AWl#HS+*cN+%WNi4ii_RUS+@j$)ten}>J2HtmMr40>BZcGL`R1&4 z@l15Zb3_^%nFAKCP`lP3x%H;Jz{6hQrEp8db+vffb1k1;ClqsjCENPYhLil5Du1W& z71Yh@)zy1h?%cv;($re#a(VGPShD^0KMz;WI*=CcclD-XRYqzVnxye9GFcVPGrU4= zV5XL*?~^57+2I7HNqxg^i|3Y>Jh#nP*5&Hi28l0)E%AV1m6_CkoFR(T`XQ}yM#eKz z4i36Q)Nuscvs)Mb5RVIOA3)W}dWf8(+d4;|MUAKn3dl+7e|lh!16sg`wLfA&jtBTv zhGoubOTfFppqvU2$Vib>8*yH4vRum>{*QwIyk{hdYx}MCb4WOd^d(pBY;Vs;)fFn_ zz`)?TKyR00h)PMztF5yIp^!JA2Lmv}mA-+knLDr|_}R-e^_ zs$?mk$lU$vX(2zWr2fK&wX8@{Hui|z=P}@V)<~{kh)@dEEj-XuqbQ@q3f^TSv z9Fbb52R811HnssscL=bJmjEJR-mxyS%2<*`CWUSp?M@9K0fvo(C~aQR*9+ zy-^(Zo;j&S;^k}m>&3ScngK-|$M~o%hCNW&o%M6P`zZ;Cbm|jxHxo?GWn{_l1S~Dj zG#(GXFQtOmO%L!{0`H8Buq zM^$!awQA`9U}%3LqE6|L$V;Nq&MV zFLHu-b78m>Tzm~isL|`%p#u3D+)B~P@*?c^D5F2)O(*i94R6ocEf+tx1X5p@#$Na> z{q@q#&&OV_?yxfcoc)Z6yusjfnO$WdEdC*AM#ll7^HQGKx9n_u39{qd!&K29;FGTq zQ_ncq2L4?Rqjvr=?-Fw(i2apsCZy$~8AGCbKjBk`rL&cxI?GXQWotJIQCRUrDyX8= zOq4nQVWYIU)rJkHVva8ozwUoMqVLKg&wSYCYGg3Dz@9{PIr`>QXzdua^IhTR`9~+o zMr<~{Ng|;}4xi+%y6q9xXr#zmY$nUuv-pl0le(Sbz}8zUrwlptM;n^Euyk3EmHBc zi@y=Iz2?}D&#s^UtGk|rXs>oWL|r-Gi5m2HzX&R?MF1)BEL8c!QS9DM%CX33-6%Xs z{jP>Qr8vbF3%}0!9>hwCiL@)^a-O7Ig6~>5RVp1%hUEKC!nW`Am~=a+WD4_(+sq?9EAZRWuR8GZCG2TmAjT5h;8ygn z^W*wvakSsqaIC(@BuUt}C+ek&N{$(qJR`Wfz!uT|7I0r|n!0b{JV`+I;Qh{2Kz_|M zC5-NwpMrb@=}T23T+PSaY-={|Cujag9%pud8p z^dDwjG6ClusJvDv6FL}P<00GLlE(HKnO{U#J}3^%Oy`nxNdZGJ=K9DcS`{#-ihI9N;Q~2uT%WvSIT+W25c+Go4_r0 zhT%(*W3E%aJ{K=cjTu1 zggZRL$J?u!f6qtXJ{H28TUGMkd-%OQJ_UK1hktQq_V38#&YPtuU``UeLz9_2nei8} zodS(SrX;2wQa-62o*7OLZ_Z4^?W|H5}IBPXC*G!V5eScWPZy2-wsH7vr-B886OGE;63u^ zW$x9-f8O9p-GKE#91hTc=9se&ao|&-)E3CS&Sm*u4$gpFQEE(`VpU6XM@7mZyyT$e z_8SLHVmqlPDe9SDW((Z88#oa3XTN-oCv5ucVplc|R&6W%4iUTIBnR=!J8S>yYMfp* zkA?eb0P{oGaY-O)UsB<2cknc0Gz#o1ps47BIOECN;1YKwM#8X3yPA$37tBRe1L_dV z(P}A7DkY^7X=_3U6&Zeq?r*vukJE&haR)o2!Pin#cF8V^eyi^jM!Wd|B~Q3+yj6y} z%}rC%Ml-aGLN&o%0(%sK%jX=7ib8jBjQJ~35O_1FpzR%!N>iUbeK=(P6O>*!UaoV- z`#XC%Q|T!%y!(()rP(mm<*G&p)4P|e@#_l@;OM|VMOc>Vm8#v)xf?wop`!;RmvzW$ z*K?I8`cMg`o_`&I#p>I^nH0VM*%CzrKF+ya|PRpaqT zX1HIMzxPUfDTO@^Mw0RXy`Hz8o+BU_G^6m$ykPEIqT%mFfyFf=;|q7F(FBYUx)1Yo zu{+GO(-1@vmB=WJ1q@~B{6q>?j|~cSBuV_cy#UB~&MOY4oR%huY1_!Wu=>l>J7uj$D`S3N#~t1fP~ha3n1Q2?9W zVqL4E{F%4<%diRDb-zN_u{sz`}@uVyUD#&*1VH-2W#1Jk2=+aFM` zpmCgReR$4i6Wou2J^a-Nn?-Olsq0P!N-GEAX5%CG^vV#qW_{2vB~-|u%-na`<+H(Y zg}51Ou5Rs~oG`yTH#u2`0?kQ544eCA@3={YFHh1$s^Pqd1<@@@z`*7?Iv8!ZjC`&FnYoF z%SmNYS}jxC@rne?hFoF8OSmfiy+1zRt(oBtCiOA#<0y!x3I>n|uKP)(_9nczc#b_D zkQ7L1cm2S@vOTMcd3_(Ed~-lU-wd7l(nEhpRrIjsN4GZnZF>pdFY8Oxu?swKTK7i% zE`&?M>KT2Cm;VdIVQXK!Ix9_bbTXUo^yCT^{dfOOSv~d%?BdY0s_5auC+FYwmuQ9n z7x*0*J=oc>G&)DE_eFkkf^iwTycRj{+SaOVlM^;VWoZll+v~3HdA}I7ZqieKiG#zB zF^gl{{l@WY4gBO*ORl+Og)tkfjj~p7eeC=S0BloHaCd*L5II5 zv`jA!;P1Eu?X`7458Z+kM;a}A()|OiX)}BIqW*Ly&WyL1nbB%_O!AgN(d6=COz&7Q z$V0fFR7m8cE@kJ4tsKr`7eDsy8^z5x)GU7nx&(iAS||YIEh~71B~H6mjkipYhif5z zO1Th66bQp)eqB6YUaK^w{h(DN6J=mM2+d5Rt%IL|o$V`})X!K$A3Dril{HAtHzf+E zX65=jz40YXHLHWHR{j>x@=rxJ04RX3?@Z*~{gn2h*~nFg3hu9BMdkOLUNcg!>-v@2 zV{Q98d=qRWR4Y@_@cB*IBe5|}T4g@FEKgKaQ6sHORZD~rQ5@p6_UaGE1UdjX)qA~uO zT`O<+BPMDfKewc2v&4<9G_$v>w4JfFBJ2|JGO}N~$1wx=#9jwCV3wqB8uU5qB?+%yIqaPha<_-x_i zF_okDg_+S)k_bZ`wfVner^+V4zCm4XAP9J4&WbA+7;BJ8YszWahz#d0#`0p54}ZgF z(U2@scL+1lqDg;kvaFA1_j$R4otT3l(*R2-E|iUq)jTXQNQanmR8{m1FVW!HN-XU) zsd*qLKA#gbKpOrX4q|9KmOA+o5cPOgDv45%ug#2-3M3xpZnfaVd9-+j}Q1j>D@-H;jg z1KVPENR0t`xT|UnHspc$K&NiUNwGc9^#t~t+iCjbC%BxWC!o$9yQtlH^Eu9bnK9vx z%83@SyY(nBt{=MIJ&4!}y+RVbNL5)@M>_V37}G zQ-Qt;PBdQ7Dyw-_~A|XKv`}X({O2& zomBqMRdTMepiF~@cl}jmJ_3Z1)tEA(j0cUY{VPl^R+7*~jJl51XY6J&1`ho)Wen5a zU4L>aM3XwqXCr-&ortqBRrauUaF5{fRQ)7X`uM@8E}JkJDuz^FDQOQb!6mEZ1U$+6A#rPMt;` z&-TFu9){;Y#8$Z60s7_LqQ0bS3J@Vsj|ftb`dayb#=uMsq?Byzi;c*r2fVvE&bEF( zCf`>KEuf*cPAdnw?BtZViP2+u1FU!#U2;wIUa0^^>VAU%_vY^g{3g?IwN4)gQi;9| zhl}WzmEBN4&hVW4J;}b_!Y30BE`N?=WF4Y~Hz}eUW0l22EoV&~4hm>qi;aG9mUbb6 zdm$DoEMrf7mQjU@2@k&~#=vi;uvy9=MG<_0JIQcCIEh1#nKuqxT_2@+2}xwK-u5PR zberXDQ>4q=+YcMlqMIsh{UKY5nPX%sl@LHW9TWI~#i6pY${%!We-;pDG1t-EvXYJ8 z*(#xm*ZF#+%*BKri?&OA64^bzkAmxyDqh%H=H3pQ{YP9jDHAUOVnC_CrYGS13T=)w zV`VvgYP+|`g?;o}`Lf&2mzJ(*M3}=JZLx@G9y=A#pZ?)OiOr(vyuEV3w_@9Df0JiO zU4{(UEd{iziXeR)a~uuWcRXZluXZxgwWaRvIUk+bl**b~qul_8neW;9%*sPuk7p#N zgUec&YX}fw9IQ#2{Loiqw5|-;~sF%K%=QEpf-<%q}FuTSs}51K>RwutSp9M64|H zgUidqO`Yb@xz}@CTg}Pj4d}Q-o2ac56%@BnP}K^mrzRiYu0#{=Np z&E6HS`o7S(C@GkswVy;8L{-*0V{H+P>d(!vX%EwHQm9nyAAP?4c+}Q7*b(o; z7dvBktISjTxxq+4H`mm`_!YBA1~JZ`SNI@c$W)yH~27iZ5ktwEhyGGtd4tyIC0pM-DavwWg&6 z0fDRAYpj8A`XQ@6vAn!K`S-Cdyp9TOw1GJTGzMi`ZDTSL`s{J*HQ$(N-E{9DuYzyoM*jaaUi(uObQ z?GqDu=Dn?o?sK^e^6(uGHRPM^HE0XeFipW_+h=M>X7-lg*B3fzFX9L}QYCf$V%f1>&@?$QkPJ@M>z zy!4YTxmG`@_jsf9-Ms4~=(oiKO-JCZa()VqZ5Tc7BmzD&B-d#j5W|K)d6kTR>1+aI zw*K>+KR$J0dwv`+HL#zr^`GFR5r~UXKCv+ZI9++S@0)XSK)vjAx-T7$e4G=3Q32c7 zZZw$~0vEg{iy^QLPAw;7Oq<+vatpTCJ#sOf;Bvq96i>&Msr%yiA+#$-&d<1{@sl0! zH@aFvxm>$d+{P16KUZ$MUYSVeMR^?u9~{C$>e9C>P@k4a98I1p}rPOWR9OabkN)+?w z2a7t4?c3<~;2`~&4KLa!`-8+agQBQu9DEL4qe1rr0rP0l^V2maFwf9RM9f)r z2X;1Hhv(cewEdFnt}()I(fBkmE(q+BH?P6QQz^&HUek5sC;2$o0q65iIvN zXltEo2(1qpdlf-6V#AW|uLU;3!&^00{=*Q$@W^|$P0+8os}kSH?vP72Z#rk^G{4U9 z0tQq4RK{0!04OAmya^^Ndj&Q)?+s$(TwLy#Uza;et2*r_`?4{m)W^ zV5}*y)5p%^cH`?uW@SL6Zyv$TXBPGDWaB1_Dy!-X?v&eKFU?9;Hqu$?s-g^FGeQxh z+MV!>urTeaF(+lIQbS@!l&4+kT-G8uHJB_v=YvJ!rgZ4TSu1G|NxKABddG{L>FI`D z^HQdmWxjiRvG3i6sqs%8PHci0s!Z1Qx(mkwEBcsmSn~}&Tq4XH+cLBau356#_`zzN zJ*s;qk&5DupXYERc184B9RofgZu+OD?PsF?!18p8pa%!Gp;K$g6Z;sjsJ6FdQBwWd z{;jvY_n>eTAEt!{?lM&6RE@bB*3WG7npTF)-yxE~CQ?&B zTk;CH<8znK5*dePlsS0!n=55Xw@CW5w5hyRu3_J%hc>wTkQT5i(LTdyi{lU875({G z4N;))`D};DPADu=5!?ir$|=dTATlh&1@8uj~va$uvZn1ubF7}`)i8u08o`AtH)8B9YIzH!r4!6|~7-x^gDeeh( zP!>l~?*<XX?C%(@%LRz-H#6J)Z;{P`))O@uUZP0wn?gR^BGI62UJQEiVr>G zq4$=bmMo&9pqr~K|A_rio}PMcM?_6_y@kl5=zSG01!ZcK!6bDc19>UyU;6BcB^bD6wXnQ>v=2Wb#Yb zknm>BJ_u|dHq|eCllJwtI^9!3s~c($&gm_EOw%rR8rTc3!I4q2n++}0_3zN5m-^}-CCFmc0@lq>%SMn?X zlPR$VGiRDr!WyH>(c^gWwDlKwieJ)odx+dWfDZ3@*^G7lciC^c%jdsFwgdM4qs}y+ z!x+b*11y8O#rBx)Ot61>0IRzt`%4k!(_G#phM#s-_y!Ed<1oV+#lX&(R`#3%ZGr>L zolOT7f4`|Zn6Bacsg*z&%!Pfhs^g%1+(QrAkCwlmMkB6)tuJo!cvx4OZ4J=R*=C43 zBg;LUyCMJfo9%tx5AOA`n)m17WtgxRy5HXCSD?&wHZ9hA13r&M5)Entpk_}eY^m}v zp~99Qa;|;dXlO15JH|V|0(EQu-AhGZaDAsYU7SR`40mD6xZsE#wm!CM;8H!)2|zHe9?Id#*3`hhdfVsPI11cHEZc;qk;wNd15{EGVXl57?@gE zeJ7S`uPjZKWB#8ZF!)69%ZE6Jo`MjQVNfA{l$VkuQ!DDSR}Y?}KxrcPlTP(9w2w2) zjT-#x;&OTxPGB4g045lX@1Bp^3~&0}S|58~ z5n|G99}A;iHlFahc+IX6cYfWECqR*)9udgaRBronjdQCD876Q_>XunzfM7;|Nw2u@ zB*b=*rX8GUB4sxrygQgFgq6w4%hzJw$4yjbNT-9YtIjvBlM~lT)*DtmIexpzfRhma{EmHa`){R{>P+=p*q3*14H8x zm90Vo(5a{D{L(`XtoRE&DA|mlA>HRS(xvgA&+Zc@hLUb!16hT2AU_U2Q<{?%2T_jh z8vIEx5ht!?>uQGAMzIKLPA{B=^Ns;bqIO0|OPWrcAgZ;NNj4cTT0uuVgH<=xtC*rS ztQCKq-la%{7cpe3u7_D}@-lAt%{zcM!rZ>eW(HL`3UG{AGCsF)dUg>JvrKf`t`J9+ zB&RP{k?!}s7b|OhHM#R?>+MEbQL}WZ1@bylb=0~$xsytHUIxw*MIXLZ&jp~{bbbVW zt_lG4ut}2<6XW3n!IRt{MsrOst2z|vM{QcQt}XbIdS0aVek+S=OABCH-*r^{@N4$z z(0rWKQvy$&J}$F)qB}a6nIB2tj($ws;x7yVt5T;y&}H0UcvD#-oGWtSgG~=p_;b?b z!VzEm7tSMwH3Kv__nRWknKWvCs2s1ZxZciIOBd%UH0c#!((IYEK)xyK@dnYVEm7Sw z%xHyth1E||rQe7Nfb#|OKM)}-`3PpS9FUy1LKPArKPf{KlBLk$FckO3x}$mUAgoo& zu$6uVdmOtxl|ifG>%k@ovgJ>8X|PXc6Y0sMrKK?;9?|fRc3Ou>e2rUj#5E&wzBM<) zShL4hu-QnKa4rI1zo#RE1ARgHn~S z)vP8bN^6qtMuATazKHRaXB4gYriBOyYJ3`CfH;a=l@PCz$gzj>;oeVurB(eEuPPW= z5TH)sXs#3E1aUo<%E#icxymNYxpJqM3Q)qdnWG##D@QB-uAw-XrhNnvfs)ZW?E8{A z%Sb6as5h3iYx&_Y^YXxU3_O$3_z_GNYs%BN!B=N=N+ruyK7P@k>T)7N9l%`^USpw?`*A zC~<+>A8Ws;El}lrR()ng^dB#C>OxR6PiU@_qhD))_dyS?y#KhUKa0%N-q!;6FB=Ji z8O6OnTqz)3>_5>k(BfC+eAh;6KJcHMO5|9pqyiWI<2nw}B17rcs$~AG1V@xi;jMIw zeQyig{jdUrakks!QINksmc?@`RW-#J*T2e(UvT$ePWf z8)cq6aobo^An?;hM9Q#IYEe!5qkO8GynU5s0E^~y62K1o>IQVanS!0bV0KCg=}L&ozXz^>_xw}5S3x;$xQgDOfEN2Dv#`Q3n*1TR;=J;{f9 z8GqHW?)AtI*XLf4`Ir3J$z!&+`vf`&#te~cR6UUvbP<~4ubNxl84XY_^aT!nO(Jzi zx{T_fQ;Z6_oA<${8~1=UX4Y|^PX#osdW))4hsQOf(vQ^u3r68>F?yxPULrEX!ixj_ zC~hG74~aVJ?->!wtTCP4~Qw{{P1jgK(+^RGw^k{kNv3PPt!VRWlf;= zBE`Q^^^eQX*AhW%TMu^*oT-^3+z%z|gJ*UvF`yFHB#cd2yAM<>9ZSAsu4jw~u zISeKPPXvSIZ|DziI{c|}Sp_`nOS?TNo{m?i0>?mYRD1pr{W8w73jNwutn?3Qll%B$i5{CsO_5 z(`KDJ(({5T@<=)@JDS49$oNTlgAJWu7_YB&FsjUx0hXRG`KKr>yofpceK!Anszf6( zgOI5pPlBCQ)RVa!G7Mg?0?5o|cQ&v(0@ZPP0BgqW4OZDKBmW%cR5;i{TW?o1Rr(Ec zq&R^#wkw8d^8T{b@w!rxK^~r-j+gF@`RAvnm(GwScSfsn46Zveto|4qTJ(kOuk3>U zJ_i+St3dToAt{1Hsyu}Y9bu67#e(VPQwp8jm)(~Kevp3#AB4@dDn}X$OjXg@d)aDE z#;=Jyxz_*BL_if)!IEtG8gu{G&grRLuBlGP&*yPvDxP(hZVuoOAB8T)*pgUFV!zlDEliukruo z-hU_4a`)f#iLbF}N2b}m8&eqazX&9WM-)1hTQbjdTaQH|`ssh6#ID?Va>!=v&2!8k zp<%C)QUErAPncERCRXF9U3;lVj7VzZssAMrkxn4eh~2L}KWbb&)FZ9GaP%Rk4EgcL zpe+Fg3=mi8V<)p8yzEAFW!kSo;!ogM{+W}^f5|_)$|YN)N}pEk`)yS6oynTR!I8?Q zAAlZ11HN?^3^;I)07S(BXB%3#s`&M#6YIV_|G*0}cwrZWE`oI<$KgFz7eJKJ2Vk)= zmeXVhG1B^%>>vt4S7%8=R8gjJ!{4*;Fr!npJw5{@VZa$Ga7_yO9!6Zv^#2ytO{XV)kf-01IOGTL5M^JSoH1jGGnp@ly9~ZfD`LGT0&(57|B?^ z*-aaA3V&f_1a#?Da4@Y!4+t0^SJY}-w3QAWC|i!o;#iMXgm4oCN*Q*WpgzECi(|BW z4Y({@Zn~;jn83K!eQMJ5C9_32)>2K&RoS0dA7?(}S^3lN1O*02*!!(aKrXW^?e;Kr z8JAp_RmM;*&7BUu)qBQTZJdy~N7+-D|5{R>MR^@v+~~?rj%>HDxKm zVX(48{vU6f(QWc}-vTq7KtB1Mh3ePj zn*SX(%p@_XE%bwsdemkskPdE&Y)1Z=m|kb~r!~I&aAP!C?(|!dZFdZ<7GsOo zpoZwE9X#r__wkC~thI^HRg#25&T~Cbfkr2Hy@45TEVihIX&i|w!kzE1_9+yn616?x zEc?qXK?G=`Lh(!W8_86KfBWRvC*D~W9TZKB$Wi9q`sKCsIRY+O0RUfX!piMcbnBiZ z6@*7X;4|$`dOnY;B1gWuX(a|f{yHG8Z9jN_kwEs&#YP#4dAfR3mG5(2WJ(ncjCe+Wm z(pPVOXX(c7FRWEJg@+#Wth(lT*m`6hJTw!Ndc^Izd?4Tiu;$N0mDfQsDFdzoMsL>8 zaU@-K_$4I5AcHmh$gxyaSPinR?92jSqho5zMuHD;SLzI}|BfHPci@Uh9B=)M7VeC? zOrHvsQI{j*s14?z-RC^z*V2Bz0g?>NEG*}9$ z&!5P7sTk(t5VgA}kD-`gs1uicxM??6_D7$q#mt=(RTmqo7^^$xC9Uf)I(Op?VzC#R zfoo+$gNsc&M8mbtZC!-N(AwK^Q3@aMj;$k`IH27h?N@k6(6oR@Gl`)u2@4T5FF$i8 z3!%-l-$|R~M`>B5~1XdM5FS8{S#!0Gr%!u4^7i%YI1gTi^b zoYB7u2aD|?W7+Z4c$i=-zeOWO|DdKfn3W8YdYw%?j_PLn?44!ps8+={-h;)oCrP#T zydaZPlHYe#o98;naiBh`s^eVI>0SfWs2bhqYdj$){35w|9Ig&=HOMh&ai811@zsWr z`|3|$_+avAMpyJ)j=WHYAjNO5azjUSTbf8YG}BHsM01QuK~3&F8!E%Y~6{?mj<8a^7>$Ckc>W*gFA#+IXd#0!)%qVZM4aO%*hY zM?Rdrs`O*M66!4oMXC2Q{YJ~CXVR`W{u;ZMyZMR#H`oDj#Z1_<-y7t=<`6F)E2DI7l=o8FOvFgY zvrc*}t-8CKldJcUz%V(nD}n&S6DHQ`_$n{-MZ;s1l-H9=QW4A+IT}0}Mr;b$ChGkf zjOv8D3%-@*l{{?*(~=L5$pdf} ze?}f))N%yZuu18?wpGFz8%pmD1wH-3reS6=G`oR1{5*?Q zUG1yolppI({XH;8GV3W%z&-KMmT;K9K-0GCN9ySwDvxw|0^2?=&x0_;B=Zr4g(I&a zX7NQHOjs4kz!NBGE+wVpb5iH%wT`#gVIJP(NIrSKx}eoYEcmxiN6A6aAJ@U?iWAKW zW)@su^z`eYfOsJ*MOXB0(LEu9Ki-uO`u48e56d6;^vqaZ2iLcVVh7XAGyw$c`(FP? z)e|?&M+O+TYv`A<|AaS|LH zeCAd-AYoaafR2?x6LR|o5@Oeae0bXU5};m^KrF1LOvv=C2Qt=s5tt?gR4d@-F@xzv zrnHR%%MkQvY5WeAEMt^UY#OEyLGoM?tvpqY*ND_~HY{O1Ygmx|0yz z%^U;MLLD;hu1tbw0*c}!h3o^`5^MvifKO#uC;Yhk;g6+;S{D?g;Ex3@LZ1Z-Fn{Q+^cA|VDM<*LV6?-8B5LqCt5X$}Avl^y}TORb1v28{7{4|_f;ohji1z8`dQ!0oM zJ9bmSn9&HaJAE%wC9m_BM2gE|0)%k)JC4W7H#8WDI`|qapdN+xuqIZA+=%P7DIt$E<_Ke%5-$N|$MNh6J5(szE z0V!9HU#l20c08Fa(d%U`k&OcNs9rBsJc5}jBu5*FWx;#-(^QJx!V%FrVvl0p72#HR zSU#<2cqb#6ZR62CW{5S&$Ff%DZhvZ4K1fv1ATqkGQVyb(s;@49HJ@ZvM=~$a@=Pq% z3rgDi`rGj6(6X@7(U(XJ>GeHBQhRhwJj)kv@geROFH(V%#~JRo((vY44#3VP$9B85aAVlH+VFv+z2+&3&YZhayo*G+Q|{(}_66TVGs-)!Z~H z=g5t*8jLWEr0_lG%)C?f@R`7btFL*ipw%v6z8t~eCFe5?i510**MVbz8h}f<#tOQs z#nH~6eFxju!-Jwf2j;cth|z4E;nvE50T|68?o7@?MJxvG;U*U1`0ktEURwn^W{5j@ z%(VCn>4|=#INSZ6l82$$?vF9$Vg{Kep1q>q#vr;8Mx$<;0L?K1S>=HwT5Xx=D5HNb zmrg7d>4xj^nvXcdFt4^JWo2h!;Ihy6Y*bkG>WN)Mq|ZE+VoqnV9gW}#=D1Z6YL>C~ zy*jbePtFsN#y4tu{l+4^_GVBuGt1z38)Lp!PzXbWv7=A5J=|uhG%?DBq0u@u8wX!G z=5V$gw%q^9B%O+>?o83)b?TlImpYn@cy;`yNcF$iY|loocwaf?_{8W<=oBlm#Qc(i zbKrMu|5o-6Euc`tr^1Ja0mcZov{QUn(XOIZ9bfToX#b95yGyzCBKNkgr6|TuT%8k- zl}JOs3BUrm;2aZLGuJZ-?cqM``KbD z+UK4h-_o;fA?>em9wTno6sjWT*<_?$NB{bWKl^d;jE*O)=qRis8uTbx4Z%fy+U5Zk zGA#}|QUU9WPCLE{?pGa(H)J-!3U^n%9`NIPh^u)}SC)Vl0fm(%?4*60Un%S0`8V&N zH)1#kZ{Bf}Y=@Un;Q#Tqzn z)32lkU*Qd{qPrlHJW;?tS7b=+yMk`7QY#wOEh0Oug@xm%5HAL}ouq`jXHF`pUFCe{ z(ob+6-~{*@FC@vF5OZ->V#sgVsA7Jy=p`b_{{B7Ls1V1MX;;>)Pv=Ql?(%Ir0eI&6 zb)_KmMzUL$mr0xTy(5-dCgt4-9d1jm_z(7T2gmn!SdPclm|b1$Dk3~WqN{iwS~V+) zl4P+V1@TQii1UB=MJZhn+8J2U^pMDa6oJ`PsOD?ug9%%LcYZF; zbu#!A39C7MKV~(BMOE2B*qVP&zTqA1#Hc52IKzX$*(t21s@H+-BH$pjKD0*xj3s@G z*F{d)TT{@{>4Uhuv*f*)$_{wj32r_yN7t#R>=6cn2}aWG8;vW5I$;t6j_%q%el&g3 z;7ZARa0BG%+V_|6EC zh+DJi7t-C-@`?5U-;*XVaJG0&0zm+Rcm0kdQ0ECWsY6?7V8QNH8*8$mU)FQS2)3;v z_XceV{nY{GTR6i>WLsuv&&{o+DDx3bv3(6v5>6>kyjat$svWhX_73-pzYNp$%9>;- z*sZ?XtES@`iPPkLBzamvOjUw)vxe*~<$?BULe}i8w@@y&)V>4PkH3m@#dWm}O+Lf! z@~%z{ohMJN7`ea0-VrN(!UgpkI8zLX>c?7kXAPaQNnKHmAjbgs5@-{c`IqAt|Sjn(D~$(uzX^sd*l$(Qkr^?NeRymgV_a3ZVt zp`;-5VMXWg(mY4syqK$mU8Dr`OZ$b<(CgPZ`~Ro%e=QY@OLSB zy6eU31|j-))Q;hz9QSc+d4uMa;5TN^;{;2oj%@vFu*u+DJlHMQ>y_}!71~*pav+5W z3iy6a5wh+X$?#hB5D!DC4hN|N)R$U}gxY;!$7~`mbuatZQ9lp=vY|jCEYuKWBMmfK zFR#(6O>PKXzj{^1jqo>ZM=|DE3;4+VSlxu+FOAxpfsVL1%hd6?0h=-10<+Xg)0wJ9 z{olIg#nl%p=Wjb`+iiaLuKZbj4U()Mg*9nhU$+9L)ju~0q|&;OCU5=7-wnw8^7+%Z`z)>~dH%+4 zpHz>1Kdd7CHir17H%@x2OEPr}x|YoBDag1s3H~&KO@l8ozR4H(R_R!$HiAX5Gnw{# zh_cjStxmquE$ZZ(@14rDFFg%!a6?3pG6jpA|C5t)*PqsJs)P}mT%IYIb#7xxTR4yJ zvv836RpZ;?#W_>t<0PAAt#xFyLle~A)GyU;>y00+>Hyp@QA0ZBI>2U{D;3%VnZGvS z<+Iu@BY7_kh_i?sQ<}#myu{rqpYIK+v8T1)FyI}F)v6ul;48P}`)tgW_{y+>A{vVw zR&D@#$7ls0>8qETGGnut?YbSv`*NOs`)=%dU`py=wh81s?^cWajW_XFUTMKRR=LK$ z0fnF%8n*RCaGJFwh#rf=rDJW6BK3e!0ej^RB`}qXker~Ac#n6-{EDsdDgO`V*HGW^ zO?#}>=eFL}TmkDOp$YNH;4h`zyUR8)sYL!qqa1;UrSp_GK+(?gV1tHV?U0#wqQ~(U zUBdDE0wlr4s!sxIoj|eu8*3lW;I#IXjpe{^Iky)4{y>7uO;}d2&HMVBPW`E2qp*{* zd0d$);PHbkPlN3`@hIuMlylx++r8dN=YFtCA7&P03*6aR$J-ZO$Yg#*0=~J*?6O|G zo?UYFTP{z1PXtFH=i2NaqxxSs;w%l-dX#!XICjgQOn>tO+!hHN&7fVYEZ?+>ufs>* z_%exAHbp-xZha>nJXuB#Q-hRX11pzvkFF5F<~5W?=Bst=6xw|)9=C)M!ac$Wbw-Gh zlg4;Y%nHo@5wVN!fwtrJeo(3>#rwq8Al1=sjej`1D_el0kVO4YzS=XdRnNQ}w|CnH zhtMwe{7$;%51PHW|6NOgXESf*pBX#E^m_K8Lmto0w8X zPmC-^sAH)~=fY_+r@Q|)RPjF0 zd(XmP6xAe#Oh13CwY@9u^6`Vy)dJrXg#%9|3r*_t=tTZ${n{4=l$TGH+5R+noNPh8 zQ=)Oyw@?4Yru)jwt5s^|efwQR|Mq)s`w=91X+yu-!tiyr!zrI-KC;ZU+HBCfOG7gQ zQgtdG$2Kf9=5I`U|A`%&63fjqc%}I_RhB#48QXY)rS6W`%C{Z2l0bokPE{rT(AgmwnuZzzd8<}{F)XNH1GJZd?iPNe=xI#p&AnC^v$MtJtItocTE|oR zETo0=WgN6u%A%j#y5`_^xH+SiF@=qKltgDC;d-BShEXVferjrmI?%)^i3=95eWMj tSPj0}4XIGzi=ScZgMow;Q0OcC=Wd?r*uyh*#*)yFnpbo$6Vz<){||L+YiIxf literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-90f32b94b4.png b/docs/specs/application-command-class-specification/assets/img-90f32b94b4.png new file mode 100644 index 0000000000000000000000000000000000000000..0b347c2c25053232ae11a4efacc6a29183d9f6a7 GIT binary patch literal 2062 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 F@*gwp*G~Wd literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-b391b0ae58.png b/docs/specs/application-command-class-specification/assets/img-b391b0ae58.png new file mode 100644 index 0000000000000000000000000000000000000000..28e70040830bebd4419bf4a64fc7b5bf295a9b23 GIT binary patch literal 1849 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 OV3ee5uylFTeKRAD)XR48!(_rYNYE*3< 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 literal 0 HcmV?d00001 diff --git a/docs/specs/application-command-class-specification/assets/img-8101ef46fc.png b/docs/specs/application-command-class-specification/assets/img-8101ef46fc.png new file mode 100644 index 0000000000000000000000000000000000000000..14849bc85180a8dd3ba3ee6a1932ec33c496af6c GIT binary patch literal 1983 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 l)_tf$>qE_fk3an@L7;ta}5RzE-QPR~e>q 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