mx-remote 4.7.6__tar.gz → 4.7.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. mx_remote-4.7.8/.claude/agents/semble-search.md +30 -0
  2. mx_remote-4.7.8/.claude/settings.local.json +9 -0
  3. mx_remote-4.7.8/CLAUDE.md +79 -0
  4. {mx_remote-4.7.6 → mx_remote-4.7.8}/LICENSE +1 -1
  5. {mx_remote-4.7.6 → mx_remote-4.7.8}/PKG-INFO +4 -4
  6. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/Interface.py +6 -6
  7. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/Uid.py +6 -6
  8. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/__init__.py +6 -6
  9. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/const.py +7 -7
  10. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/main.py +6 -6
  11. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/BayConfig.py +6 -6
  12. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Constants.py +6 -6
  13. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Data.py +6 -6
  14. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Factory.py +6 -6
  15. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameAmpDolbySettings.py +6 -6
  16. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameAmpZoneSettings.py +6 -6
  17. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBase.py +6 -6
  18. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayConfig.py +6 -6
  19. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayConfigSecondary.py +6 -6
  20. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayHide.py +6 -6
  21. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayStatus.py +6 -6
  22. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameConnectStatus.py +6 -6
  23. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameDebug.py +6 -6
  24. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameDiscover.py +6 -6
  25. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameEDID.py +6 -6
  26. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameEDIDProfile.py +6 -6
  27. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameFactoryReset.py +6 -6
  28. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameFilterStatus.py +6 -6
  29. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameFirmwareVersion.py +6 -6
  30. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameHeader.py +6 -6
  31. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameHello.py +6 -6
  32. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameLinks.py +6 -6
  33. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameMeshOperation.py +6 -6
  34. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameMirrorStatus.py +6 -6
  35. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameMonitoringPulse.py +6 -6
  36. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameNetworkStatus.py +6 -6
  37. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FramePDUState.py +6 -6
  38. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FramePowerChange.py +6 -6
  39. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCAction.py +6 -6
  40. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCIr.py +6 -6
  41. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCKey.py +6 -6
  42. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCSettings.py +6 -6
  43. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameReboot.py +6 -6
  44. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRoutingChange.py +6 -6
  45. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetInstaller.py +6 -6
  46. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetName.py +6 -6
  47. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetRoute.py +6 -6
  48. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetupStatus.py +6 -6
  49. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSignalStatus.py +6 -6
  50. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSignalStatusNew.py +6 -6
  51. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSysTemperature.py +6 -6
  52. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSystemStatus.py +6 -6
  53. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameTXRCAction.py +6 -6
  54. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameTopology.py +6 -6
  55. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameTxIR.py +6 -6
  56. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameUpgradeFPGA.py +6 -6
  57. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPAudio.py +6 -6
  58. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPBayMapping.py +10 -8
  59. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPDeviceConfiguration.py +6 -6
  60. mx_remote-4.7.8/mx_remote/proto/FrameV2IPLink.py +14 -0
  61. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPManualSourceSwitch.py +6 -6
  62. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPMultiviewer.py +6 -6
  63. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPPowerSave.py +6 -6
  64. mx_remote-4.7.8/mx_remote/proto/FrameV2IPSetMaster.py +14 -0
  65. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPSourceSwitch.py +6 -6
  66. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPSources.py +6 -6
  67. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPStats.py +6 -6
  68. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPStreamDetails.py +6 -6
  69. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPTiling.py +6 -6
  70. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolume.py +6 -6
  71. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolumeDown.py +6 -6
  72. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolumeSet.py +6 -6
  73. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolumeUp.py +6 -6
  74. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/LinkConfig.py +6 -6
  75. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Multiviewer.py +7 -0
  76. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/PDUState.py +6 -6
  77. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Svd.py +6 -6
  78. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/V2IPConfig.py +6 -6
  79. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/V2IPStats.py +6 -6
  80. mx_remote-4.7.8/mx_remote/proto/__init__.py +16 -0
  81. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Bay.py +20 -14
  82. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/ConnectionAsync.py +6 -6
  83. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Device.py +20 -14
  84. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Link.py +6 -6
  85. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/P8PDU.py +6 -6
  86. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Remote.py +6 -6
  87. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/State.py +6 -6
  88. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/V2IP.py +6 -6
  89. {mx_remote-4.7.6 → mx_remote-4.7.8}/pyproject.toml +2 -2
  90. mx_remote-4.7.6/.claude/settings.local.json +0 -13
  91. mx_remote-4.7.6/mx_remote/proto/FrameV2IPLink.py +0 -14
  92. mx_remote-4.7.6/mx_remote/proto/FrameV2IPSetMaster.py +0 -14
  93. mx_remote-4.7.6/mx_remote/proto/__init__.py +0 -16
  94. {mx_remote-4.7.6 → mx_remote-4.7.8}/.gitignore +0 -0
  95. {mx_remote-4.7.6 → mx_remote-4.7.8}/README.md +0 -0
  96. {mx_remote-4.7.6 → mx_remote-4.7.8}/hatch_build.py +0 -0
  97. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/Interface.pyi +0 -0
  98. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/Uid.pyi +0 -0
  99. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/__init__.pyi +0 -0
  100. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/const.pyi +0 -0
  101. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/main.pyi +0 -0
  102. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/BayConfig.pyi +0 -0
  103. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Constants.pyi +0 -0
  104. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Data.pyi +0 -0
  105. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Factory.pyi +0 -0
  106. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameAmpDolbySettings.pyi +0 -0
  107. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameAmpZoneSettings.pyi +0 -0
  108. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBase.pyi +0 -0
  109. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayConfig.pyi +0 -0
  110. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayConfigSecondary.pyi +0 -0
  111. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayHide.pyi +0 -0
  112. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameBayStatus.pyi +0 -0
  113. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameConnectStatus.pyi +0 -0
  114. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameDebug.pyi +0 -0
  115. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameDiscover.pyi +0 -0
  116. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameEDID.pyi +0 -0
  117. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameEDIDProfile.pyi +0 -0
  118. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameFactoryReset.pyi +0 -0
  119. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameFilterStatus.pyi +0 -0
  120. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameFirmwareVersion.pyi +0 -0
  121. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameHeader.pyi +0 -0
  122. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameHello.pyi +0 -0
  123. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameLinks.pyi +0 -0
  124. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameMeshOperation.pyi +0 -0
  125. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameMirrorStatus.pyi +0 -0
  126. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameMonitoringPulse.pyi +0 -0
  127. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameNetworkStatus.pyi +0 -0
  128. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FramePDUState.pyi +0 -0
  129. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FramePowerChange.pyi +0 -0
  130. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCAction.pyi +0 -0
  131. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCIr.pyi +0 -0
  132. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCKey.pyi +0 -0
  133. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRCSettings.pyi +0 -0
  134. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameReboot.pyi +0 -0
  135. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameRoutingChange.pyi +0 -0
  136. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetInstaller.pyi +0 -0
  137. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetName.pyi +0 -0
  138. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetRoute.pyi +0 -0
  139. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSetupStatus.pyi +0 -0
  140. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSignalStatus.pyi +0 -0
  141. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSignalStatusNew.pyi +0 -0
  142. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSysTemperature.pyi +0 -0
  143. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameSystemStatus.pyi +0 -0
  144. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameTXRCAction.pyi +0 -0
  145. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameTopology.pyi +0 -0
  146. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameTxIR.pyi +0 -0
  147. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameUpgradeFPGA.pyi +0 -0
  148. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPAudio.pyi +0 -0
  149. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPBayMapping.pyi +0 -0
  150. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPDeviceConfiguration.pyi +0 -0
  151. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPLink.pyi +0 -0
  152. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPManualSourceSwitch.pyi +0 -0
  153. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPMultiviewer.pyi +0 -0
  154. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPPowerSave.pyi +0 -0
  155. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPSetMaster.pyi +0 -0
  156. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPSourceSwitch.pyi +0 -0
  157. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPSources.pyi +0 -0
  158. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPStats.pyi +0 -0
  159. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPStreamDetails.pyi +0 -0
  160. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameV2IPTiling.pyi +0 -0
  161. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolume.pyi +0 -0
  162. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolumeDown.pyi +0 -0
  163. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolumeSet.pyi +0 -0
  164. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/FrameVolumeUp.pyi +0 -0
  165. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/LinkConfig.pyi +0 -0
  166. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Multiviewer.pyi +0 -0
  167. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/PDUState.pyi +0 -0
  168. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/Svd.pyi +0 -0
  169. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/V2IPConfig.pyi +0 -0
  170. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/V2IPStats.pyi +0 -0
  171. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/__init__.pyi +0 -0
  172. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/proto/svd.csv +0 -0
  173. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/py.typed +0 -0
  174. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Bay.pyi +0 -0
  175. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/ConnectionAsync.pyi +0 -0
  176. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Device.pyi +0 -0
  177. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Link.pyi +0 -0
  178. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/P8PDU.pyi +0 -0
  179. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/Remote.pyi +0 -0
  180. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/State.pyi +0 -0
  181. {mx_remote-4.7.6 → mx_remote-4.7.8}/mx_remote/remote/V2IP.pyi +0 -0
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: semble-search
3
+ description: Code search agent for exploring any codebase. Use for finding code by intent, locating implementations, understanding how something works, or discovering related code. Prefer over Grep/Glob/Read for any semantic or exploratory question.
4
+ tools: Bash, Read
5
+ ---
6
+
7
+ Use `semble search` to find code by describing what it does or naming a symbol/identifier, instead of grep:
8
+
9
+ ```bash
10
+ semble search "authentication flow" ./my-project
11
+ semble search "save_pretrained" ./my-project
12
+ semble search "save model to disk" ./my-project --top-k 10
13
+ ```
14
+
15
+ Use `semble find-related` to discover code similar to a known location (pass `file_path` and `line` from a prior search result):
16
+
17
+ ```bash
18
+ semble find-related src/auth.py 42 ./my-project
19
+ ```
20
+
21
+ `path` defaults to the current directory when omitted; git URLs are accepted.
22
+
23
+ If `semble` is not on `$PATH`, use `uvx --from "semble[mcp]" semble` in its place.
24
+
25
+ ## Workflow
26
+
27
+ 1. Start with `semble search` to find relevant chunks.
28
+ 2. Inspect full files only when the returned chunk is not enough context.
29
+ 3. Optionally use `semble find-related` with a promising result's `file_path` and `line` to discover related implementations.
30
+ 4. Use grep only when you need exhaustive literal matches or quick confirmation of an exact string.
@@ -0,0 +1,9 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(git fetch *)",
5
+ "Bash(ssh hass@home *)",
6
+ "Bash(python -c \"import ast; ast.parse\\(open\\('mx_remote/const.py'\\).read\\(\\)\\)\")"
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,79 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## What this is
6
+
7
+ `mx_remote` is a Python 3.11+ asyncio library for interfacing with Pulse-Eight MX Remote
8
+ compatible devices over a local network (UDP multicast/broadcast): video/audio matrices
9
+ (neo), OneIP/V2IP units (tx/rx/transceiver/multiviewer), and amplifiers (ProAmp8). These
10
+ all run the shared **MatrixOS** firmware. The library does device discovery, A/V routing,
11
+ volume, remote-control key passthrough, V2IP streaming, and multiviewer control.
12
+
13
+ See `README.md` for the full public-API usage guide (the API surface is large and stable).
14
+
15
+ ## Commands
16
+
17
+ ```bash
18
+ pip install . # install; runs the custom hatch build hook
19
+ python -m build # build wheel + sdist into dist/
20
+ mxr # console app: discover devices, log frames live
21
+ mxr -l <local_ip> # bind to a specific interface
22
+ mxr -b # broadcast mode instead of multicast
23
+ mxr -i <capture> [-f <ip>] # parse a MatrixOS/Wireshark capture file offline
24
+ ```
25
+
26
+ There is **no test suite** and no lint config in this repo. Validate protocol changes by
27
+ running `mxr` against live hardware or by replaying a capture file with `mxr -i`.
28
+
29
+ ### Versioning
30
+ Version is single-sourced in `mx_remote/const.py` (`VERSION = '...'`); `pyproject.toml`
31
+ reads it via regex, so bump it there only. Release commits follow the convention
32
+ `bump to X.Y.Z`.
33
+
34
+ ### Build hook
35
+ `hatch_build.py` generates `.pyi` type stubs via `mypy stubgen` at build time and
36
+ force-includes them in the wheel (they are gitignored). `mx_remote` ships as typed
37
+ (`py.typed`). If stubgen produces nothing the build fails by design.
38
+
39
+ ## Architecture
40
+
41
+ Three layers, decoupled by abstract base classes:
42
+
43
+ 1. **`mx_remote/proto/`** — the wire protocol. One `Frame*` class per opcode, all
44
+ subclassing `FrameBase` (payload accessors: `payload_u8/u16/u32/str/uuid/bay/device`).
45
+ `Factory.py::_mxr_frame_factory` maps each opcode → its `Frame*` class. Each frame's
46
+ `process()` method mutates registry state and fires callbacks. Frames are built for TX
47
+ via `FrameBase.construct_base` + per-frame `constructFrame*` helpers.
48
+
49
+ 2. **`mx_remote/Interface.py`** — the public API and contracts: abstract base classes
50
+ (`DeviceBase`, `BayBase`, `DeviceRegistry`, `Multiviewer`, `AudioEndpoint`,
51
+ `ConnectionCallbacks`) plus all enums (`DeviceStatus`, `PowerStatus`, `RCType`, …) and
52
+ the `MxrCallbacks` class users subclass. proto/ and remote/ both depend on this; it
53
+ depends on neither. This is the biggest file — most "where is X defined" answers are here.
54
+
55
+ 3. **`mx_remote/remote/`** — concrete implementations:
56
+ - `Remote` (`DeviceRegistry` + `ConnectionCallbacks`) — main entry point; owns the
57
+ connection and the `remotes` registry.
58
+ - `Device` (`DeviceBase`), `Bay` (`BayBase`) — live device/port state.
59
+ - `ConnectionAsync` — `asyncio.DatagramProtocol` UDP transport (multicast/broadcast).
60
+ - `State` — dispatches events to registered `MxrCallbacks`.
61
+ - `V2IP`, `Link`, `P8PDU` — OneIP streaming, virtual bay links, PDU support.
62
+
63
+ ### Receive data flow
64
+ `ConnectionAsync` datagram → `Remote.on_datagram_received` → `Remote.process_frame` →
65
+ `Factory.process_mxr_frame` (decodes `FrameHeader` + opcode into a typed `Frame*`) →
66
+ `frame.process()` mutates `Device`/`Bay` → `MxrCallbacks` fire. Frames whose
67
+ `remote_id == self.uid` (our own echoes) are skipped.
68
+
69
+ ### Frame wire format
70
+ `[0x50, 0x38, protocol, 0x00]` ("P8" magic + protocol version) + opcode (u16 LE) +
71
+ length (u16 LE) + payload. Built by `proto/Factory.py::create_mxr_frame`.
72
+
73
+ ## Working on the protocol
74
+
75
+ When adding or editing a `Frame*` class, byte layouts **must match the MatrixOS firmware C
76
+ structs** — verify against the firmware source rather than inferring from samples. Adding a
77
+ new opcode requires both the `Frame*` class and a dispatch entry in
78
+ `Factory.py::_mxr_frame_factory`. Note the proto/ and remote/ modules use tab indentation
79
+ while `Interface.py` and `const.py` use spaces — match the file you are editing.
@@ -1,4 +1,4 @@
1
- Copyright 2024 Lars Op den Kamp <lars@opdenkamp.eu>
1
+ Copyright 2021-2026 Lars Op den Kamp <lars@opdenkamp-it.nl>
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mx_remote
3
- Version: 4.7.6
3
+ Version: 4.7.8
4
4
  Summary: Python 3 library for interfacing with MX Remote compatible devices
5
5
  Project-URL: Homepage, https://github.com/opdenkamp/mx-remote/
6
6
  Project-URL: Documentation, https://github.com/opdenkamp/mx-remote/
7
7
  Project-URL: Repository, https://github.com/opdenkamp/mx-remote.git
8
8
  Project-URL: Bug Tracker, https://github.com/opdenkamp/mx-remote/issues
9
- Author-email: Lars Op den Kamp <lars@opdenkamp.eu>
10
- Maintainer-email: Lars Op den Kamp <lars@opdenkamp.eu>
11
- License: Copyright 2024 Lars Op den Kamp <lars@opdenkamp.eu>
9
+ Author-email: Lars Op den Kamp <lars@opdenkamp-it.nl>
10
+ Maintainer-email: Lars Op den Kamp <lars@opdenkamp-it.nl>
11
+ License: Copyright 2021-2026 Lars Op den Kamp <lars@opdenkamp-it.nl>
12
12
 
13
13
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
14
14
 
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  from abc import ABC, abstractmethod
9
9
  from enum import IntEnum
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Unique device and bay identifier types for mx_remote.'''
8
8
 
9
9
  import logging
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  """
9
9
  mx_remote - Python 3 library for interfacing with MX Remote compatible devices.
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  """
9
9
  Network and version constants for mx_remote.
@@ -14,7 +14,7 @@ Default communication modes:
14
14
  """
15
15
  import os
16
16
 
17
- VERSION = '4.7.6'
17
+ VERSION = '4.7.8'
18
18
  __version__ = VERSION
19
19
 
20
20
  MX_BCAST_UDP_PORT = 8811
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Command-line entry points for the mx_remote library.'''
8
8
 
9
9
  import argparse
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  '''Bay configuration data parsed from bay config protocol frames.'''
9
9
 
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  '''Protocol constants, feature flags, and enumeration types for the MX Remote binary protocol.'''
9
9
 
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  '''Data structures for volume and mute status used in protocol frames.'''
9
9
 
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  ''' Methods for creating and processing frames '''
9
9
  from .FrameBase import FrameBase
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for amplifier Dolby audio settings.'''
8
8
 
9
9
  from .FrameBase import FrameBase
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for amplifier zone settings (gain, EQ, delay, power mode).'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  '''Base class and utilities for decoded MX Remote protocol frames.'''
9
9
 
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for bay configuration data.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for secondary bay configuration data.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for hiding or showing a bay in the device UI.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for bay status updates (signal, features, status flags).'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for device connect/disconnect status notifications.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for debug commands.'''
8
8
 
9
9
  from .FrameBase import FrameBase
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for network device discovery.'''
8
8
 
9
9
  import warnings
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for EDID (Extended Display Identification Data) content.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for EDID profile change commands.'''
8
8
 
9
9
  from .FrameBase import FrameBase
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for SYS_FACTORY_RESET (opcode 0x3A).
8
8
 
9
9
  A mesh controller or management app broadcasts this to factory-reset peers.
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for bay source filter status.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for firmware version information.'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
 
8
8
  '''MX Remote frame header parsing and construction.'''
9
9
 
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame for device advertisement (hello/discovery response).'''
8
8
 
9
9
  from functools import cached_property
@@ -1,9 +1,9 @@
1
- ##################################################
2
- ## MX Remote Python Interface ##
3
- ## ##
4
- ## author: Lars Op den Kamp (lars@opdenkamp.eu) ##
5
- ## copyright (c) 2026 Op den Kamp IT Solutions ##
6
- ##################################################
1
+ ######################################################
2
+ ## MX Remote Python Interface ##
3
+ ## ##
4
+ ## author: Lars Op den Kamp (lars@opdenkamp-it.nl) ##
5
+ ## copyright (c) 2021-2026 Op den Kamp IT Solutions ##
6
+ ######################################################
7
7
  '''Protocol frame containing all configured links for a device.'''
8
8
 
9
9
  from functools import cached_property