python-aidot-cameras 1.0.0rc14__tar.gz → 1.0.0rc15__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.
- {python_aidot_cameras-1.0.0rc14/python_aidot_cameras.egg-info → python_aidot_cameras-1.0.0rc15}/PKG-INFO +1 -1
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/client.py +14 -5
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/controls.py +43 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/pyproject.toml +1 -1
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15/python_aidot_cameras.egg-info}/PKG-INFO +1 -1
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/python_aidot_cameras.egg-info/SOURCES.txt +1 -0
- python_aidot_cameras-1.0.0rc15/tests/test_auto_alarm.py +70 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/LICENSE +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/MANIFEST.in +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/README.md +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/__main__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_upstream.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/LICENSE +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/clock.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/base.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/g711.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/g722.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/h264.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/opus.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/codecs/vpx.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/contrib/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/contrib/media.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/contrib/signaling.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/events.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/exceptions.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/jitterbuffer.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/mediastreams.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rate.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcconfiguration.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcdatachannel.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcdtlstransport.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcicetransport.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcpeerconnection.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcrtpparameters.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcrtpreceiver.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcrtpsender.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcrtptransceiver.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcsctptransport.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtcsessiondescription.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/rtp.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/sdp.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/stats.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/aiortc/utils.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/ble_gateway.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/constants.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/go2rtc.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/hwaccel.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/lan_control.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/models.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/playback.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/protocol.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sd_events.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sd_listing.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sd_playback.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sdes.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sdes_open.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/tutk.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/webrtc.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/webrtc_open.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/client.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/cloud_auth.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/const.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/credentials.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/crypto.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/device_client.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/discover.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/exceptions.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/g711.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/lan_retry.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/py.typed +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/python_aidot_cameras.egg-info/entry_points.txt +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/python_aidot_cameras.egg-info/requires.txt +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/python_aidot_cameras.egg-info/top_level.txt +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/setup.cfg +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_abandoned_attempt_skips_the_doomed_serve.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_abandoned_wait_still_maps_audio.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_aioice_compat.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_alarm_event.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_answer_pt_kinds.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_answer_sdp_video_pt.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_answer_section_selection.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_audio_mux_offline.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_ctrl_uses_the_session_dseq.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_request.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_response_parse.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_response_router.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_backoff.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_detection.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_evidence_corroboration.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_skip_turn.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_stale_offer_is_abandoned_early.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_wake_gate_app_parity.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_bitrate_campaign_arms.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ble_gateway.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_bridge_state_sentinels.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_busy_backoff.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_camera_properties.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_canary_log_names_the_camera.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_cloud_count.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_cloud_plan.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_constants_imports_resolve.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_control_verdicts.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_deferred_hardening.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_detection_types.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_device_cmd_seq_match.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_device_login_guard.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_device_user_info_cache.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_direct_ts_keyframe_signal.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_direct_ts_serve.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dormant_camera_cleanup.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_drain_is_cancellable.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_mux_terminal_write.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_not_ready_burst.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_pinning.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_resolution_ack.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_serve_decode_skip.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_serve_ice_wait.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_serve_open_timeout.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_skip_signaling_wait.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_slow_probe.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_stdout_producer.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_video_presence.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_egress_guard.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_env_seams.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_feature_probe_needs_a_live_session.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ffmpeg_signal_exit_is_not_a_crash.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_futile_keepalive.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_gate_requires_a_decoded_frame.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_go2rtc.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_go2rtc_cli.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_h264_decode_rate_limit.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_highport_nomination.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_hwaccel_probe.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ice_config_cache.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ice_credentials_match_the_app.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ice_peer_reflexive.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_idle_release_both_loops.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_keepalive_renew.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_key_restart_sdp.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_keyframe_prompter.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_lan_control.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_lan_retry_reaches_the_storming_devices.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_late_repeats_are_dropped.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_light_active_color_mode.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_session_carries_talk.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_stream_param.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_validate_policy.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_video_canary.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_liveplay_echo_timeout.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_local_only_controls.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_logging_caps.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_login_connect_deadline.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_login_reconnect_backoff.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_media_counted_only_when_plaintext.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_media_path_is_reported.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_media_socket_rcvbuf.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_media_wait_floor.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_motion_poll.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_mqtt_client_id_is_exact.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_mqtt_credential_refetch.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_mqtt_credential_self_heal.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_mqtt_password_not_persisted.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_mqtt_session_reconnect.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_mqtt_thread_not_orphaned.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_nack.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_nack_cannot_add_load_in_a_burst.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_narrow_pc_ice.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_no_key_material_in_logs.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_no_self_referential_go2rtc.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_no_unbounded_hex_dumps.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_no_undefined_names.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_nominates_as_soon_as_the_answer_lands.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_off_subnet_candidate.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_offer_bandwidth_line.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_offer_keeps_rtcp_feedback.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_offline_keepalive_pause.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_on_frame_is_an_av_frame.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_open_fail_logger.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_open_gate_delay.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_peer_id_class_env.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_peer_id_client_type.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_peerid_reuse.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_persistent_mqtt.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_persistent_mqtt_robustness.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_playback_tls.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_post_merge_hardening.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ptz_probe_reads_what_it_is_told.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_public_signature_matches_impl.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_publish_target_readiness.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_quality_campaign_in_session.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_reboot_action.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_recent_recordings.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_remb.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_remb_goes_out_the_relay_aware_sender.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_resent_frames_are_dropped.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_resolution_persists.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_restart_cycle.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_retry_policy.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_scripts_importable.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sctp_init_ack_tsn.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sctp_reassembly.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sctp_sack.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sd_card_presence.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sd_event_decode.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sd_event_probe_payloads.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sd_listing.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sd_playback.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_adaptive.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_avio_dispatch.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_bridge_break_gate.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_connection_mode.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_echo_wait_is_not_dead_time.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_fast_liveplay.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_ffmpeg_stderr_log.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_first_media_stall_report.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_ice_teardown.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_idle_release.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_nack_bridge.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_offer_video_order.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_offer_video_pin.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_open_cleanup.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_sctp_abort.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_serve_audio.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_serve_cmd.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_serve_stderr_drain.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_session_cap.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_sprop.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_talk.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_teardown_exit_log.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_terminal_ack.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_terminal_ack_latency.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_tmmbr_bridge.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdes_watchdog.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdp_narrowing_properties.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sdp_payload_type_narrowing.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_security_hardening.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_self_peer_is_an_address_not_an_ip.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_serializable_login_info.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_serve_input_timeout.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_serve_loss_tolerance.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_serve_pt_respects_the_pin.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_serve_relay.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_serve_stderr_keeps_the_reason.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_session_stats.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_shared_house_seam.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_signalling_is_attributable_to_a_camera.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_snapshot_cancellation.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_speak.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sprop_capture_gate.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sprop_staleness.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sprop_unstable_public.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_sprop_write_is_reported_truthfully.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_srtp_rx_rekey.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_srtp_tx_key_note.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stable_terminal_id.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stall_nudge_policy.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stall_report_says_what_the_answer_carried.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stall_report_says_whether_the_trigger_was_answered.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stall_report_separates_silence_from_undecryptable.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stall_report_survives_a_caller_giving_up.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stall_reports_reach_the_artifact.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_status_and_trace_channels.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stream_cap.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stream_drain_ownership.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stream_idle.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stream_slot_cap.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_stream_teardown.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_talk.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_talk_reports_a_speaker_that_never_opened.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_tap_to_mux_end_to_end.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_terminal_ack.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_tmmbr.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_token_file_robustness.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_token_refresh.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_transport_failure_reporting.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_turn_create_permission.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_tutk_path_is_out_of_reach.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_unbuildable_summary_repeats_at_debug.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_upstream_compat.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_validator_shares_one_token.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_video_profile_log.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_video_pts_dts.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_video_ts_unwrap.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_viewer_check_throttle.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_viewer_presence.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_viewer_present_push_mode.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_wait_or_event.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_wake_gate_camera_evidence.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_wake_readiness_retry.py +0 -0
- {python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_webrtc_answer_race.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-aidot-cameras
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.0rc15
|
|
4
4
|
Summary: Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)
|
|
5
5
|
Author-email: cbrightly <chris.brightly@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/client.py
RENAMED
|
@@ -6561,11 +6561,20 @@ class CameraMixin(_CameraControlsMixin, _CameraSdMixin, _WebRTCOpenMixin, _SdesO
|
|
|
6561
6561
|
# A001064 on the first attempt. Reverting THIS LINE ALONE, with every
|
|
6562
6562
|
# other change of that release left in place, restored 3 of 3.
|
|
6563
6563
|
#
|
|
6564
|
-
# The A000088 is a different SoC (Realtek
|
|
6565
|
-
# image
|
|
6566
|
-
#
|
|
6567
|
-
#
|
|
6568
|
-
#
|
|
6564
|
+
# The A000088 is a different SoC (Realtek RTL8735B / AmebaPro2). Its
|
|
6565
|
+
# image WAS disassembled on 2026-09-07, and it has **no client class at
|
|
6566
|
+
# all**: `lds_process_peerid` in rtc_mqtt.c parses
|
|
6567
|
+
# `%[^_]_%[^_]_%02hhd_%02hhd_%02hhd`, keeps field 2 as an opaque string
|
|
6568
|
+
# at buf+0x32, and never derives a class from its first character. It
|
|
6569
|
+
# also treats a parse failure as NON-fatal - it substitutes the literal
|
|
6570
|
+
# "userid" for field 2 and continues. Only field 1 is compared, against
|
|
6571
|
+
# "google". So `client_type = field2[0]-'0'` and "a malformed peer id is
|
|
6572
|
+
# rejected outright" are BOTH A001064-only; do not generalise either.
|
|
6573
|
+
#
|
|
6574
|
+
# Which leaves the class-0 result real but unexplained: 0 of 9 is not
|
|
6575
|
+
# luck against a 29-of-30 baseline, yet the firmware has nothing there
|
|
6576
|
+
# to read. Do not repeat "class 0 breaks it because it announces
|
|
6577
|
+
# APP_ANDROID" - that story is not supported by the image.
|
|
6569
6578
|
#
|
|
6570
6579
|
# Class '2' (WEB) - what the vendor web app sends - was screened on
|
|
6571
6580
|
# 2026-09-07 and does NOT break it: 6 of 6 A000088 cameras PASS across
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/controls.py
RENAMED
|
@@ -190,6 +190,49 @@ class _CameraControlsMixin:
|
|
|
190
190
|
return await self.async_trigger_device_action(
|
|
191
191
|
"setRoiHuman", {"roi": [payload]})
|
|
192
192
|
|
|
193
|
+
#: The siren's automatic trigger. ``autoAlarm`` is the master; the other
|
|
194
|
+
#: two say what sets it off. Probed 2026-09-07: NOT a mirror of anything
|
|
195
|
+
#: else we expose -- on an A000088 ``motionDetection`` read 0 while the
|
|
196
|
+
#: camera's own motion-detection setting read True, and on an A001064
|
|
197
|
+
#: ``humanDetect`` read 0 while ``getRoiHuman``'s read 1.
|
|
198
|
+
AUTO_ALARM_KEYS = ("autoAlarm", "motionDetection", "humanDetect")
|
|
199
|
+
|
|
200
|
+
async def async_get_auto_alarm(self) -> "Optional[dict]":
|
|
201
|
+
"""Siren auto-trigger settings as ``{key: bool}``.
|
|
202
|
+
|
|
203
|
+
``None`` means the camera did not answer -- unknown, NOT all-off.
|
|
204
|
+
Reporting an unanswered camera as three disarmed switches would claim a
|
|
205
|
+
state it never gave, and this is the setting that decides whether a
|
|
206
|
+
siren goes off in someone's house.
|
|
207
|
+
"""
|
|
208
|
+
out = await self.async_query_device_action("getAutoAlarm")
|
|
209
|
+
if not isinstance(out, list) or not out or not isinstance(out[0], dict):
|
|
210
|
+
return None
|
|
211
|
+
return {k: bool(v) for k, v in out[0].items()}
|
|
212
|
+
|
|
213
|
+
async def async_set_auto_alarm(self, key: str, enabled: bool) -> bool:
|
|
214
|
+
"""Arm or disarm the siren's automatic trigger, or one of its causes.
|
|
215
|
+
|
|
216
|
+
Read-modify-write against the camera's own object. That matters more
|
|
217
|
+
here than anywhere else: rebuilding the payload from our own key list
|
|
218
|
+
could arm ``autoAlarm`` as a side effect of changing a trigger, which
|
|
219
|
+
would make a camera start sounding a siren nobody asked it to.
|
|
220
|
+
"""
|
|
221
|
+
out = await self.async_query_device_action("getAutoAlarm")
|
|
222
|
+
if not isinstance(out, list) or not out or not isinstance(out[0], dict):
|
|
223
|
+
_LOGGER.warning(
|
|
224
|
+
"auto alarm: %s did not report its settings; not writing",
|
|
225
|
+
self.device_id)
|
|
226
|
+
return False
|
|
227
|
+
current = out[0]
|
|
228
|
+
if key not in current:
|
|
229
|
+
_LOGGER.warning("auto alarm: %s does not report %r",
|
|
230
|
+
self.device_id, key)
|
|
231
|
+
return False
|
|
232
|
+
payload = dict(current)
|
|
233
|
+
payload[key] = 1 if enabled else 0
|
|
234
|
+
return await self.async_trigger_device_action("setAutoAlarm", [payload])
|
|
235
|
+
|
|
193
236
|
async def async_get_wifi_info(self) -> "Optional[dict]":
|
|
194
237
|
"""``{"ssid": str, "rssi": int}`` for the camera's own WiFi link.
|
|
195
238
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-aidot-cameras"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.0rc15"
|
|
8
8
|
description = "Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-aidot-cameras
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.0rc15
|
|
4
4
|
Summary: Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)
|
|
5
5
|
Author-email: cbrightly <chris.brightly@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -83,6 +83,7 @@ tests/test_answer_pt_kinds.py
|
|
|
83
83
|
tests/test_answer_sdp_video_pt.py
|
|
84
84
|
tests/test_answer_section_selection.py
|
|
85
85
|
tests/test_audio_mux_offline.py
|
|
86
|
+
tests/test_auto_alarm.py
|
|
86
87
|
tests/test_avio_ctrl_uses_the_session_dseq.py
|
|
87
88
|
tests/test_avio_request.py
|
|
88
89
|
tests/test_avio_response_parse.py
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""The siren's automatic trigger: on/off, and what sets it off.
|
|
2
|
+
|
|
3
|
+
`getAutoAlarm` returns `[{autoAlarm, motionDetection, humanDetect}]` -- a master
|
|
4
|
+
switch plus which events fire it. Probed on real hardware 2026-09-07, and it is
|
|
5
|
+
NOT a mirror of anything already exposed: on an A000088 its `motionDetection`
|
|
6
|
+
read 0 while the camera's own motion-detection setting read True, and on an
|
|
7
|
+
A001064 its `humanDetect` read 0 while `getRoiHuman`'s read 1. Two independent
|
|
8
|
+
settings that happen to share field names.
|
|
9
|
+
|
|
10
|
+
Same discipline as the detection types: read-modify-write against the camera's
|
|
11
|
+
own object so a flag we do not model cannot be reset, and a camera that does not
|
|
12
|
+
answer is unknown rather than all-off.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
|
|
17
|
+
from aidot_cameras.camera.controls import _CameraControlsMixin
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class _Cam(_CameraControlsMixin):
|
|
21
|
+
device_id = "cam1"
|
|
22
|
+
|
|
23
|
+
def __init__(self, out):
|
|
24
|
+
self._out = out
|
|
25
|
+
self.triggered: list = []
|
|
26
|
+
|
|
27
|
+
async def async_query_device_action(self, action, params=None, **kw):
|
|
28
|
+
return self._out
|
|
29
|
+
|
|
30
|
+
async def async_trigger_device_action(self, action, params=None, **kw):
|
|
31
|
+
self.triggered.append((action, params))
|
|
32
|
+
return True
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
_LIVE = [{"autoAlarm": 0, "motionDetection": 0, "humanDetect": 1}]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_reads_the_master_and_both_triggers():
|
|
39
|
+
got = asyncio.run(_Cam(_LIVE).async_get_auto_alarm())
|
|
40
|
+
assert got == {"autoAlarm": False, "motionDetection": False,
|
|
41
|
+
"humanDetect": True}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_a_camera_that_does_not_answer_is_unknown_not_all_off():
|
|
45
|
+
assert asyncio.run(_Cam(None).async_get_auto_alarm()) is None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_setting_one_flag_preserves_the_others():
|
|
49
|
+
"""Turning a trigger on must not silently disarm the master, or arm it."""
|
|
50
|
+
cam = _Cam(_LIVE)
|
|
51
|
+
assert asyncio.run(cam.async_set_auto_alarm("motionDetection", True)) is True
|
|
52
|
+
action, payload = cam.triggered[0]
|
|
53
|
+
assert action == "setAutoAlarm"
|
|
54
|
+
row = payload[0]
|
|
55
|
+
assert row["motionDetection"] == 1 # the one we changed
|
|
56
|
+
assert row["autoAlarm"] == 0 # master untouched - still disarmed
|
|
57
|
+
assert row["humanDetect"] == 1 # other trigger untouched
|
|
58
|
+
assert set(row) == set(_LIVE[0])
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_a_key_the_camera_does_not_report_is_refused():
|
|
62
|
+
cam = _Cam(_LIVE)
|
|
63
|
+
assert asyncio.run(cam.async_set_auto_alarm("sirenDetect", True)) is False
|
|
64
|
+
assert cam.triggered == []
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_no_write_when_the_camera_will_not_say_what_it_has():
|
|
68
|
+
cam = _Cam(None)
|
|
69
|
+
assert asyncio.run(cam.async_set_auto_alarm("autoAlarm", True)) is False
|
|
70
|
+
assert cam.triggered == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_upstream.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/_vendor/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/ble_gateway.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/__init__.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/constants.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/go2rtc.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/hwaccel.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/models.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/playback.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/protocol.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sd_events.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sd_listing.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sdes.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/sdes_open.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/tutk.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/camera/webrtc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/cloud_auth.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/credentials.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/device_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/aidot_cameras/lan_retry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_aioice_compat.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_answer_pt_kinds.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_answer_sdp_video_pt.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_audio_mux_offline.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_request.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_response_parse.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_avio_response_router.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_detection.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_battery_skip_turn.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_busy_backoff.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_camera_properties.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_control_verdicts.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_deferred_hardening.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_detection_types.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_device_cmd_seq_match.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_device_login_guard.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_direct_ts_serve.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_drain_is_cancellable.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_not_ready_burst.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_pinning.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_resolution_ack.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_serve_ice_wait.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_slow_probe.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_stdout_producer.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_dtls_video_presence.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_egress_guard.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_futile_keepalive.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_highport_nomination.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_hwaccel_probe.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ice_config_cache.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_ice_peer_reflexive.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_keepalive_renew.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_key_restart_sdp.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_keyframe_prompter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_stream_param.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_validate_policy.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_live_video_canary.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_local_only_controls.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_logging_caps.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_media_socket_rcvbuf.py
RENAMED
|
File without changes
|
{python_aidot_cameras-1.0.0rc14 → python_aidot_cameras-1.0.0rc15}/tests/test_media_wait_floor.py
RENAMED
|
File without changes
|