python-mobius 0.8.1__py3-none-any.whl → 0.8.3__py3-none-any.whl
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.
- mobius/__init__.py +1 -1
- mobius/device.py +55 -2
- {python_mobius-0.8.1.dist-info → python_mobius-0.8.3.dist-info}/METADATA +1 -1
- {python_mobius-0.8.1.dist-info → python_mobius-0.8.3.dist-info}/RECORD +7 -7
- {python_mobius-0.8.1.dist-info → python_mobius-0.8.3.dist-info}/WHEEL +0 -0
- {python_mobius-0.8.1.dist-info → python_mobius-0.8.3.dist-info}/entry_points.txt +0 -0
- {python_mobius-0.8.1.dist-info → python_mobius-0.8.3.dist-info}/licenses/LICENSE +0 -0
mobius/__init__.py
CHANGED
mobius/device.py
CHANGED
|
@@ -145,6 +145,24 @@ class LightPollResult:
|
|
|
145
145
|
schedule_points: list[SchedulePoint]
|
|
146
146
|
intensities: LightIntensityResult
|
|
147
147
|
used_batch: bool = True
|
|
148
|
+
# The same raw 0.0-1.0 schedule-level master dimmer
|
|
149
|
+
# get_schedule_intensity() itself returns -- already fetched and
|
|
150
|
+
# consumed internally by both this method and the individual-reads
|
|
151
|
+
# fallback below (it's one of process_light_intensities()'s own
|
|
152
|
+
# required inputs), but never actually propagated out to the
|
|
153
|
+
# caller until this field existed. NOT the same thing as
|
|
154
|
+
# intensities.diagnostics["scalar"]: that reflects whichever value
|
|
155
|
+
# is CURRENTLY driving the effective per-channel output at this
|
|
156
|
+
# exact moment (which, during a lunar-reduced night segment, is
|
|
157
|
+
# the lunar reduction factor instead) -- this field is always the
|
|
158
|
+
# device's own raw schedule-level intensity setting itself,
|
|
159
|
+
# regardless of whether it's the thing actually in effect right
|
|
160
|
+
# now. A caller wanting "what would the user's own intensity
|
|
161
|
+
# slider currently show" wants this field specifically, not
|
|
162
|
+
# diagnostics["scalar"]. None only if the underlying read itself
|
|
163
|
+
# failed and decode_schedule_intensity() had truly nothing to fall
|
|
164
|
+
# back to.
|
|
165
|
+
schedule_intensity: Optional[float] = None
|
|
148
166
|
|
|
149
167
|
|
|
150
168
|
@dataclass
|
|
@@ -545,7 +563,9 @@ def decode_light_poll_from_batch(
|
|
|
545
563
|
lunar_enabled, lunar_date, lunar_date_source,
|
|
546
564
|
schedule_intensity, acclimation_info, insolation_active,
|
|
547
565
|
)
|
|
548
|
-
return LightPollResult(
|
|
566
|
+
return LightPollResult(
|
|
567
|
+
schedule_points=points, intensities=intensities, used_batch=True, schedule_intensity=schedule_intensity,
|
|
568
|
+
)
|
|
549
569
|
|
|
550
570
|
|
|
551
571
|
def decode_pump_flow_range(min_raw: list[bytes], max_raw: list[bytes]) -> Optional[PumpFlowRange]:
|
|
@@ -3443,6 +3463,35 @@ class MobiusDevice:
|
|
|
3443
3463
|
return False
|
|
3444
3464
|
return decode_lunar_enabled(raw)
|
|
3445
3465
|
|
|
3466
|
+
async def set_lunar_enabled(self, enabled: bool) -> None:
|
|
3467
|
+
"""Writes LunarPhasesEnabled (907) -- confirmed byte-for-byte
|
|
3468
|
+
against the app's own compiled bytecode (LunarInfo.smali's own
|
|
3469
|
+
save() method): a single byte, the boolean enabled field stored
|
|
3470
|
+
directly as 0 or 1, via the exact same SetC2AttrFsciRequest.
|
|
3471
|
+
addAttribute() mechanism this library's own set_attribute()
|
|
3472
|
+
uses. This is exactly what the app's own "Lunar" chip (top of
|
|
3473
|
+
the light schedule editor) toggles: clicking it turns
|
|
3474
|
+
lunar-phase night-time dimming on/off, and while enabled that
|
|
3475
|
+
same chip also displays the current moon phase.
|
|
3476
|
+
|
|
3477
|
+
No group/broadcast involved -- confirmed by tracing
|
|
3478
|
+
LightingFragment's own saveLunar(), which loops over every
|
|
3479
|
+
light device in the tank and calls this same per-device,
|
|
3480
|
+
ungrouped write on EACH one individually (not a single
|
|
3481
|
+
mesh-wide broadcast the way set_time_to_now() works). The
|
|
3482
|
+
app's own UI applies the same new value to every light in the
|
|
3483
|
+
tank with that one tap, but the underlying wire mechanism is
|
|
3484
|
+
still one ordinary, targeted write per device -- this method
|
|
3485
|
+
only ever writes to the single device it's called on, matching
|
|
3486
|
+
every other attribute write in this library.
|
|
3487
|
+
|
|
3488
|
+
No which/schedule parameter -- unlike Schedule1Intensity/
|
|
3489
|
+
Schedule2Intensity, there's only ever a single
|
|
3490
|
+
LunarPhasesEnabled attribute (confirmed: no LunarPhasesEnabled2
|
|
3491
|
+
exists), so this applies to the light as a whole rather than to
|
|
3492
|
+
either schedule individually."""
|
|
3493
|
+
await self.set_attribute(C2Attribute.LunarPhasesEnabled, bytes([1 if enabled else 0]))
|
|
3494
|
+
|
|
3446
3495
|
async def get_acclimation_info(self) -> Optional[AcclimationInfo]:
|
|
3447
3496
|
"""
|
|
3448
3497
|
Fetches all 4 acclimation attributes (AcclimationEnabled/Period/
|
|
@@ -3790,7 +3839,11 @@ class MobiusDevice:
|
|
|
3790
3839
|
"""
|
|
3791
3840
|
points = await self.get_light_schedule(which)
|
|
3792
3841
|
intensities = await self.get_current_light_intensities(which, minute_of_day, now)
|
|
3793
|
-
|
|
3842
|
+
schedule_intensity = await self.get_schedule_intensity(which)
|
|
3843
|
+
return LightPollResult(
|
|
3844
|
+
schedule_points=points, intensities=intensities, used_batch=False,
|
|
3845
|
+
schedule_intensity=schedule_intensity,
|
|
3846
|
+
)
|
|
3794
3847
|
|
|
3795
3848
|
async def get_full_poll_batch(
|
|
3796
3849
|
self, primitive: PrimitiveType, model: Optional[Model] = None,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: python-mobius
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.3
|
|
4
4
|
Summary: Reverse-engineered Python client for the Mobius BLE protocol (EcoTech Marine VorTech/Radion, AquaIllumination, Neptune Systems, NYOS)
|
|
5
5
|
Project-URL: Homepage, https://code.r3pek.org/r3pek/python-mobius
|
|
6
6
|
Project-URL: Documentation, https://code.r3pek.org/r3pek/python-mobius/src/branch/main/documentation
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
mobius/__init__.py,sha256=
|
|
1
|
+
mobius/__init__.py,sha256=iTc-wZIgqWdeg6BhIqWBvC-bBmgbkyWZ6nZeCoMsePI,7620
|
|
2
2
|
mobius/cli.py,sha256=DJNKcBB7VCROZ90QmFWeCkRzPCRfoTaeTZaCLJ41s-Y,79735
|
|
3
3
|
mobius/coap.py,sha256=ZRBy8ivgl1o2cVLjIp-df8Jg34c58K0_1Oec1P-gQI4,10464
|
|
4
4
|
mobius/constants.py,sha256=OlbC0GSPT3Lp7rGfIqSMkAqY535oNNRRoOd15TTVt7k,46286
|
|
5
5
|
mobius/crc.py,sha256=T6PWTp3gAHu-C05ua2LH8z8leD8mSjizM7nuC9G8KhU,2643
|
|
6
|
-
mobius/device.py,sha256=
|
|
6
|
+
mobius/device.py,sha256=L1ReDPyrdYcKddF1FR02-0b1S1nsfYjLWmA_ElLob-s,203228
|
|
7
7
|
mobius/device_status.py,sha256=tKZwi12fS3PVl7F-Pr5tvTNOTAttaOtAWom7ahl0LZM,33080
|
|
8
8
|
mobius/discovery.py,sha256=-N_RK8ZK91Ep-XePm9cHJa44yKiBL_Ind9wFHi_TZ-8,11742
|
|
9
9
|
mobius/dump.py,sha256=2uy-bq8Ja2W3D4dz9VboSO_KqYQ4bE8xmVxYTxWOjXg,16525
|
|
@@ -17,8 +17,8 @@ mobius/pump_status.py,sha256=qLprWM0gAoltZj7w8ykdXHPfBDMl-QnBOwrmBlvknIA,1536
|
|
|
17
17
|
mobius/relay.py,sha256=BmUc1l0mDOt9isTGs7wCh0NxehbMxfaTzm3cYs7VucA,26445
|
|
18
18
|
mobius/scenes.py,sha256=Wt0Ys2x1YjF8MNDEd6kxWqYBIYPdBSbfzXD-L5ZKzag,3592
|
|
19
19
|
mobius/schedule.py,sha256=BDm8Uh8O85AlAZuR7i7pgqKC2GNXcV_HikFoG6_3Xgo,17590
|
|
20
|
-
python_mobius-0.8.
|
|
21
|
-
python_mobius-0.8.
|
|
22
|
-
python_mobius-0.8.
|
|
23
|
-
python_mobius-0.8.
|
|
24
|
-
python_mobius-0.8.
|
|
20
|
+
python_mobius-0.8.3.dist-info/METADATA,sha256=5xtsO-Z5dG_yLyPJ3nb5sTtCumcEBuFA5oGnJLST2xk,9899
|
|
21
|
+
python_mobius-0.8.3.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
22
|
+
python_mobius-0.8.3.dist-info/entry_points.txt,sha256=Q2hlcek-bWm70zvd12v32essflPgC2su-dKDHAqbPoE,48
|
|
23
|
+
python_mobius-0.8.3.dist-info/licenses/LICENSE,sha256=7a72Msu2Q-TnoiFxemxEGkwafJGObk1W3rw9hzmyM_Y,17984
|
|
24
|
+
python_mobius-0.8.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|