node-red-contrib-tapo-p125m 0.1.0 → 0.1.1
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.
- package/README.md +1279 -0
- package/package.json +16 -5
- package/package.json.old +0 -17
package/README.md
ADDED
|
@@ -0,0 +1,1279 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
<!DOCTYPE html>
|
|
8
|
+
<html
|
|
9
|
+
lang="en"
|
|
10
|
+
|
|
11
|
+
data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
|
|
12
|
+
data-a11y-animated-images="system" data-a11y-link-underlines="true"
|
|
13
|
+
|
|
14
|
+
>
|
|
15
|
+
|
|
16
|
+
<style>
|
|
17
|
+
:root {
|
|
18
|
+
--fontStack-monospace: "Monaspace Neon", ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace !important;
|
|
19
|
+
}
|
|
20
|
+
</style>
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
<head>
|
|
26
|
+
<meta charset="utf-8">
|
|
27
|
+
<link rel="dns-prefetch" href="https://github.githubassets.com">
|
|
28
|
+
<link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
|
|
29
|
+
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
|
|
30
|
+
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
|
|
31
|
+
<link rel="preconnect" href="https://github.githubassets.com" crossorigin>
|
|
32
|
+
<link rel="preconnect" href="https://avatars.githubusercontent.com">
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-dac525bbd821.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-784387e86ac0.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-56ccf4057897.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-0e24752a7d2b.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-412af2517363.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6186e83663dc.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-9d33c7aea2e7.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-79bd5fd84a86.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-75db11311555.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-f2c1045899a2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-f46d293c6ff3.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-e4b5684db29d.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-72c58078e707.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-956cb5dfcb85.css" />
|
|
38
|
+
|
|
39
|
+
<style type="text/css">
|
|
40
|
+
:root {
|
|
41
|
+
--tab-size-preference: 4;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
pre, code {
|
|
45
|
+
tab-size: var(--tab-size-preference);
|
|
46
|
+
}
|
|
47
|
+
</style>
|
|
48
|
+
|
|
49
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-c37d781e2da5.css" />
|
|
50
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-dc3bfaf4b78e.css" />
|
|
51
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-b0ea6cebe9c5.css" />
|
|
52
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-7b2c79a47cf5.css" />
|
|
53
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-5d735668c600.css" />
|
|
54
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-f0247a8b45d0.css" />
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
<script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_status_checks_ruleset","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_enable_snapshot_keyword","actions_image_version_event","actions_workflow_language_service","agent_session_retry_fetch_capi_on_401","allow_react_navs_in_turbo","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","billing_hard_budget_limits_for_licenses","billing_ui_budget_pagination_enabled","codespaces_prebuild_region_target_update","coding_agent_model_selection","consolidated_custom_properties_values_table","contentful_lp_footnotes","copilot_3p_agent_hovercards","copilot_agent_cli_public_preview","copilot_agent_sessions_alive_updates","copilot_agent_task_list_v2","copilot_agent_tasks_btn_code_nav","copilot_agent_tasks_btn_code_view","copilot_agent_tasks_btn_code_view_lines","copilot_agent_tasks_btn_repo","copilot_agents_blankslate_mem_requests","copilot_api_agentic_issue_marshal_yaml","copilot_byok_extended_capabilities","copilot_capi_error_response_telemetry","copilot_chat_agents_empty_state","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_disable_model_picker_while_streaming","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_raycast_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_generate_thread_name_async","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_issue_list_show_more","copilot_org_policy_page_focus_mode","copilot_pipes_code_nodes","copilot_pipes_github_graphql_nodes","copilot_premium_request_quotas","copilot_redirect_header_button_to_agents","copilot_security_alert_assignee_options","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_public_access_to_user_owned_spaces","copilot_spaces_read_access_to_user_owned_spaces","copilot_spaces_report_abuse","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_stable_conversation_view","copilot_swe_agent_progress_commands","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","dashboard_lists_max_age_filter","dashboard_universe_2025","dashboard_universe_2025_feedback_dialog","dom_node_counts","enterprise_ai_controls","failbot_report_error_react_apps_on_page","fetch_graphql_ignore_fetch_network_errors","fgpat_permissions_selector_redesign","flex_cta_groups_mvp","github_models_scheduled_hydro_events","global_nav_react","global_nav_react_edit_status_dialog","global_nav_react_feature_preview","global_nav_react_teams_settings_page","global_nav_react_top_repos_api_caching","global_nav_repo_picker_debounce","hide_groups_list_for_few_groups","hyperspace_2025_logged_out_batch_1","indexdb-offline-cache-periodic-cleanup","initial_per_page_pagination_updates","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cache_operation_timeout","issues_cca_assign_actor_with_agent","issues_check_is_repository_writable","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_preheating_dependency_issues","issues_preheating_issue_row","issues_preheating_memex","issues_preheating_parent_issue","issues_preheating_secondary","issues_preheating_sub_issues","issues_preheating_timeline_issues","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_client_side_caching","issues_react_client_side_caching_analytics","issues_react_extended_preheat_analytics","issues_react_include_bots_in_pickers","issues_react_label_picker_debounce_filter","issues_react_labelpicker_patch","issues_react_prohibit_title_fallback","issues_react_safari_scroll_preservation","issues_react_turbo_cache_navigation","issues_react_ui_feedback","issues_react_use_turbo_for_cross_repo_navigation","issues_report_sidebar_interactions","lifecycle_label_name_updates","loops_service_graphql_execution","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_display_button_config_menu","memex_grouped_by_edit_route","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_roadmap_drag_style","mission_control_retry_on_401","mission_control_safe_token_clearing","mission_control_use_body_html","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","pr_sfv_new_diff_fetch","primer_react_css_has_selector_perf","projects_assignee_max_limit","prs_conversations_react_split","react_centralized_error_handling","react_compiler_commits","react_compiler_diff_lines","react_compiler_prs_hooks","react_compiler_prs_ui","react_compiler_pull_requests","react_profile_user_status_dialog_enabled","react_quality_profiling","repo_insights_all_traffic_endpoint","repos_insights_remove_new_url","repository_suggester_elastic_search","ruleset_deletion_confirmation","sample_network_conn_type","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","site_homepage_contentful","site_homepage_eyebrow_banner","site_homepage_universe_animations","site_msbuild_webgl_hero","spark_prompt_secret_scanning","spark_server_connection_status","swe_agent_member_requests","swe_agent_member_requests_agent_panel","turbo_frame_redirect","viewscreen_sandbox","webp_support","workbench_store_readonly"],"login":"n3bkv","copilotApiOverrideUrl":"https://api.individual.githubcopilot.com"}</script>
|
|
59
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/wp-runtime-1f2cc8d0dcae.js" defer="defer"></script>
|
|
60
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/78298-e2b301acbc0e.js" defer="defer"></script>
|
|
61
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/6488-de87864e6818.js" defer="defer"></script>
|
|
62
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/82075-0a62077d7865.js" defer="defer"></script>
|
|
63
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-4b1518f5fbee.js" defer="defer"></script>
|
|
64
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/97068-2c8e697c6e8c.js" defer="defer"></script>
|
|
65
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/43784-4652ae97a661.js" defer="defer"></script>
|
|
66
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/4712-6fc930a63a4b.js" defer="defer"></script>
|
|
67
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/81028-4fa90b716172.js" defer="defer"></script>
|
|
68
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/74911-313e1ea8beda.js" defer="defer"></script>
|
|
69
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/91853-448038d8f9ef.js" defer="defer"></script>
|
|
70
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/78143-31968346cf4c.js" defer="defer"></script>
|
|
71
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/78954-eeadcb8a29db.js" defer="defer"></script>
|
|
72
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-c96932270531.js" defer="defer"></script>
|
|
73
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-6dc66e4ce1b2.js" defer="defer"></script>
|
|
74
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/react-core-fbb7101a5e29.js" defer="defer"></script>
|
|
75
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/react-lib-b492ee0e2c35.js" defer="defer"></script>
|
|
76
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/90780-1a0f3d593ff0.js" defer="defer"></script>
|
|
77
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/28546-ee41c9313871.js" defer="defer"></script>
|
|
78
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/17688-a9e16fb5ed13.js" defer="defer"></script>
|
|
79
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/15938-1bc2c363d5ed.js" defer="defer"></script>
|
|
80
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/70191-36bdeb9f5eb6.js" defer="defer"></script>
|
|
81
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/7332-5ea4ccf72018.js" defer="defer"></script>
|
|
82
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/66721-c03c0d8e4fbe.js" defer="defer"></script>
|
|
83
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/51519-d05cf6658c87.js" defer="defer"></script>
|
|
84
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/27376-1e4a947f926f.js" defer="defer"></script>
|
|
85
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/96384-750ef5263abe.js" defer="defer"></script>
|
|
86
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/19718-302da6273821.js" defer="defer"></script>
|
|
87
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-b1be3c8dda2b.js" defer="defer"></script>
|
|
88
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/37911-38a50fdf7d79.js" defer="defer"></script>
|
|
89
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/notifications-global-945a9cf8a11b.js" defer="defer"></script>
|
|
90
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/53996-f184b4318606.js" defer="defer"></script>
|
|
91
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-e79e57599f8a.js" defer="defer"></script>
|
|
92
|
+
|
|
93
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/primer-react-461f94d12ce0.js" defer="defer"></script>
|
|
94
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/octicons-react-a215e6ee021a.js" defer="defer"></script>
|
|
95
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/31475-2b0a1453a474.js" defer="defer"></script>
|
|
96
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/42892-86c578f4fa0a.js" defer="defer"></script>
|
|
97
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/62522-3e3f44aed73b.js" defer="defer"></script>
|
|
98
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/99418-9d4961969e0d.js" defer="defer"></script>
|
|
99
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/33915-05ba9b3edc31.js" defer="defer"></script>
|
|
100
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/51220-1830aac4fd9d.js" defer="defer"></script>
|
|
101
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/40744-692cb6dd5313.js" defer="defer"></script>
|
|
102
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/66218-317ef4ff3c9f.js" defer="defer"></script>
|
|
103
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/90618-3b106b9cf915.js" defer="defer"></script>
|
|
104
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/51380-a378372ba7d3.js" defer="defer"></script>
|
|
105
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/25407-c87b08869f80.js" defer="defer"></script>
|
|
106
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/92742-3f8b5c55c6d9.js" defer="defer"></script>
|
|
107
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/40771-e74947e93afa.js" defer="defer"></script>
|
|
108
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/66990-8cfcfaccee61.js" defer="defer"></script>
|
|
109
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/29665-1d34baf5b8ee.js" defer="defer"></script>
|
|
110
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/91232-e2ace26ba06d.js" defer="defer"></script>
|
|
111
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/41474-dc871715e808.js" defer="defer"></script>
|
|
112
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/6623-a8b7048e3210.js" defer="defer"></script>
|
|
113
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/10288-456970bb5000.js" defer="defer"></script>
|
|
114
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/81565-0522c87f18ce.js" defer="defer"></script>
|
|
115
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/3966-de744c5b8501.js" defer="defer"></script>
|
|
116
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/60726-67d325399b85.js" defer="defer"></script>
|
|
117
|
+
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/react-code-view-a9ed9c99817e.js" defer="defer"></script>
|
|
118
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.7d74e12fb6d12081c276.module.css" />
|
|
119
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-code-view.4ea2c80e34c2da80281f.module.css" />
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
<title>TP-Link-Tapo-P125M/README.md at main · n3bkv/TP-Link-Tapo-P125M</title>
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
<meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
|
|
127
|
+
<meta name="route-controller" content="blob" data-turbo-transient>
|
|
128
|
+
<meta name="route-action" content="show" data-turbo-transient>
|
|
129
|
+
<meta name="fetch-nonce" content="v2:fae7382c-b838-ac53-18b0-906bcf92fa2e">
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
<meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
<meta name="request-id" content="C0B0:272EFE:75D0D6B:7817B40:696BC309" data-turbo-transient="true" /><meta name="html-safe-nonce" content="83714f003cae36840c3323d3d3c93c28d987919ee32fcee8fab1bc5c1e8e1363" data-turbo-transient="true" /><meta name="visitor-payload" content="eyJyZWZlcnJlciI6Imh0dHBzOi8vZ2l0aHViLmNvbS9uM2Jrdi9UUC1MaW5rLVRhcG8tUDEyNU0iLCJyZXF1ZXN0X2lkIjoiQzBCMDoyNzJFRkU6NzVEMEQ2Qjo3ODE3QjQwOjY5NkJDMzA5IiwidmlzaXRvcl9pZCI6IjU0OTA1MDY2ODA1MTc2Mjc5ODkiLCJyZWdpb25fZWRnZSI6InNlYSIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==" data-turbo-transient="true" /><meta name="visitor-hmac" content="a9dcc69b31b760be72b9ca1a72dabade3558e214a02b060a8e15da15e82e3204" data-turbo-transient="true" />
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
<meta name="hovercard-subject-tag" content="repository:1134502255" data-turbo-transient>
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
<meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
<meta name="selected-link" value="repo_source" data-turbo-transient>
|
|
145
|
+
<link rel="assets" href="https://github.githubassets.com/">
|
|
146
|
+
|
|
147
|
+
<meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">
|
|
148
|
+
|
|
149
|
+
<meta name="octolytics-url" content="https://collector.github.com/github/collect" /><meta name="octolytics-actor-id" content="42347433" /><meta name="octolytics-actor-login" content="n3bkv" /><meta name="octolytics-actor-hash" content="6118307a88f348015d88c81f91f4299018f1e3973e78bfd98c39b9064c48087c" />
|
|
150
|
+
|
|
151
|
+
<meta name="analytics-location" content="/<user-name>/<repo-name>/blob/show" data-turbo-transient="true" />
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
<meta name="user-login" content="n3bkv">
|
|
159
|
+
|
|
160
|
+
<link rel="sudo-modal" href="/sessions/sudo_modal">
|
|
161
|
+
|
|
162
|
+
<meta name="viewport" content="width=device-width">
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
<meta name="description" content="This project provides local (LAN) on/off control of TP-Link Tapo P125M smart plugs from Node-RED, running natively on Raspberry Pi OS. No Home Assistant or Matter required. It works on Raspberry Pi 3 (armv7 / 32-bit), where Matter containers are not supported. - TP-Link-Tapo-P125M/README.md at main · n3bkv/TP-Link-Tapo-P125M">
|
|
167
|
+
|
|
168
|
+
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">
|
|
169
|
+
|
|
170
|
+
<link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
|
|
171
|
+
<meta property="fb:app_id" content="1401488693436528">
|
|
172
|
+
<meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/n3bkv/TP-Link-Tapo-P125M/blob/main/README.md" />
|
|
173
|
+
|
|
174
|
+
<meta name="twitter:image" content="https://opengraph.githubassets.com/0204002f480328e6f440483a0ec0ab80251ec5959c47e1ccb717348d6dd9447c/n3bkv/TP-Link-Tapo-P125M" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="TP-Link-Tapo-P125M/README.md at main · n3bkv/TP-Link-Tapo-P125M" /><meta name="twitter:description" content="This project provides local (LAN) on/off control of TP-Link Tapo P125M smart plugs from Node-RED, running natively on Raspberry Pi OS. No Home Assistant or Matter required. It works on Raspberry P..." />
|
|
175
|
+
<meta property="og:image" content="https://opengraph.githubassets.com/0204002f480328e6f440483a0ec0ab80251ec5959c47e1ccb717348d6dd9447c/n3bkv/TP-Link-Tapo-P125M" /><meta property="og:image:alt" content="This project provides local (LAN) on/off control of TP-Link Tapo P125M smart plugs from Node-RED, running natively on Raspberry Pi OS. No Home Assistant or Matter required. It works on Raspberry P..." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="TP-Link-Tapo-P125M/README.md at main · n3bkv/TP-Link-Tapo-P125M" /><meta property="og:url" content="https://github.com/n3bkv/TP-Link-Tapo-P125M/blob/main/README.md" /><meta property="og:description" content="This project provides local (LAN) on/off control of TP-Link Tapo P125M smart plugs from Node-RED, running natively on Raspberry Pi OS. No Home Assistant or Matter required. It works on Raspberry P..." />
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
<link rel="shared-web-socket" href="wss://alive.github.com/_sockets/u/42347433/ws?session=eyJ2IjoiVjMiLCJ1Ijo0MjM0NzQzMywicyI6MTg2MjA3NTQ0MywiYyI6MzUyNjg2NzU1NCwidCI6MTc2ODY2OTk2N30=--8ce74078033710196aebf4c909be4a0ba04663f20fff8b1aaae0d552715e995a" data-refresh-url="/_alive" data-session-id="a491226181bcbe8ca52154c9c5b78d95378511b9e130b8cbc2f97b4fb159ccca">
|
|
180
|
+
<link rel="shared-web-socket-src" href="/assets-cdn/worker/socket-worker-2a038060e454.js">
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
<meta name="hostname" content="github.com">
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
<meta name="keyboard-shortcuts-preference" content="all">
|
|
187
|
+
<meta name="hovercards-preference" content="true">
|
|
188
|
+
<meta name="announcement-preference-hovercard" content="true">
|
|
189
|
+
|
|
190
|
+
<meta name="expected-hostname" content="github.com">
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
<meta http-equiv="x-pjax-version" content="3581e4945ff8c1c9f4f04f4754a98e461afd48de58b94da42d40434abbc400da" data-turbo-track="reload">
|
|
194
|
+
<meta http-equiv="x-pjax-csp-version" content="21a43568025709b66240454fc92d4f09335a96863f8ab1c46b4a07f6a5b67102" data-turbo-track="reload">
|
|
195
|
+
<meta http-equiv="x-pjax-css-version" content="55b0505ced03db2ce471b1617daeace5e7a81657042cfd93a3d10d1fb8695d21" data-turbo-track="reload">
|
|
196
|
+
<meta http-equiv="x-pjax-js-version" content="5f99f7c1d70f01da5b93e5ca90303359738944d8ab470e396496262c66e60b8d" data-turbo-track="reload">
|
|
197
|
+
|
|
198
|
+
<meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">
|
|
199
|
+
|
|
200
|
+
<meta name="turbo-cache-control" content="no-cache" data-turbo-transient>
|
|
201
|
+
|
|
202
|
+
<meta data-hydrostats="publish">
|
|
203
|
+
|
|
204
|
+
<meta name="go-import" content="github.com/n3bkv/TP-Link-Tapo-P125M git https://github.com/n3bkv/TP-Link-Tapo-P125M.git">
|
|
205
|
+
|
|
206
|
+
<meta name="octolytics-dimension-user_id" content="42347433" /><meta name="octolytics-dimension-user_login" content="n3bkv" /><meta name="octolytics-dimension-repository_id" content="1134502255" /><meta name="octolytics-dimension-repository_nwo" content="n3bkv/TP-Link-Tapo-P125M" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="1134502255" /><meta name="octolytics-dimension-repository_network_root_nwo" content="n3bkv/TP-Link-Tapo-P125M" />
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
<meta name="turbo-body-classes" content="logged-in env-production page-responsive">
|
|
213
|
+
<meta name="disable-turbo" content="false">
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
<meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">
|
|
217
|
+
|
|
218
|
+
<meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">
|
|
219
|
+
|
|
220
|
+
<meta name="release" content="82560a55c6b2054555076f46e683151ee28a19bc">
|
|
221
|
+
<meta name="ui-target" content="full">
|
|
222
|
+
|
|
223
|
+
<link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
|
|
224
|
+
<link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
|
|
225
|
+
<link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">
|
|
226
|
+
|
|
227
|
+
<meta name="theme-color" content="#1e2327">
|
|
228
|
+
<meta name="color-scheme" content="light dark" />
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
<link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">
|
|
232
|
+
|
|
233
|
+
</head>
|
|
234
|
+
|
|
235
|
+
<body class="logged-in env-production page-responsive" style="word-wrap: break-word;" >
|
|
236
|
+
<div data-turbo-body class="logged-in env-production page-responsive" style="word-wrap: break-word;" >
|
|
237
|
+
<div id="__primerPortalRoot__" role="region" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
<div class="position-relative header-wrapper js-header-wrapper ">
|
|
243
|
+
<a href="#start-of-content" data-skip-target-assigned="false" class="p-3 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>
|
|
244
|
+
|
|
245
|
+
<span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
|
|
246
|
+
<span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
|
|
247
|
+
</span>
|
|
248
|
+
|
|
249
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.7d74e12fb6d12081c276.module.css" />
|
|
250
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.29aaeaafa90f007c6f61.module.css" />
|
|
251
|
+
|
|
252
|
+
<react-partial
|
|
253
|
+
partial-name="keyboard-shortcuts-dialog"
|
|
254
|
+
data-ssr="false"
|
|
255
|
+
data-attempted-ssr="false"
|
|
256
|
+
data-react-profiling="true"
|
|
257
|
+
>
|
|
258
|
+
|
|
259
|
+
<script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
|
|
260
|
+
<div data-target="react-partial.reactRoot"></div>
|
|
261
|
+
</react-partial>
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.7d74e12fb6d12081c276.module.css" />
|
|
272
|
+
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.f502b7b14e3ff3edc71d.module.css" />
|
|
273
|
+
|
|
274
|
+
<react-partial
|
|
275
|
+
partial-name="global-nav-bar"
|
|
276
|
+
data-ssr="true"
|
|
277
|
+
data-attempted-ssr="true"
|
|
278
|
+
data-react-profiling="true"
|
|
279
|
+
>
|
|
280
|
+
|
|
281
|
+
<script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"user","label":"n3bkv","is_root":false,"href":"/n3bkv"},{"crumb_type":"repository","label":"TP-Link-Tapo-P125M","is_root":false,"href":"/n3bkv/TP-Link-Tapo-P125M"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/n3bkv/TP-Link-Tapo-P125M","selectedLinks":["repo_source","repo_downloads","repo_commits","repo_releases","repo_tags","repo_branches","repo_packages","repo_deployments","repo_attestations"],"popoverTarget":false,"hotkey":"g c","reactNav":{"appTarget":"code-view","anchor":"code-view-repo-link"},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"issues","icon":"issue-opened","label":"Issues","href":"/n3bkv/TP-Link-Tapo-P125M/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":0,"popoverTarget":false,"hotkey":"g i","reactNav":{"appTarget":"issues-react","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/n3bkv/TP-Link-Tapo-P125M/pulls","selectedLinks":["repo_pulls","checks"],"count":0,"popoverTarget":false,"hotkey":"g p","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"actions","icon":"play","label":"Actions","href":"/n3bkv/TP-Link-Tapo-P125M/actions","selectedLinks":["repo_actions"],"popoverTarget":false,"hotkey":"g a","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"projects","icon":"table","label":"Projects","href":"/n3bkv/TP-Link-Tapo-P125M/projects","selectedLinks":["repo_projects","new_repo_project","repo_project"],"count":0,"popoverTarget":false,"hotkey":"g b","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"wiki","icon":"book","label":"Wiki","href":"/n3bkv/TP-Link-Tapo-P125M/wiki","selectedLinks":["repo_wiki"],"popoverTarget":false,"hotkey":"g w","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"security","icon":"shield","label":"Security","href":"/n3bkv/TP-Link-Tapo-P125M/security","selectedLinks":["security","overview","alerts","policy","token_scanning","code_scanning"],"count":0,"popoverTarget":false,"hotkey":"g s","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"insights","icon":"graph","label":"Insights","href":"/n3bkv/TP-Link-Tapo-P125M/pulse","selectedLinks":["repo_graphs","repo_contributors","dependency_graph","dependabot_updates","pulse","people","community"],"popoverTarget":false,"reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"settings","icon":"gear","label":"Settings","href":"/n3bkv/TP-Link-Tapo-P125M/settings","selectedLinks":["code_review_limits","code_quality","codespaces_repository_settings","collaborators","custom_tabs","github_models_repo_settings","hooks","integration_installations","interaction_limits","issue_template_editor","key_links_settings","license_policy","notifications","repo_announcements","repo_branch_settings","repo_custom_properties","repo_keys_settings","repo_pages_settings","repo_protected_tags_settings","repo_rule_insights","repo_rules_bypass_requests","repo_rulesets","repo_settings_copilot_coding_guidelines","repo_settings_copilot_content_exclusion","repo_settings_copilot_swe_agent","repo_settings","reported_content","repository_actions_settings_add_new_runner","repository_actions_settings_general","repository_actions_settings_runner_details","repository_actions_settings_runners","repository_actions_settings","repository_environments","role_details","secrets_settings_actions","secrets_settings_codespaces","secrets_settings_dependabot","secrets","security_analysis","security_products"],"popoverTarget":false,"reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}}],"selectedLink":"repo_source"},"navMenu":{"home":{"href":"https://github.com/dashboard","hotkey":"g d"},"feed":{"show":false,"href":"https://github.com/feed"},"issues":{"href":"https://github.com/issues","hotkey":"g i"},"pulls":{"href":"https://github.com/pulls","hotkey":"g p"},"contributedRepos":{"show":true,"href":"https://github.com/repos","hotkey":null},"projects":{"href":"https://github.com/projects"},"discussions":{"show":true,"href":"https://github.com/discussions"},"codespaces":{"show":true,"href":"https://github.com/codespaces"},"copilot":{"show":true,"href":"/copilot"},"spark":{"show":false,"href":null},"marketplace":{"show":true,"href":"https://github.com/marketplace"},"explore":{"show":true,"href":"https://github.com/explore"},"richContent":{"show":true,"contentUrl":"/_side-panels/global.json","repositoriesSearchUrl":"/_side-panel-items/global/repositories.json","teamsSearchUrl":"/_side-panel-items/global/teams.json"}},"accountSwitchDialog":{"show":false},"userMenu":{"owner":{"login":"n3bkv","name":null,"avatarUrl":"https://avatars.githubusercontent.com/u/42347433?v=4"},"drawerId":"global-user-nav-drawer","lazyLoadItemDataFetchUrl":"/_side-panels/user.json","canAddAccount":true,"addAccountPath":"/login?add_account=1\u0026return_to=https%3A%2F%2Fgithub.com%2Fn3bkv%2FTP-Link-Tapo-P125M%2Fblob%2Fmain%2FREADME.md","switchAccountPath":"/switch_account","loginAccountPath":"/login?add_account=1","projectsPath":"/n3bkv?tab=projects","gistsUrl":"https://gist.github.com/mine","docsUrl":"https://docs.github.com","yourEnterpriseUrl":null,"enterpriseSettingsUrl":null,"supportUrl":"https://support.github.com","showAccountSwitcher":true,"showCopilot":true,"showEnterprises":true,"showEnterprise":false,"showGists":true,"showOrganizations":true,"showSponsors":true,"showUpgrade":true,"showFeaturesPreviews":true,"showEnterpriseSettings":false},"createMenu":{"showCreateRepo":true,"showImportRepo":true,"showCodespaces":true,"showSpark":false,"showCodingAgent":false,"showGist":true,"showCreateOrg":true,"showCreateProject":false,"showCreateLegacyProject":false,"showCreateIssue":true,"createProjectUrl":"/n3bkv?tab=projects","org":null,"owner":"n3bkv","repo":"TP-Link-Tapo-P125M"},"headerLogo":{"href":"https://github.com/","hotkey":"g d","aria-label":"Homepage "},"notifications":{"hotkey":"g n","indicatorMode":"none","websocketChannel":"eyJjIjoibm90aWZpY2F0aW9uLWNoYW5nZWQ6NDIzNDc0MzMiLCJ0IjoxNzY4NjY5OTY3fQ==--50395df3fd85ee3b70f9d313f81a3ada5601c54802481ce153a9247d068c68a5","fetchIndicatorSrc":"/notifications/indicator","fetchIndicatorEnabled":true},"issues":{"href":"https://github.com/issues","hotkey":"g i"},"pulls":{"href":"https://github.com/pulls","hotkey":"g p"},"contributedRepos":{"show":true,"href":"https://github.com/repos","hotkey":null},"copilot":{"show":true,"showCopilotTitle":false,"showAgentsButton":false,"copilotChatUrl":"/github-copilot/chat?skip_anchor=true","copilotApiUrl":"https://api.individual.githubcopilot.com","agentsPanel":{"popoverAvailable":true,"repository":{"id":1134502255,"name":"TP-Link-Tapo-P125M","ownerLogin":"n3bkv"},"showNotification":false,"linkToSessionsInRepo":false}},"search":{"show":true,"searchHotkey":"s,/","showCommandPalette":false,"isSearchPage":false,"isJumpToSearch":false,"fragmentsPath":"/_global-navigation/fragments","fragmentsParams":null},"enterpriseBanner":{"show":false}}}</script>
|
|
282
|
+
<div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.lpqgUB{width:32px;height:32px;}/*!sc*/
|
|
283
|
+
data-styled.g1[id="Box-sc-62in7e-0"]{content:"lpqgUB,"}/*!sc*/
|
|
284
|
+
</style><link rel="preload" as="image" href="https://avatars.githubusercontent.com/u/42347433?v=4&size=64"/><header role="banner" aria-label="Global Navigation Menu" class="GlobalNav styles-module__appHeader--NfDnF prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-left" class="styles-module__left--jQ3Pi styles-module__withLocalNavigation--Plcqw prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><div data-loading-wrapper="true"><button data-component="IconButton" type="button" aria-haspopup="dialog" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_apb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-three-bars" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75Zm0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75ZM1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5Z"></path></svg></button></div><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true" id="_R_apb_">Open Menu</span><!--$!--><template></template><!--/$--><a data-component="IconButton" type="button" href="https://github.com/" data-hotkey="g d" hotkey="g d" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderHome--FoS5_ prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4pb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true"><span id="_R_4pb_">Homepage <span class="prc-src-InternalVisuallyHidden-2YaI6">(<!-- -->g then d<!-- -->)</span></span><span class="prc-TooltipV2-KeybindingHintContainer-Ymj-3 prc-TooltipV2-HasTextBefore-fdOXj" aria-hidden="true"><kbd class="prc-KeybindingHint-KeybindingHint-qpYIs prc-Text-Text-9mHv3" data-testid="keybinding-hint"><span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">g</span><span aria-hidden="true">G</span></span><span class="prc-src-InternalVisuallyHidden-2YaI6">then</span> <span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">d</span><span aria-hidden="true">D</span></span></kbd></span></span></div><div data-testid="top-nav-center" class="styles-module__center--qh40Y styles-module__withLocalNavigation--Plcqw prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion--C8iwV prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb--ZChjZ prc-Breadcrumbs-Item-jcraJ" href="/n3bkv"><span class="">n3bkv</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb--ZChjZ prc-Breadcrumbs-Item-jcraJ" href="/n3bkv/TP-Link-Tapo-P125M"><span class="styles-module__contextCrumbLast--TwUMh">TP-Link-Tapo-P125M</span></a></li></ol></nav><div class="Search-module__searchButtonGroup--L3A4O prc-ButtonGroup-ButtonGroup-vFUrY"><div><button type="button" aria-label="Search or jump to…" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 Search-module__searchButton--QvFX2" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="Search-module__placeholder--mA5y1 Search-module__text--Gkpmo Search-module__value--KxUll">Type <kbd class="Search-module__kbd--zxNrv">/</kbd> to search</span></span></span></button></div><div></div></div><button data-component="IconButton" type="button" data-hotkey="s,/" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 Search-module__smallSearchButton--VApX0 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_l9b_"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true"><span id="_R_l9b_">Search or jump to…<span class="prc-src-InternalVisuallyHidden-2YaI6">(<!-- -->s,/<!-- -->)</span></span><span class="prc-TooltipV2-KeybindingHintContainer-Ymj-3 prc-TooltipV2-HasTextBefore-fdOXj" aria-hidden="true"><kbd class="prc-KeybindingHint-KeybindingHint-qpYIs prc-Text-Text-9mHv3" data-testid="keybinding-hint"><span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">s,/</span><span aria-hidden="true">S,/</span></span></kbd></span></span><div class="d-none"></div></div><div data-testid="top-nav-right" class="styles-module__right--zdnrg styles-module__withLocalNavigation--Plcqw prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="normal"><div data-testid="top-bar-actions" class="hide-sm hide-md prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="none"><span><div class="prc-ButtonGroup-ButtonGroup-vFUrY"><div><a data-component="IconButton" type="button" href="/copilot" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_kjpb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true" id="_R_kjpb_">Chat with Copilot</span></div><div><div class="d-none"></div><button type="button" aria-label="Open Copilot…" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 CopilotItems-module__CopilotMenu--OthpP" data-loading="false" data-size="medium" data-variant="invisible" id="_R_54jpb_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></div></span><div class="styles-module__itemDivider--ECUto"></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk GlobalCreateMenu-module__actionMenuButton--fOjh3" data-loading="false" data-size="medium" data-variant="invisible" aria-labelledby="global-create-menu-tooltip-_R_1jpb_" id="_R_5jpb_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-plus" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.75 2a.75.75 0 0 1 .75.75V7h4.25a.75.75 0 0 1 0 1.5H8.5v4.25a.75.75 0 0 1-1.5 0V8.5H2.75a.75.75 0 0 1 0-1.5H7V2.75A.75.75 0 0 1 7.75 2Z"></path></svg></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true" id="global-create-menu-tooltip-_R_1jpb_">Create New...</span><a data-component="IconButton" type="button" href="https://github.com/issues" data-hotkey="g i" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_63pb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-issue-opened" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true"><span id="_R_63pb_">Issues<span class="prc-src-InternalVisuallyHidden-2YaI6">(<!-- -->g then i<!-- -->)</span></span><span class="prc-TooltipV2-KeybindingHintContainer-Ymj-3 prc-TooltipV2-HasTextBefore-fdOXj" aria-hidden="true"><kbd class="prc-KeybindingHint-KeybindingHint-qpYIs prc-Text-Text-9mHv3" data-testid="keybinding-hint"><span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">g</span><span aria-hidden="true">G</span></span><span class="prc-src-InternalVisuallyHidden-2YaI6">then</span> <span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">i</span><span aria-hidden="true">I</span></span></kbd></span></span><a data-component="IconButton" type="button" href="https://github.com/pulls" data-hotkey="g p" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_a3pb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true"><span id="_R_a3pb_">Pull requests<span class="prc-src-InternalVisuallyHidden-2YaI6">(<!-- -->g then p<!-- -->)</span></span><span class="prc-TooltipV2-KeybindingHintContainer-Ymj-3 prc-TooltipV2-HasTextBefore-fdOXj" aria-hidden="true"><kbd class="prc-KeybindingHint-KeybindingHint-qpYIs prc-Text-Text-9mHv3" data-testid="keybinding-hint"><span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">g</span><span aria-hidden="true">G</span></span><span class="prc-src-InternalVisuallyHidden-2YaI6">then</span> <span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">p</span><span aria-hidden="true">P</span></span></kbd></span></span><a data-component="IconButton" type="button" href="https://github.com/repos" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_e3pb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-repo" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true" id="_R_e3pb_">Repositories</span></div><a data-component="IconButton" type="button" href="/notifications" data-hotkey="g n" class="prc-Button-ButtonBase-9n-Xk styles-module__appHeaderButton--lIuw9 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_5pb_"><svg aria-hidden="true" focusable="false" class="octicon octicon-inbox" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.8 2.06A1.75 1.75 0 0 1 4.41 1h7.18c.7 0 1.333.417 1.61 1.06l2.74 6.395c.04.093.06.194.06.295v4.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25v-4.5c0-.101.02-.202.06-.295Zm1.61.44a.25.25 0 0 0-.23.152L1.887 8H4.75a.75.75 0 0 1 .6.3L6.625 10h2.75l1.275-1.7a.75.75 0 0 1 .6-.3h2.863L11.82 2.652a.25.25 0 0 0-.23-.152Zm10.09 7h-2.875l-1.275 1.7a.75.75 0 0 1-.6.3h-3.5a.75.75 0 0 1-.6-.3L4.375 9.5H1.5v3.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true"><span id="_R_5pb_">You have no unread notifications<span class="prc-src-InternalVisuallyHidden-2YaI6">(<!-- -->g then n<!-- -->)</span></span><span class="prc-TooltipV2-KeybindingHintContainer-Ymj-3 prc-TooltipV2-HasTextBefore-fdOXj" aria-hidden="true"><kbd class="prc-KeybindingHint-KeybindingHint-qpYIs prc-Text-Text-9mHv3" data-testid="keybinding-hint"><span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">g</span><span aria-hidden="true">G</span></span><span class="prc-src-InternalVisuallyHidden-2YaI6">then</span> <span class="prc-components-Chord-DdhWN prc-components-ChordOnEmphasis-O-4BS prc-components-ChordSmall-c-P-x prc-Text-Text-9mHv3" data-kbd-chord="true"> <span class="prc-src-InternalVisuallyHidden-2YaI6">n</span><span aria-hidden="true">N</span></span></kbd></span></span><div class="GlobalUserNavDrawer-module__container--BxmdD"><button data-component="IconButton" type="button" aria-haspopup="menu" data-login="n3bkv" class="prc-Button-ButtonBase-9n-Xk GlobalUserNavDrawer-module__anchor--ZzsiJ prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_2npb_"><img data-component="Avatar" class="Box-sc-62in7e-0 lpqgUB prc-Avatar-Avatar-0xaUi" alt="User avatar" width="32" height="32" style="--avatarSize-regular:32px" src="https://avatars.githubusercontent.com/u/42347433?v=4&size=64" data-testid="github-avatar"/></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" aria-hidden="true" id="_R_2npb_">Open user navigation menu</span></div><!--$!--><template></template><!--/$--><!--$!--><template></template><!--/$--></div></div><h2 class="prc-src-InternalVisuallyHidden-2YaI6">Repository navigation</h2><nav class="prc-components-UnderlineWrapper-eT-Yj LocalNavigation-module__LocalNavigation--PimyI" aria-label="Repository" data-variant="inset"><ul class="prc-components-UnderlineItemList-xKlKC" role="list"><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M" aria-current="page" data-hotkey="g c" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-code" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" data-content="Code">Code</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/issues" data-hotkey="g i" data-react-nav="issues-react" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-issue-opened" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg></span><span data-component="text" data-content="Issues">Issues</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/pulls" data-hotkey="g p" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg></span><span data-component="text" data-content="Pull requests">Pull requests</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/actions" data-hotkey="g a" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-play" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg></span><span data-component="text" data-content="Actions">Actions</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/projects" data-hotkey="g b" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-table" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path></svg></span><span data-component="text" data-content="Projects">Projects</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/wiki" data-hotkey="g w" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="Wiki">Wiki</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/security" data-hotkey="g s" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-shield" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg></span><span data-component="text" data-content="Security">Security</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/pulse" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a href="/n3bkv/TP-Link-Tapo-P125M/settings" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-gear" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"></path></svg></span><span data-component="text" data-content="Settings">Settings</span></a></li></ul></nav></header><script type="application/json" id="__PRIMER_DATA__R_0___">{"resolvedServerColorMode":"day"}</script></div>
|
|
285
|
+
</react-partial>
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
<div class="js-global-bar" style="display: none;">
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
<qbsearch-input class="search-input" data-scope="repo:n3bkv/TP-Link-Tapo-P125M" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="gN3g_kAk3b_nbHNtuS_9RqvAzEbuQVo_hlSNiuUCS7rVn5_L_rkOx1ePul2eXXukjRpdPqnyyIXw7zlywSz66g" data-max-custom-scopes="10" data-header-redesign-enabled="true" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="n3bkv/TP-Link-Tapo-P125M" data-current-org="" data-current-owner="n3bkv" data-logged-in="true" data-copilot-chat-enabled="false" data-nl-search-enabled="false">
|
|
293
|
+
<div
|
|
294
|
+
class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center height-auto color-bg-transparent border-0 color-fg-subtle mx-0"
|
|
295
|
+
data-action="click:qbsearch-input#searchInputContainerClicked"
|
|
296
|
+
>
|
|
297
|
+
|
|
298
|
+
<input type="hidden" name="type" class="js-site-search-type-field">
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
<div class="Overlay--hidden " data-modal-dialog-overlay>
|
|
302
|
+
<modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-medium Overlay--height-auto">
|
|
303
|
+
<h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1>
|
|
304
|
+
<div class="Overlay-body Overlay-body--paddingNone">
|
|
305
|
+
|
|
306
|
+
<div data-view-component="true"> <div class="search-suggestions position-absolute width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container"
|
|
307
|
+
style="border-radius: 12px;"
|
|
308
|
+
data-target="qbsearch-input.queryBuilderContainer"
|
|
309
|
+
hidden
|
|
310
|
+
>
|
|
311
|
+
<!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get">
|
|
312
|
+
<query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder">
|
|
313
|
+
<div class="FormControl FormControl--fullWidth">
|
|
314
|
+
<label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only">
|
|
315
|
+
Search
|
|
316
|
+
</label>
|
|
317
|
+
<div
|
|
318
|
+
class="QueryBuilder-StyledInput width-fit "
|
|
319
|
+
data-target="query-builder.styledInput"
|
|
320
|
+
>
|
|
321
|
+
<span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap">
|
|
322
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual">
|
|
323
|
+
<path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
|
|
324
|
+
</svg>
|
|
325
|
+
</span>
|
|
326
|
+
<div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer">
|
|
327
|
+
<div
|
|
328
|
+
aria-hidden="true"
|
|
329
|
+
class="QueryBuilder-StyledInputContent"
|
|
330
|
+
data-target="query-builder.styledInputContent"
|
|
331
|
+
></div>
|
|
332
|
+
<div class="QueryBuilder-InputWrapper">
|
|
333
|
+
<div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div>
|
|
334
|
+
<input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-ee81c50a-2e52-42f8-9e23-b79422f93804" data-target="query-builder.input" data-action="
|
|
335
|
+
input:query-builder#inputChange
|
|
336
|
+
blur:query-builder#inputBlur
|
|
337
|
+
keydown:query-builder#inputKeydown
|
|
338
|
+
focus:query-builder#inputFocus
|
|
339
|
+
" data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" />
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
<span class="sr-only" id="query-builder-test-clear">Clear</span>
|
|
343
|
+
<button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action="
|
|
344
|
+
click:query-builder#clear
|
|
345
|
+
focus:query-builder#clearButtonFocus
|
|
346
|
+
blur:query-builder#clearButtonBlur
|
|
347
|
+
" variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual">
|
|
348
|
+
<path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path>
|
|
349
|
+
</svg>
|
|
350
|
+
</button>
|
|
351
|
+
|
|
352
|
+
</div>
|
|
353
|
+
<template id="search-icon">
|
|
354
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search">
|
|
355
|
+
<path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path>
|
|
356
|
+
</svg>
|
|
357
|
+
</template>
|
|
358
|
+
|
|
359
|
+
<template id="code-icon">
|
|
360
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
|
|
361
|
+
<path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
|
|
362
|
+
</svg>
|
|
363
|
+
</template>
|
|
364
|
+
|
|
365
|
+
<template id="file-code-icon">
|
|
366
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code">
|
|
367
|
+
<path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path>
|
|
368
|
+
</svg>
|
|
369
|
+
</template>
|
|
370
|
+
|
|
371
|
+
<template id="history-icon">
|
|
372
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history">
|
|
373
|
+
<path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path>
|
|
374
|
+
</svg>
|
|
375
|
+
</template>
|
|
376
|
+
|
|
377
|
+
<template id="repo-icon">
|
|
378
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo">
|
|
379
|
+
<path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
|
|
380
|
+
</svg>
|
|
381
|
+
</template>
|
|
382
|
+
|
|
383
|
+
<template id="bookmark-icon">
|
|
384
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark">
|
|
385
|
+
<path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path>
|
|
386
|
+
</svg>
|
|
387
|
+
</template>
|
|
388
|
+
|
|
389
|
+
<template id="plus-circle-icon">
|
|
390
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle">
|
|
391
|
+
<path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path>
|
|
392
|
+
</svg>
|
|
393
|
+
</template>
|
|
394
|
+
|
|
395
|
+
<template id="circle-icon">
|
|
396
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill">
|
|
397
|
+
<path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path>
|
|
398
|
+
</svg>
|
|
399
|
+
</template>
|
|
400
|
+
|
|
401
|
+
<template id="trash-icon">
|
|
402
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash">
|
|
403
|
+
<path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path>
|
|
404
|
+
</svg>
|
|
405
|
+
</template>
|
|
406
|
+
|
|
407
|
+
<template id="team-icon">
|
|
408
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people">
|
|
409
|
+
<path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path>
|
|
410
|
+
</svg>
|
|
411
|
+
</template>
|
|
412
|
+
|
|
413
|
+
<template id="project-icon">
|
|
414
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project">
|
|
415
|
+
<path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path>
|
|
416
|
+
</svg>
|
|
417
|
+
</template>
|
|
418
|
+
|
|
419
|
+
<template id="pencil-icon">
|
|
420
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil">
|
|
421
|
+
<path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path>
|
|
422
|
+
</svg>
|
|
423
|
+
</template>
|
|
424
|
+
|
|
425
|
+
<template id="copilot-icon">
|
|
426
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot">
|
|
427
|
+
<path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path>
|
|
428
|
+
</svg>
|
|
429
|
+
</template>
|
|
430
|
+
|
|
431
|
+
<template id="copilot-error-icon">
|
|
432
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error">
|
|
433
|
+
<path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path>
|
|
434
|
+
</svg>
|
|
435
|
+
</template>
|
|
436
|
+
|
|
437
|
+
<template id="workflow-icon">
|
|
438
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow">
|
|
439
|
+
<path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path>
|
|
440
|
+
</svg>
|
|
441
|
+
</template>
|
|
442
|
+
|
|
443
|
+
<template id="book-icon">
|
|
444
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book">
|
|
445
|
+
<path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
|
|
446
|
+
</svg>
|
|
447
|
+
</template>
|
|
448
|
+
|
|
449
|
+
<template id="code-review-icon">
|
|
450
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review">
|
|
451
|
+
<path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path>
|
|
452
|
+
</svg>
|
|
453
|
+
</template>
|
|
454
|
+
|
|
455
|
+
<template id="codespaces-icon">
|
|
456
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces">
|
|
457
|
+
<path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path>
|
|
458
|
+
</svg>
|
|
459
|
+
</template>
|
|
460
|
+
|
|
461
|
+
<template id="comment-icon">
|
|
462
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment">
|
|
463
|
+
<path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
|
|
464
|
+
</svg>
|
|
465
|
+
</template>
|
|
466
|
+
|
|
467
|
+
<template id="comment-discussion-icon">
|
|
468
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion">
|
|
469
|
+
<path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path>
|
|
470
|
+
</svg>
|
|
471
|
+
</template>
|
|
472
|
+
|
|
473
|
+
<template id="organization-icon">
|
|
474
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization">
|
|
475
|
+
<path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path>
|
|
476
|
+
</svg>
|
|
477
|
+
</template>
|
|
478
|
+
|
|
479
|
+
<template id="rocket-icon">
|
|
480
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket">
|
|
481
|
+
<path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
|
|
482
|
+
</svg>
|
|
483
|
+
</template>
|
|
484
|
+
|
|
485
|
+
<template id="shield-check-icon">
|
|
486
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check">
|
|
487
|
+
<path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
|
|
488
|
+
</svg>
|
|
489
|
+
</template>
|
|
490
|
+
|
|
491
|
+
<template id="heart-icon">
|
|
492
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart">
|
|
493
|
+
<path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path>
|
|
494
|
+
</svg>
|
|
495
|
+
</template>
|
|
496
|
+
|
|
497
|
+
<template id="server-icon">
|
|
498
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server">
|
|
499
|
+
<path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path>
|
|
500
|
+
</svg>
|
|
501
|
+
</template>
|
|
502
|
+
|
|
503
|
+
<template id="globe-icon">
|
|
504
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe">
|
|
505
|
+
<path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path>
|
|
506
|
+
</svg>
|
|
507
|
+
</template>
|
|
508
|
+
|
|
509
|
+
<template id="issue-opened-icon">
|
|
510
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
|
|
511
|
+
<path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
|
|
512
|
+
</svg>
|
|
513
|
+
</template>
|
|
514
|
+
|
|
515
|
+
<template id="device-mobile-icon">
|
|
516
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile">
|
|
517
|
+
<path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
|
|
518
|
+
</svg>
|
|
519
|
+
</template>
|
|
520
|
+
|
|
521
|
+
<template id="package-icon">
|
|
522
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package">
|
|
523
|
+
<path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path>
|
|
524
|
+
</svg>
|
|
525
|
+
</template>
|
|
526
|
+
|
|
527
|
+
<template id="credit-card-icon">
|
|
528
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card">
|
|
529
|
+
<path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path>
|
|
530
|
+
</svg>
|
|
531
|
+
</template>
|
|
532
|
+
|
|
533
|
+
<template id="play-icon">
|
|
534
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
|
|
535
|
+
<path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
|
|
536
|
+
</svg>
|
|
537
|
+
</template>
|
|
538
|
+
|
|
539
|
+
<template id="gift-icon">
|
|
540
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift">
|
|
541
|
+
<path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path>
|
|
542
|
+
</svg>
|
|
543
|
+
</template>
|
|
544
|
+
|
|
545
|
+
<template id="code-square-icon">
|
|
546
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square">
|
|
547
|
+
<path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
|
|
548
|
+
</svg>
|
|
549
|
+
</template>
|
|
550
|
+
|
|
551
|
+
<template id="device-desktop-icon">
|
|
552
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop">
|
|
553
|
+
<path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path>
|
|
554
|
+
</svg>
|
|
555
|
+
</template>
|
|
556
|
+
|
|
557
|
+
<div class="position-relative">
|
|
558
|
+
<ul
|
|
559
|
+
role="listbox"
|
|
560
|
+
class="ActionListWrap QueryBuilder-ListWrap"
|
|
561
|
+
aria-label="Suggestions"
|
|
562
|
+
data-action="
|
|
563
|
+
combobox-commit:query-builder#comboboxCommit
|
|
564
|
+
mousedown:query-builder#resultsMousedown
|
|
565
|
+
"
|
|
566
|
+
data-target="query-builder.resultsList"
|
|
567
|
+
data-persist-list=false
|
|
568
|
+
id="query-builder-test-results"
|
|
569
|
+
tabindex="-1"
|
|
570
|
+
></ul>
|
|
571
|
+
</div>
|
|
572
|
+
<div class="FormControl-inlineValidation" id="validation-ee81c50a-2e52-42f8-9e23-b79422f93804" hidden="hidden">
|
|
573
|
+
<span class="FormControl-inlineValidation--visual">
|
|
574
|
+
<svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill">
|
|
575
|
+
<path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path>
|
|
576
|
+
</svg>
|
|
577
|
+
</span>
|
|
578
|
+
<span></span>
|
|
579
|
+
</div> </div>
|
|
580
|
+
<div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div>
|
|
581
|
+
</query-builder></form>
|
|
582
|
+
<div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt">
|
|
583
|
+
<a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a> <div class="d-flex flex-1"></div>
|
|
584
|
+
<button data-action="click:qbsearch-input#showFeedbackDialog" type="button" data-view-component="true" class="Button--link Button--medium Button color-fg-accent text-normal ml-2"> <span class="Button-content">
|
|
585
|
+
<span class="Button-label">Give feedback</span>
|
|
586
|
+
</span>
|
|
587
|
+
</button>
|
|
588
|
+
</div>
|
|
589
|
+
</div>
|
|
590
|
+
</div>
|
|
591
|
+
|
|
592
|
+
</div>
|
|
593
|
+
</modal-dialog></div>
|
|
594
|
+
</div>
|
|
595
|
+
<div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div>
|
|
596
|
+
<div class="color-fg-default">
|
|
597
|
+
|
|
598
|
+
<dialog-helper>
|
|
599
|
+
<dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll">
|
|
600
|
+
<div data-view-component="true" class="Overlay-header">
|
|
601
|
+
<div class="Overlay-headerContentWrap">
|
|
602
|
+
<div class="Overlay-titleWrap">
|
|
603
|
+
<h1 class="Overlay-title " id="feedback-dialog-title">
|
|
604
|
+
Provide feedback
|
|
605
|
+
</h1>
|
|
606
|
+
|
|
607
|
+
</div>
|
|
608
|
+
<div class="Overlay-actionWrap">
|
|
609
|
+
<button data-close-dialog-id="feedback-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
|
|
610
|
+
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
|
|
611
|
+
</svg></button>
|
|
612
|
+
</div>
|
|
613
|
+
</div>
|
|
614
|
+
|
|
615
|
+
</div>
|
|
616
|
+
<scrollable-region data-labelled-by="feedback-dialog-title">
|
|
617
|
+
<div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="dHqhrf8XXFcU6FoVdHX6oHWBW5NmviFE-lF5K3VlvafEkt4Maip5Gz9ajJElSpXE2bcZ_U7xqv4HSwuBtAewgg" />
|
|
618
|
+
<p>We read every piece of feedback, and take your input very seriously.</p>
|
|
619
|
+
<textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea>
|
|
620
|
+
<input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox">
|
|
621
|
+
<label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label>
|
|
622
|
+
</form></div>
|
|
623
|
+
</scrollable-region>
|
|
624
|
+
<div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel
|
|
625
|
+
</button>
|
|
626
|
+
<button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback
|
|
627
|
+
</button>
|
|
628
|
+
</div>
|
|
629
|
+
</dialog></dialog-helper>
|
|
630
|
+
|
|
631
|
+
<custom-scopes data-target="qbsearch-input.customScopesManager">
|
|
632
|
+
|
|
633
|
+
<dialog-helper>
|
|
634
|
+
<dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll">
|
|
635
|
+
<div data-view-component="true" class="Overlay-header Overlay-header--divided">
|
|
636
|
+
<div class="Overlay-headerContentWrap">
|
|
637
|
+
<div class="Overlay-titleWrap">
|
|
638
|
+
<h1 class="Overlay-title " id="custom-scopes-dialog-title">
|
|
639
|
+
Saved searches
|
|
640
|
+
</h1>
|
|
641
|
+
<h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2>
|
|
642
|
+
</div>
|
|
643
|
+
<div class="Overlay-actionWrap">
|
|
644
|
+
<button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
|
|
645
|
+
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
|
|
646
|
+
</svg></button>
|
|
647
|
+
</div>
|
|
648
|
+
</div>
|
|
649
|
+
|
|
650
|
+
</div>
|
|
651
|
+
<scrollable-region data-labelled-by="custom-scopes-dialog-title">
|
|
652
|
+
<div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div>
|
|
653
|
+
|
|
654
|
+
<div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm">
|
|
655
|
+
<!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="gli1WVEoyIRQZz5cCvo7GYgHe0wKw1nFLDEHiaF9tKOO5w_VN1g39Apz8U2uXl8VSdF7szoOazYPAIJ1nlMejQ" />
|
|
656
|
+
<div data-target="custom-scopes.customScopesModalDialogFlash"></div>
|
|
657
|
+
|
|
658
|
+
<input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField">
|
|
659
|
+
|
|
660
|
+
<div class="form-group">
|
|
661
|
+
<label for="custom_scope_name">Name</label>
|
|
662
|
+
<auto-check src="/search/custom_scopes/check_name" required>
|
|
663
|
+
<input
|
|
664
|
+
type="text"
|
|
665
|
+
name="custom_scope_name"
|
|
666
|
+
id="custom_scope_name"
|
|
667
|
+
data-target="custom-scopes.customScopesNameField"
|
|
668
|
+
class="form-control"
|
|
669
|
+
autocomplete="off"
|
|
670
|
+
placeholder="github-ruby"
|
|
671
|
+
required
|
|
672
|
+
maxlength="50">
|
|
673
|
+
<input type="hidden" value="xNGnsd03pzoqf5ZgRgyeUQlaxrJlklWs-UJ0PX5OJCeFrkWXxYhAh4YoTAQgvgM4venxyaBTHBkCEZDE6wSYAw" data-csrf="true" />
|
|
674
|
+
</auto-check>
|
|
675
|
+
</div>
|
|
676
|
+
|
|
677
|
+
<div class="form-group">
|
|
678
|
+
<label for="custom_scope_query">Query</label>
|
|
679
|
+
<input
|
|
680
|
+
type="text"
|
|
681
|
+
name="custom_scope_query"
|
|
682
|
+
id="custom_scope_query"
|
|
683
|
+
data-target="custom-scopes.customScopesQueryField"
|
|
684
|
+
class="form-control"
|
|
685
|
+
autocomplete="off"
|
|
686
|
+
placeholder="(repo:mona/a OR repo:mona/b) AND lang:python"
|
|
687
|
+
required
|
|
688
|
+
maxlength="500">
|
|
689
|
+
</div>
|
|
690
|
+
|
|
691
|
+
<p class="text-small color-fg-muted">
|
|
692
|
+
To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>.
|
|
693
|
+
</p>
|
|
694
|
+
</form> </div>
|
|
695
|
+
|
|
696
|
+
<div data-target="custom-scopes.manageCustomScopesForm">
|
|
697
|
+
<div data-target="custom-scopes.list"></div>
|
|
698
|
+
</div>
|
|
699
|
+
|
|
700
|
+
</div>
|
|
701
|
+
</scrollable-region>
|
|
702
|
+
<div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel
|
|
703
|
+
</button>
|
|
704
|
+
<button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search
|
|
705
|
+
</button>
|
|
706
|
+
</div>
|
|
707
|
+
</dialog></dialog-helper>
|
|
708
|
+
</custom-scopes>
|
|
709
|
+
</div>
|
|
710
|
+
</qbsearch-input> <input type="hidden" value="X7SfrD-XqHe0HCQ8kQktaOUPD5rGMyZXwDvWKlGEshIcwkG4pCDOpFqYTIuJkGPQSg_HqMjg6yMsJ66HjTayVA" data-csrf="true" class="js-data-jump-to-suggestions-path-csrf" />
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
</div>
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
<div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
|
|
717
|
+
|
|
718
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
|
|
719
|
+
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
|
|
720
|
+
</svg>
|
|
721
|
+
<span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
|
|
722
|
+
<span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
|
|
723
|
+
<span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
|
|
724
|
+
|
|
725
|
+
<button id="icon-button-2d8b9af2-6dcf-454a-94d7-d0048574c951" aria-labelledby="tooltip-940d50ce-52bb-4d61-9fd0-963f61294a60" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
|
|
726
|
+
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
|
|
727
|
+
</svg>
|
|
728
|
+
</button><tool-tip id="tooltip-940d50ce-52bb-4d61-9fd0-963f61294a60" for="icon-button-2d8b9af2-6dcf-454a-94d7-d0048574c951" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
</div>
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
</div>
|
|
736
|
+
|
|
737
|
+
<div id="start-of-content" class="show-on-focus"></div>
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
<div id="js-flash-container" class="flash-container" data-turbo-replace>
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
<template class="js-flash-template">
|
|
752
|
+
|
|
753
|
+
<div class="flash flash-full {{ className }}">
|
|
754
|
+
<div >
|
|
755
|
+
<button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
|
|
756
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
|
|
757
|
+
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
|
|
758
|
+
</svg>
|
|
759
|
+
</button>
|
|
760
|
+
<div aria-atomic="true" role="alert" class="js-flash-alert">
|
|
761
|
+
|
|
762
|
+
<div>{{ message }}</div>
|
|
763
|
+
|
|
764
|
+
</div>
|
|
765
|
+
</div>
|
|
766
|
+
</div>
|
|
767
|
+
</template>
|
|
768
|
+
</div>
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
<notification-shelf-watcher data-base-url="https://github.com/notifications/beta/shelf" data-channel="eyJjIjoibm90aWZpY2F0aW9uLWNoYW5nZWQ6NDIzNDc0MzMiLCJ0IjoxNzY4NjY5OTY3fQ==--50395df3fd85ee3b70f9d313f81a3ada5601c54802481ce153a9247d068c68a5" data-view-component="true" class="js-socket-channel"></notification-shelf-watcher>
|
|
773
|
+
<div hidden data-initial data-target="notification-shelf-watcher.placeholder"></div>
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
|
|
780
|
+
<div
|
|
781
|
+
class="application-main "
|
|
782
|
+
data-commit-hovercards-enabled
|
|
783
|
+
data-discussion-hovercards-enabled
|
|
784
|
+
data-issue-and-pr-hovercards-enabled
|
|
785
|
+
data-project-hovercards-enabled
|
|
786
|
+
>
|
|
787
|
+
<div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
|
|
788
|
+
<main id="js-repo-pjax-container" >
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
<div id="repository-container-header" data-turbo-replace hidden ></div>
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
|
|
803
|
+
<div id="repo-content-pjax-container" class="repository-content " >
|
|
804
|
+
<a href="https://github.dev/" class="d-none js-github-dev-shortcut" data-hotkey=".,Mod+Alt+.">Open in github.dev</a>
|
|
805
|
+
<a href="https://github.dev/" class="d-none js-github-dev-new-tab-shortcut" data-hotkey="Shift+.,Shift+>,>" target="_blank" rel="noopener noreferrer">Open in a new github.dev tab</a>
|
|
806
|
+
<a class="d-none" data-hotkey=",,Mod+Alt+," target="_blank" href="/codespaces/new/n3bkv/TP-Link-Tapo-P125M/tree/main?resume=1">Open in codespace</a>
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
|
|
822
|
+
<react-app
|
|
823
|
+
app-name="react-code-view"
|
|
824
|
+
initial-path="/n3bkv/TP-Link-Tapo-P125M/blob/main/README.md"
|
|
825
|
+
style="display: block; min-height: calc(100vh - 64px);"
|
|
826
|
+
data-attempted-ssr="true"
|
|
827
|
+
data-ssr="true"
|
|
828
|
+
data-lazy="false"
|
|
829
|
+
data-alternate="false"
|
|
830
|
+
data-data-router-enabled="false"
|
|
831
|
+
data-react-profiling="true"
|
|
832
|
+
>
|
|
833
|
+
|
|
834
|
+
<script type="application/json" data-target="react-app.embeddedData">{"payload":{"allShortcutsEnabled":true,"fileTree":{"":{"items":[{"name":"Node-Red-Tapo-P125M.json","path":"Node-Red-Tapo-P125M.json","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"tapo.js","path":"tapo.js","contentType":"file"}],"totalCount":3}},"fileTreeProcessingTime":7.664619,"foldersToFetch":[],"incompleteFileTree":false,"repo":{"id":1134502255,"defaultBranch":"main","name":"TP-Link-Tapo-P125M","ownerLogin":"n3bkv","currentUserCanPush":true,"isFork":false,"isEmpty":false,"createdAt":"2026-01-14T12:04:09.000-08:00","ownerAvatar":"https://avatars.githubusercontent.com/u/42347433?v=4","public":true,"private":false,"isOrgOwned":false},"codeLineWrapEnabled":false,"symbolsExpanded":true,"treeExpanded":true,"refInfo":{"name":"main","listCacheKey":"v0:1768421103.0","canEdit":true,"refType":"branch","currentOid":"4f3838120c50455a718640796526121e82f98035","canEditOnDefaultBranch":true,"fileExistsOnDefault":true},"path":"README.md","currentUser":{"id":42347433,"login":"n3bkv","userEmail":"dave99ca@yahoo.com"},"blob":{"rawLines":null,"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/n3bkv/TP-Link-Tapo-P125M/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":false},"displayName":"README.md","displayUrl":"https://github.com/n3bkv/TP-Link-Tapo-P125M/blob/main/README.md?raw=true","headerInfo":{"blobSize":"4.03 KB","deleteTooltip":"Delete this file","editTooltip":"Edit this file","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"2b095a5","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fn3bkv%2FTP-Link-Tapo-P125M%2Fblob%2Fmain%2FREADME.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)","anchor":"tp-link-tapo-p125m-local-control-with-node-red-raspberry-pi","htmlText":"TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)"},{"level":2,"text":"What this does","anchor":"what-this-does","htmlText":"What this does"},{"level":2,"text":"Requirements","anchor":"requirements","htmlText":"Requirements"},{"level":2,"text":"Why not Matter or Home Assistant?","anchor":"why-not-matter-or-home-assistant","htmlText":"Why not Matter or Home Assistant?"},{"level":2,"text":"Installation","anchor":"installation","htmlText":"Installation"},{"level":3,"text":"1) Create the working directory","anchor":"1-create-the-working-directory","htmlText":"1) Create the working directory"},{"level":3,"text":"2) Install the Tapo control library","anchor":"2-install-the-tapo-control-library","htmlText":"2) Install the Tapo control library"},{"level":3,"text":"3) Create the control script","anchor":"3-create-the-control-script","htmlText":"3) Create the control script"},{"level":3,"text":"4) Create the environment file (credentials)","anchor":"4-create-the-environment-file-credentials","htmlText":"4) Create the environment file (credentials)"},{"level":2,"text":"Test from the command line","anchor":"test-from-the-command-line","htmlText":"Test from the command line"},{"level":2,"text":"Node-RED Notes","anchor":"node-red-notes","htmlText":"Node-RED Notes"},{"level":2,"text":"Sample Node-RED Control Flow","anchor":"sample-node-red-control-flow","htmlText":"Sample Node-RED Control Flow"},{"level":2,"text":"Security","anchor":"security","htmlText":"Security"},{"level":2,"text":"Supported Devices","anchor":"supported-devices","htmlText":"Supported Devices"},{"level":2,"text":"Support This Project","anchor":"support-this-project","htmlText":"Support This Project"},{"level":2,"text":"More Info","anchor":"more-info","htmlText":"More Info"}],"lineInfo":{"truncatedLoc":"214","truncatedSloc":"144"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/n3bkv/TP-Link-Tapo-P125M/blob/main/README.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/n3bkv/TP-Link-Tapo-P125M/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/n3bkv/TP-Link-Tapo-P125M/raw/refs/heads/main/README.md","renderImageOrRaw":false,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)\u003c/h1\u003e\u003ca id=\"user-content-tp-link-tapo-p125m-local-control-with-node-red-raspberry-pi\" class=\"anchor\" aria-label=\"Permalink: TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)\" href=\"#tp-link-tapo-p125m-local-control-with-node-red-raspberry-pi\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis project provides \u003cstrong\u003elocal (LAN) on/off control\u003c/strong\u003e of \u003cstrong\u003eTP-Link Tapo smart plugs (P125M)\u003c/strong\u003e from \u003cstrong\u003eNode-RED\u003c/strong\u003e, running natively on \u003cstrong\u003eRaspberry Pi OS\u003c/strong\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNo Home Assistant or Matter required.\u003cbr\u003e\nNo cloud dependency once credentials are set.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt works on \u003cstrong\u003eRaspberry Pi 3 (armv7 / 32-bit)\u003c/strong\u003e, where Matter containers are not supported.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat this does\u003c/h2\u003e\u003ca id=\"user-content-what-this-does\" class=\"anchor\" aria-label=\"Permalink: What this does\" href=\"#what-this-does\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eControls a \u003cstrong\u003eTP-Link Tapo P125M\u003c/strong\u003e outlet directly over your LAN\u003c/li\u003e\n\u003cli\u003eUses a small \u003cstrong\u003eNode.js CLI script\u003c/strong\u003e (\u003ccode\u003etapo.js\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eNode-RED calls the script via an \u003cstrong\u003eexec\u003c/strong\u003e node\u003c/li\u003e\n\u003cli\u003eReturns \u003cstrong\u003eJSON output\u003c/strong\u003e that Node-RED can parse\u003c/li\u003e\n\u003cli\u003eSupports:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eon\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eoff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatus\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRequirements\u003c/h2\u003e\u003ca id=\"user-content-requirements\" class=\"anchor\" aria-label=\"Permalink: Requirements\" href=\"#requirements\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eRaspberry Pi running \u003cstrong\u003eRaspberry Pi OS\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNode.js 18+\u003c/strong\u003e (Node 20 works)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNode-RED (native install)\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eTP-Link \u003cstrong\u003eTapo P125M\u003c/strong\u003e smart plug\u003c/li\u003e\n\u003cli\u003eTapo account email + password\u003c/li\u003e\n\u003cli\u003ePlug must already be set up and working in the \u003cstrong\u003eTapo mobile app\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhy not Matter or Home Assistant?\u003c/h2\u003e\u003ca id=\"user-content-why-not-matter-or-home-assistant\" class=\"anchor\" aria-label=\"Permalink: Why not Matter or Home Assistant?\" href=\"#why-not-matter-or-home-assistant\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe Matter server images provided by Home Assistant \u003cstrong\u003edo not support armv7 (32-bit)\u003c/strong\u003e.\u003cbr\u003e\nRaspberry Pi 3 cannot run Matter Server containers.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis approach:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIs local and fast\u003c/li\u003e\n\u003cli\u003eAvoids Docker + firewall complexity\u003c/li\u003e\n\u003cli\u003eIntegrates cleanly with Node-RED automations\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstallation\u003c/h2\u003e\u003ca id=\"user-content-installation\" class=\"anchor\" aria-label=\"Permalink: Installation\" href=\"#installation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1) Create the working directory\u003c/h3\u003e\u003ca id=\"user-content-1-create-the-working-directory\" class=\"anchor\" aria-label=\"Permalink: 1) Create the working directory\" href=\"#1-create-the-working-directory\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo mkdir -p /opt/tapo\nsudo chown -R pi:pi /opt/tapo\ncd /opt/tapo\"\u003e\u003cpre\u003esudo mkdir -p /opt/tapo\nsudo chown -R pi:pi /opt/tapo\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e /opt/tapo\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2) Install the Tapo control library\u003c/h3\u003e\u003ca id=\"user-content-2-install-the-tapo-control-library\" class=\"anchor\" aria-label=\"Permalink: 2) Install the Tapo control library\" href=\"#2-install-the-tapo-control-library\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm init -y\nnpm install tp-link-tapo-connect\"\u003e\u003cpre\u003enpm init -y\nnpm install tp-link-tapo-connect\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3) Create the control script\u003c/h3\u003e\u003ca id=\"user-content-3-create-the-control-script\" class=\"anchor\" aria-label=\"Permalink: 3) Create the control script\" href=\"#3-create-the-control-script\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCreate \u003ccode\u003e/opt/tapo/tapo.js\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nano /opt/tapo/tapo.js\"\u003e\u003cpre\u003enano /opt/tapo/tapo.js\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePaste the following:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"#!/usr/bin/env node\n\u0026quot;use strict\u0026quot;;\n\nconst { loginDeviceByIp } = require(\u0026quot;tp-link-tapo-connect\u0026quot;);\n\nasync function main() {\n const cmd = (process.argv[2] || \u0026quot;\u0026quot;).toLowerCase();\n const email = process.env.TAPO_EMAIL;\n const password = process.env.TAPO_PASSWORD;\n const ip = process.env.TAPO_IP;\n\n if (!email || !password || !ip) {\n throw new Error(\u0026quot;Missing env vars. Need TAPO_EMAIL, TAPO_PASSWORD, TAPO_IP\u0026quot;);\n }\n if (![\u0026quot;on\u0026quot;, \u0026quot;off\u0026quot;, \u0026quot;status\u0026quot;].includes(cmd)) {\n throw new Error(\u0026quot;Usage: tapo.js \u0026lt;on|off|status\u0026gt;\u0026quot;);\n }\n\n const device = await loginDeviceByIp(email, password, ip);\n\n if (cmd === \u0026quot;on\u0026quot;) await device.turnOn();\n if (cmd === \u0026quot;off\u0026quot;) await device.turnOff();\n\n const info = await device.getDeviceInfo();\n\n const out = {\n ok: true,\n cmd,\n ip,\n device_on: info?.result?.device_on ?? info?.device_on ?? null,\n model: info?.result?.model ?? info?.model ?? null,\n raw: info\n };\n\n process.stdout.write(JSON.stringify(out));\n}\n\nmain().catch((err) =\u0026gt; {\n const out = { ok: false, error: String(err?.message || err) };\n process.stdout.write(JSON.stringify(out));\n process.exit(1);\n});\"\u003e\u003cpre\u003e#!/usr/bin/env node\n\u003cspan class=\"pl-s\"\u003e\"use strict\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e loginDeviceByIp \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003erequire\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"tp-link-tapo-connect\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003easync\u003c/span\u003e \u003cspan class=\"pl-k\"\u003efunction\u003c/span\u003e \u003cspan class=\"pl-en\"\u003emain\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecmd\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargv\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003etoLowerCase\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eemail\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eenv\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eTAPO_EMAIL\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epassword\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eenv\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eTAPO_PASSWORD\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eip\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eenv\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eTAPO_IP\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eemail\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epassword\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eip\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-v\"\u003eError\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Missing env vars. Need TAPO_EMAIL, TAPO_PASSWORD, TAPO_IP\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"on\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"off\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"status\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eincludes\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ecmd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-v\"\u003eError\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Usage: tapo.js \u0026lt;on|off|status\u0026gt;\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edevice\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eawait\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eloginDeviceByIp\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eemail\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epassword\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eip\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ecmd\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e===\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"on\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eawait\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edevice\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eturnOn\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ecmd\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e===\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"off\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eawait\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edevice\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eturnOff\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003einfo\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eawait\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edevice\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003egetDeviceInfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eok\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n cmd\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n ip\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003edevice_on\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003einfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edevice_on\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003einfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edevice_on\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003enull\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003emodel\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003einfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eresult\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003emodel\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003einfo\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003emodel\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003enull\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eraw\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003einfo\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003estdout\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ewrite\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eJSON\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003estringify\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003emain\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eerr\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eok\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eerror\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eerr\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e?.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003emessage\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e||\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eerr\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003estdout\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ewrite\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eJSON\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003estringify\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003eprocess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eexit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake it executable:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"chmod +x /opt/tapo/tapo.js\"\u003e\u003cpre\u003echmod +x /opt/tapo/tapo.js\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4) Create the environment file (credentials)\u003c/h3\u003e\u003ca id=\"user-content-4-create-the-environment-file-credentials\" class=\"anchor\" aria-label=\"Permalink: 4) Create the environment file (credentials)\" href=\"#4-create-the-environment-file-credentials\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCreate \u003ccode\u003e/opt/tapo/.env\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nano /opt/tapo/.env\"\u003e\u003cpre\u003enano /opt/tapo/.env\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export TAPO_EMAIL=\u0026quot;you@example.com\u0026quot;\nexport TAPO_PASSWORD=\u0026quot;your_tapo_password\u0026quot;\nexport TAPO_IP=\u0026quot;192.168.1.50\u0026quot;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e TAPO_EMAIL=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eyou@example.com\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e TAPO_PASSWORD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eyour_tapo_password\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e TAPO_IP=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e192.168.1.50\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSecure it:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"chmod 600 /opt/tapo/.env\nchown pi:pi /opt/tapo/.env\"\u003e\u003cpre\u003echmod 600 /opt/tapo/.env\nchown pi:pi /opt/tapo/.env\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTest from the command line\u003c/h2\u003e\u003ca id=\"user-content-test-from-the-command-line\" class=\"anchor\" aria-label=\"Permalink: Test from the command line\" href=\"#test-from-the-command-line\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bash -lc 'source /opt/tapo/.env \u0026amp;\u0026amp; node /opt/tapo/tapo.js status'\nbash -lc 'source /opt/tapo/.env \u0026amp;\u0026amp; node /opt/tapo/tapo.js on'\nbash -lc 'source /opt/tapo/.env \u0026amp;\u0026amp; node /opt/tapo/tapo.js off'\"\u003e\u003cpre\u003ebash -lc \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003esource /opt/tapo/.env \u0026amp;\u0026amp; node /opt/tapo/tapo.js status\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\nbash -lc \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003esource /opt/tapo/.env \u0026amp;\u0026amp; node /opt/tapo/tapo.js on\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\nbash -lc \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003esource /opt/tapo/.env \u0026amp;\u0026amp; node /opt/tapo/tapo.js off\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNode-RED Notes\u003c/h2\u003e\u003ca id=\"user-content-node-red-notes\" class=\"anchor\" aria-label=\"Permalink: Node-RED Notes\" href=\"#node-red-notes\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eUse \u003cstrong\u003eexec nodes with spawn disabled\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eBuffer stdout before JSON parsing\u003c/li\u003e\n\u003cli\u003eNode-RED user must have read access to \u003ccode\u003e/opt/tapo/.env\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eCheck Node-RED user:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ps -o user= -C node-red\"\u003e\u003cpre\u003eps -o user= -C node-red\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSample Node-RED Control Flow\u003c/h2\u003e\u003ca id=\"user-content-sample-node-red-control-flow\" class=\"anchor\" aria-label=\"Permalink: Sample Node-RED Control Flow\" href=\"#sample-node-red-control-flow\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee the file Node-Red-Tapo-P125M.json for a sample Node-RED plug flow.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSecurity\u003c/h2\u003e\u003ca id=\"user-content-security\" class=\"anchor\" aria-label=\"Permalink: Security\" href=\"#security\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eCredentials stored outside flows\u003c/li\u003e\n\u003cli\u003eNo cloud calls after authentication\u003c/li\u003e\n\u003cli\u003eLocal LAN only\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupported Devices\u003c/h2\u003e\u003ca id=\"user-content-supported-devices\" class=\"anchor\" aria-label=\"Permalink: Supported Devices\" href=\"#supported-devices\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eTapo P125M\u003c/strong\u003e (confirmed)\u003c/li\u003e\n\u003cli\u003eOther Tapo plugs may work but are not guaranteed\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupport This Project\u003c/h2\u003e\u003ca id=\"user-content-support-this-project\" class=\"anchor\" aria-label=\"Permalink: Support This Project\" href=\"#support-this-project\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you find this useful, star ⭐ the repo! It helps others discover it.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMore Info\u003c/h2\u003e\u003ca id=\"user-content-more-info\" class=\"anchor\" aria-label=\"Permalink: More Info\" href=\"#more-info\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBlog: \u003ca href=\"https://hamradiohacks.blogspot.com\" rel=\"nofollow\"\u003ehttps://hamradiohacks.blogspot.com\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eGitHub: \u003ca href=\"https://github.com/n3bkv\"\u003ehttps://github.com/n3bkv\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003c/article\u003e","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)","kind":"section_1","ident_start":2,"ident_end":63,"extent_start":0,"extent_end":4127,"fully_qualified_name":"TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)","ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":63}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":214,"utf16_col":0}}},{"name":"What this does","kind":"section_2","ident_start":408,"ident_end":422,"extent_start":405,"extent_end":689,"fully_qualified_name":"What this does","ident_utf16":{"start":{"line_number":11,"utf16_col":3},"end":{"line_number":11,"utf16_col":17}},"extent_utf16":{"start":{"line_number":11,"utf16_col":0},"end":{"line_number":24,"utf16_col":0}}},{"name":"Requirements","kind":"section_2","ident_start":692,"ident_end":704,"extent_start":689,"extent_end":958,"fully_qualified_name":"Requirements","ident_utf16":{"start":{"line_number":24,"utf16_col":3},"end":{"line_number":24,"utf16_col":15}},"extent_utf16":{"start":{"line_number":24,"utf16_col":0},"end":{"line_number":35,"utf16_col":0}}},{"name":"Why not Matter or Home Assistant?","kind":"section_2","ident_start":961,"ident_end":994,"extent_start":958,"extent_end":1265,"fully_qualified_name":"Why not Matter or Home Assistant?","ident_utf16":{"start":{"line_number":35,"utf16_col":3},"end":{"line_number":35,"utf16_col":36}},"extent_utf16":{"start":{"line_number":35,"utf16_col":0},"end":{"line_number":48,"utf16_col":0}}},{"name":"Installation","kind":"section_2","ident_start":1268,"ident_end":1280,"extent_start":1265,"extent_end":3144,"fully_qualified_name":"Installation","ident_utf16":{"start":{"line_number":48,"utf16_col":3},"end":{"line_number":48,"utf16_col":15}},"extent_utf16":{"start":{"line_number":48,"utf16_col":0},"end":{"line_number":157,"utf16_col":0}}},{"name":"1) Create the working directory","kind":"section_3","ident_start":1286,"ident_end":1317,"extent_start":1282,"extent_end":1404,"fully_qualified_name":"1) Create the working directory","ident_utf16":{"start":{"line_number":50,"utf16_col":4},"end":{"line_number":50,"utf16_col":35}},"extent_utf16":{"start":{"line_number":50,"utf16_col":0},"end":{"line_number":60,"utf16_col":0}}},{"name":"2) Install the Tapo control library","kind":"section_3","ident_start":1408,"ident_end":1443,"extent_start":1404,"extent_end":1508,"fully_qualified_name":"2) Install the Tapo control library","ident_utf16":{"start":{"line_number":60,"utf16_col":4},"end":{"line_number":60,"utf16_col":39}},"extent_utf16":{"start":{"line_number":60,"utf16_col":0},"end":{"line_number":69,"utf16_col":0}}},{"name":"3) Create the control script","kind":"section_3","ident_start":1512,"ident_end":1540,"extent_start":1508,"extent_end":2822,"fully_qualified_name":"3) Create the control script","ident_utf16":{"start":{"line_number":69,"utf16_col":4},"end":{"line_number":69,"utf16_col":32}},"extent_utf16":{"start":{"line_number":69,"utf16_col":0},"end":{"line_number":132,"utf16_col":0}}},{"name":"4) Create the environment file (credentials)","kind":"section_3","ident_start":2826,"ident_end":2870,"extent_start":2822,"extent_end":3144,"fully_qualified_name":"4) Create the environment file (credentials)","ident_utf16":{"start":{"line_number":132,"utf16_col":4},"end":{"line_number":132,"utf16_col":48}},"extent_utf16":{"start":{"line_number":132,"utf16_col":0},"end":{"line_number":157,"utf16_col":0}}},{"name":"Test from the command line","kind":"section_2","ident_start":3147,"ident_end":3173,"extent_start":3144,"extent_end":3384,"fully_qualified_name":"Test from the command line","ident_utf16":{"start":{"line_number":157,"utf16_col":3},"end":{"line_number":157,"utf16_col":29}},"extent_utf16":{"start":{"line_number":157,"utf16_col":0},"end":{"line_number":167,"utf16_col":0}}},{"name":"Node-RED Notes","kind":"section_2","ident_start":3387,"ident_end":3401,"extent_start":3384,"extent_end":3602,"fully_qualified_name":"Node-RED Notes","ident_utf16":{"start":{"line_number":167,"utf16_col":3},"end":{"line_number":167,"utf16_col":17}},"extent_utf16":{"start":{"line_number":167,"utf16_col":0},"end":{"line_number":180,"utf16_col":0}}},{"name":"Sample Node-RED Control Flow","kind":"section_2","ident_start":3605,"ident_end":3633,"extent_start":3602,"extent_end":3712,"fully_qualified_name":"Sample Node-RED Control Flow","ident_utf16":{"start":{"line_number":180,"utf16_col":3},"end":{"line_number":180,"utf16_col":31}},"extent_utf16":{"start":{"line_number":180,"utf16_col":0},"end":{"line_number":186,"utf16_col":0}}},{"name":"Security","kind":"section_2","ident_start":3715,"ident_end":3723,"extent_start":3712,"extent_end":3821,"fully_qualified_name":"Security","ident_utf16":{"start":{"line_number":186,"utf16_col":3},"end":{"line_number":186,"utf16_col":11}},"extent_utf16":{"start":{"line_number":186,"utf16_col":0},"end":{"line_number":194,"utf16_col":0}}},{"name":"Supported Devices","kind":"section_2","ident_start":3824,"ident_end":3841,"extent_start":3821,"extent_end":3929,"fully_qualified_name":"Supported Devices","ident_utf16":{"start":{"line_number":194,"utf16_col":3},"end":{"line_number":194,"utf16_col":20}},"extent_utf16":{"start":{"line_number":194,"utf16_col":0},"end":{"line_number":201,"utf16_col":0}}},{"name":"Support This Project","kind":"section_2","ident_start":3932,"ident_end":3952,"extent_start":3929,"extent_end":4033,"fully_qualified_name":"Support This Project","ident_utf16":{"start":{"line_number":201,"utf16_col":3},"end":{"line_number":201,"utf16_col":23}},"extent_utf16":{"start":{"line_number":201,"utf16_col":0},"end":{"line_number":207,"utf16_col":0}}},{"name":"More Info","kind":"section_2","ident_start":4036,"ident_end":4045,"extent_start":4033,"extent_end":4127,"fully_qualified_name":"More Info","ident_utf16":{"start":{"line_number":207,"utf16_col":3},"end":{"line_number":207,"utf16_col":12}},"extent_utf16":{"start":{"line_number":207,"utf16_col":0},"end":{"line_number":214,"utf16_col":0}}}]}},"copilotInfo":{"documentationUrl":"https://docs.github.com/copilot/overview-of-github-copilot/about-github-copilot-for-individuals","notices":{"codeViewPopover":{"dismissed":false,"dismissPath":"/settings/dismiss-notice/code_view_copilot_popover"}},"userAccess":{"hasSubscriptionEnded":false,"orgHasCFBAccess":false,"userHasCFIAccess":false,"userHasOrgs":false,"userIsOrgAdmin":false,"userIsOrgMember":false,"business":null,"featureRequestInfo":null}},"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true,"csrf_tokens":{"/n3bkv/TP-Link-Tapo-P125M/branches":{"post":"lhpMXjXXub4fGotc4wDjbOz_h0J2UmCVmGUDjVRVgkSr9pDmfMnoPx4750I49eJqcTd2ST6P1NNwKDLNUJilPQ"}}},"title":"TP-Link-Tapo-P125M/README.md at main · n3bkv/TP-Link-Tapo-P125M","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-0cea8c6113ab.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-edcdbd6f0915.js","githubDevUrl":"https://github.dev/","enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":true,"accessible_code_button":true}}}</script>
|
|
835
|
+
<div data-target="react-app.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.jmjlbk{width:100%;}/*!sc*/
|
|
836
|
+
@media screen and (min-width:544px){.jmjlbk{width:100%;}}/*!sc*/
|
|
837
|
+
@media screen and (min-width:768px){.jmjlbk{width:auto;}}/*!sc*/
|
|
838
|
+
.cIRiaH{max-height:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
|
|
839
|
+
@media screen and (max-width:768px){.cIRiaH{display:none;}}/*!sc*/
|
|
840
|
+
@media screen and (min-width:768px){.cIRiaH{max-height:100vh;height:100vh;}}/*!sc*/
|
|
841
|
+
.fvNWEZ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;margin-bottom:16px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
|
|
842
|
+
@media screen and (max-width:768px){.bCYVKR{display:none;}}/*!sc*/
|
|
843
|
+
.cybVuK{margin-left:auto;margin-right:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-bottom:40px;max-width:100%;margin-top:0;}/*!sc*/
|
|
844
|
+
.gSjuRy{display:inherit;}/*!sc*/
|
|
845
|
+
.jyTWxL{margin-left:16px;margin-right:16px;}/*!sc*/
|
|
846
|
+
.hGzGyY{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}/*!sc*/
|
|
847
|
+
.ekdrwn{width:100%;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;min-width:0;margin-right:16px;}/*!sc*/
|
|
848
|
+
.fpyUWF{height:40px;padding-left:4px;padding-bottom:16px;}/*!sc*/
|
|
849
|
+
.iafbuG{top:0px;z-index:4;background:var(--bgColor-default,var(--color-canvas-default));position:-webkit-sticky;position:sticky;}/*!sc*/
|
|
850
|
+
.iNRqcN{display:none;min-width:0;padding-top:8px;padding-bottom:8px;}/*!sc*/
|
|
851
|
+
.koZdcA{border-radius:6px 6px 0px 0px;}/*!sc*/
|
|
852
|
+
.doYuhf{border:1px solid;border-top:none;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:0px 0px 6px 6px;min-width:273px;}/*!sc*/
|
|
853
|
+
.iZiBDT{background-color:var(--bgColor-default,var(--color-canvas-default));border:0px;border-width:0;border-radius:0px 0px 6px 6px;padding:0;min-width:0;margin-top:46px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/
|
|
854
|
+
.lhfNqO{border-bottom-left-radius:6px;border-bottom-right-radius:6px;padding:32px;min-width:0;}/*!sc*/
|
|
855
|
+
.kuJVuq{padding-bottom:33px;}/*!sc*/
|
|
856
|
+
.cxWhiL{padding-top:8px;padding-bottom:8px;padding-left:16px;padding-right:16px;}/*!sc*/
|
|
857
|
+
.fHoMbg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/
|
|
858
|
+
.cnoVsg{font-size:14px;-webkit-order:1;-ms-flex-order:1;order:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:600;}/*!sc*/
|
|
859
|
+
.caOZLR{font-size:12px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-top:8px;}/*!sc*/
|
|
860
|
+
.cIntug{margin-right:6px;}/*!sc*/
|
|
861
|
+
.dILSWH{margin-left:-16px;margin-bottom:-8px;}/*!sc*/
|
|
862
|
+
.knbnik{margin-bottom:-8px;overflow-y:auto;max-height:calc(100vh - 237px);padding-left:16px;padding-bottom:8px;padding-top:4px;}/*!sc*/
|
|
863
|
+
.iRVXIo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/
|
|
864
|
+
.kOALiS{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;position:relative;margin-right:8px;}/*!sc*/
|
|
865
|
+
.ihXXeg{background-color:var(--color-prettylights-syntax-entity,#6639ba);opacity:0.1;position:absolute;border-radius:5px;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:100%;}/*!sc*/
|
|
866
|
+
.bHnTee{color:var(--color-prettylights-syntax-entity,#6639ba);border-radius:5px;font-weight:600;font-size:smaller;padding-left:4px;padding-right:4px;padding-top:1px;padding-bottom:1px;}/*!sc*/
|
|
867
|
+
.vdPNv{position:fixed;top:0;right:0;height:100%;width:15px;-webkit-transition:-webkit-transform 0.3s;-webkit-transition:transform 0.3s;transition:transform 0.3s;z-index:1;}/*!sc*/
|
|
868
|
+
.vdPNv:hover{-webkit-transform:scaleX(1.5);-ms-transform:scaleX(1.5);transform:scaleX(1.5);}/*!sc*/
|
|
869
|
+
data-styled.g1[id="Box-sc-62in7e-0"]{content:"jmjlbk,cIRiaH,fvNWEZ,bCYVKR,cybVuK,gSjuRy,jyTWxL,hGzGyY,ekdrwn,fpyUWF,iafbuG,iNRqcN,koZdcA,doYuhf,iZiBDT,lhfNqO,kuJVuq,cxWhiL,fHoMbg,cnoVsg,caOZLR,cIntug,dILSWH,knbnik,iRVXIo,kOALiS,ihXXeg,bHnTee,vdPNv,"}/*!sc*/
|
|
870
|
+
.hfSsoj[data-size="medium"][data-no-visuals]{display:none;}/*!sc*/
|
|
871
|
+
.gWpYFp[data-size="small"]{color:var(--fgColor-default,var(--color-fg-default,#1F2328));display:none;}/*!sc*/
|
|
872
|
+
@media screen and (min-width:544px){.gWpYFp[data-size="small"]{display:none;}}/*!sc*/
|
|
873
|
+
@media screen and (min-width:768px){.gWpYFp[data-size="small"]{display:none;}}/*!sc*/
|
|
874
|
+
@media screen and (min-width:1012px){.gWpYFp[data-size="small"]{display:none;}}/*!sc*/
|
|
875
|
+
@media screen and (min-width:1280px){.gWpYFp[data-size="small"]{display:block;}}/*!sc*/
|
|
876
|
+
data-styled.g16[id="Button__StyledButtonComponent-sc-vqy3e4-0"]{content:"hfSsoj,gWpYFp,"}/*!sc*/
|
|
877
|
+
.dWfbpP{font-size:16px;margin-left:8px;}/*!sc*/
|
|
878
|
+
data-styled.g24[id="Heading-sc-1vc165i-0"]{content:"dWfbpP,"}/*!sc*/
|
|
879
|
+
.bWhDnA[data-size="medium"][data-no-visuals]{border-top-left-radius:0;border-bottom-left-radius:0;}/*!sc*/
|
|
880
|
+
.gXjFlG[data-size="small"][data-no-visuals]{border-top-left-radius:0;border-bottom-left-radius:0;}/*!sc*/
|
|
881
|
+
.gRAczH[data-size="small"][data-no-visuals]:hover:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
|
|
882
|
+
.gRAczH[data-size="small"][data-no-visuals]:focus:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
|
|
883
|
+
.gRAczH[data-size="small"][data-no-visuals]:active:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
|
|
884
|
+
.fvatuQ[data-size="small"][data-no-visuals]{margin-right:8px;}/*!sc*/
|
|
885
|
+
.eJnQTt[data-size="medium"][data-no-visuals]{-webkit-order:3;-ms-flex-order:3;order:3;color:var(--fgColor-default,var(--color-fg-default,#1F2328));margin-right:-8px;}/*!sc*/
|
|
886
|
+
data-styled.g25[id="IconButton__StyledIconButton-sc-i53dt6-0"]{content:"bWhDnA,gXjFlG,gRAczH,fvatuQ,eJnQTt,"}/*!sc*/
|
|
887
|
+
.iwmTUC linkButtonSx:hover:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
|
|
888
|
+
.iwmTUC linkButtonSx:focus:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
|
|
889
|
+
.iwmTUC linkButtonSx:active:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
|
|
890
|
+
data-styled.g28[id="LinkButton-sc-1v6zkmg-0"]{content:"iwmTUC,"}/*!sc*/
|
|
891
|
+
.bLATi{margin-top:8px;border-radius:6px;}/*!sc*/
|
|
892
|
+
data-styled.g39[id="TextInput__StyledTextInput-sc-ttxlvl-0"]{content:"bLATi,"}/*!sc*/
|
|
893
|
+
.bkmqFA{max-width:180px;display:block;}/*!sc*/
|
|
894
|
+
data-styled.g42[id="Truncate-sc-x3i4it-0"]{content:"bkmqFA,"}/*!sc*/
|
|
895
|
+
</style><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <!-- --> <button hidden="" data-testid="header-permalink-button" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d"><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div tabindex="0" class="Box-sc-62in7e-0 jmjlbk"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane--D26Sw ReposFileTreePane-module__HidePaneWithTreeOverlay--CJn2n" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"><div class="react-tree-pane-contents-3-panel"><div id="repos-file-tree" class="Box-sc-62in7e-0 cIRiaH"><div class="ReposFileTreePane-module__Box_1--ZT_4S"><div class="Box-sc-62in7e-0 fvNWEZ"><h2 class="use-tree-pane-module__Heading--iI_ad prc-Heading-Heading-MtWFE"><button type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1--g8F6Q" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="collapse-file-tree-button" aria-expanded="true" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton--oKI1R ExpandFileTreeButton-module__filesButtonBreakpoint--03FKA fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_156mplab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-sidebar-expand" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.177 7.823 2.396-2.396A.25.25 0 0 1 7 5.604v4.792a.25.25 0 0 1-.427.177L4.177 8.177a.25.25 0 0 1 0-.354Z"></path><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25H9.5v-13Zm12.5 13a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11v13Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" aria-hidden="true" id="_R_156mplab_">Collapse file tree</span><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button></h2><h2 class="Heading-sc-1vc165i-0 dWfbpP">Files</h2></div><div class="ReposFileTreePane-module__Box_2--RgzGf"><div class="ReposFileTreePane-module__Box_3--XDLn8"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" style="min-width:0" aria-label="main branch" data-testid="anchor-button" class="prc-Button-ButtonBase-9n-Xk react-repos-tree-pane-ref-selector width-full ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn--D34zl" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer--mCbv8"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayHeader--D4cnZ"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer--yO402"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText--bxVhQ"> <!-- -->main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-testid="ref-selector-hotkey-button" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="ReposFileTreePane-module__Box_4--TLAAU"><a data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ReposFileTreePane-module__IconButton--fpuBk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_q6mplab_" href="/n3bkv/TP-Link-Tapo-P125M/new/main" data-discover="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-plus" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.75 2a.75.75 0 0 1 .75.75V7h4.25a.75.75 0 0 1 0 1.5H8.5v4.25a.75.75 0 0 1-1.5 0V8.5H2.75a.75.75 0 0 1 0-1.5H7V2.75A.75.75 0 0 1 7.75 2Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" aria-hidden="true" id="_R_q6mplab_">Add file</span><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 bWhDnA SearchButton-module__IconButton--kxA3Q prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_3a6mplab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-hidden="true" id="_R_3a6mplab_">Search this repository</span><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button></div></div></div><div class="Box-sc-62in7e-0 bCYVKR ReposFileTreePane-module__FileResultsList--YEf_n"><span class="TextInput__StyledTextInput-sc-ttxlvl-0 d-flex FileResultsList-module__FilesSearchBox--fSAh3 TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_5amplab_" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_5amplab_ _R_5amplabH1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_5amplabH1_" aria-hidden="true"><kbd>t</kbd></span></span></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div class="Box-sc-62in7e-0 bCYVKR ReposFileTreePane-module__Box_5--cckih"><div class="react-tree-show-tree-items"><div class="ReposFileTreeView-module__Box--bDodO" data-testid="repos-file-tree-container"><nav aria-label="File Tree Navigation"><span class="prc-src-InternalVisuallyHidden-2YaI6"><div></div></span><ul role="tree" aria-label="Files" data-truncate-text="true" class="prc-TreeView-TreeViewRootUlStyles-Mzrmj"><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="Node-Red-Tapo-P125M.json-item" role="treeitem" aria-labelledby="_R_3pimplab_" aria-describedby="_R_3pimplabH1_" aria-level="1" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:1;content-visibility:auto;contain-intrinsic-size:auto 2rem"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"></div></div><div id="_R_3pimplab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><div class="PRIVATE_VisuallyHidden prc-TreeView-TreeViewVisuallyHidden-1N8xK" aria-hidden="true" id="_R_3pimplabH1_"></div><div class="PRIVATE_TreeView-item-visual prc-TreeView-TreeViewItemVisual-naWzj" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-file" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg></div><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><span>Node-Red-Tapo-P125M.json</span></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="README.md-item" role="treeitem" aria-labelledby="_R_5pimplab_" aria-describedby="_R_5pimplabH1_" aria-level="1" aria-current="true" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:1"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"></div></div><div id="_R_5pimplab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><div class="PRIVATE_VisuallyHidden prc-TreeView-TreeViewVisuallyHidden-1N8xK" aria-hidden="true" id="_R_5pimplabH1_"></div><div class="PRIVATE_TreeView-item-visual prc-TreeView-TreeViewItemVisual-naWzj" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-file" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg></div><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><span>README.md</span></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="tapo.js-item" role="treeitem" aria-labelledby="_R_7pimplab_" aria-describedby="_R_7pimplabH1_" aria-level="1" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:1;content-visibility:auto;contain-intrinsic-size:auto 2rem"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"></div></div><div id="_R_7pimplab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><div class="PRIVATE_VisuallyHidden prc-TreeView-TreeViewVisuallyHidden-1N8xK" aria-hidden="true" id="_R_7pimplabH1_"></div><div class="PRIVATE_TreeView-item-visual prc-TreeView-TreeViewItemVisual-naWzj" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-file" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg></div><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><span>tapo.js</span></span></div></div></li></ul></nav></div></div></div></div></div></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div class="prc-PageLayout-ContentWrapper-gR9eG CodeView-module__SplitPageLayout_Content--jx2Z1" data-is-hidden-narrow="true"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div data-selector="repos-split-pane-content" tabindex="0" class="Box-sc-62in7e-0 cybVuK"><div class="Box-sc-62in7e-0 gSjuRy"><div class="container CodeViewHeader-module__Box--iIXFW"><div class="px-3 pt-3 pb-0" id="StickyHeader"><div class="CodeViewHeader-module__Box_1--aCFlZ"><div class="CodeViewHeader-module__Box_2--Nk8st"><div class="CodeViewHeader-module__Box_6--LXUKx"><div class="Breadcrumb-module__container--u5hNw Breadcrumb-module__lg--X8kMz"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb--wide-heading" id="repos-header-breadcrumb--wide" class="Breadcrumb-module__nav--kjUkO"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vlUbc prc-Heading-Heading-MtWFE" data-testid="screen-reader-heading" id="repos-header-breadcrumb--wide-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list--lkq0r"><li class="Breadcrumb-module__listItem--r4enD"><a class="Breadcrumb-module__repoLink--ZlDIS prc-Link-Link-9ZwDx" data-testid="breadcrumbs-repo-link" href="/n3bkv/TP-Link-Tapo-P125M/tree/main" data-discover="true">TP-Link-Tapo-P125M</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename--n2aVJ"><span class="Breadcrumb-module__separator--DqIXz Breadcrumb-module__lg--X8kMz" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading--Paorw Breadcrumb-module__lg--X8kMz prc-Heading-Heading-MtWFE" tabindex="-1" id="file-name-id-wide">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3b9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="Box-sc-62in7e-0 CopyToClipboardButton-module__tooltip--HDUYz prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-label="Copy path" aria-hidden="true" id="_R_3b9lab_">Copy path</span></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7--dBydM"><div class="d-flex gap-2"> <button type="button" class="prc-Button-ButtonBase-9n-Xk Button__StyledButtonComponent-sc-vqy3e4-0 hfSsoj NavigationMenu-module__Button--SKxrr" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton--YP8f3 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_fihj9lab_" id="_R_ihj9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-hidden="true" id="_R_fihj9lab_">More file actions</span> </div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7--dBydM"><div class="d-flex gap-2"> <button type="button" class="prc-Button-ButtonBase-9n-Xk Button__StyledButtonComponent-sc-vqy3e4-0 hfSsoj NavigationMenu-module__Button--SKxrr" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton--YP8f3 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_fihr9lab_" id="_R_ihr9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-hidden="true" id="_R_fihr9lab_">More file actions</span> </div></div></div></div></div></div></div></div><div class="Box-sc-62in7e-0 jyTWxL react-code-view-bottom-padding"> <div class="BlobTopBanners-module__Box--F5OCo"></div> <!-- --> <!-- --> </div><div class="Box-sc-62in7e-0 jyTWxL"> <!-- --> <!-- --> <button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div class="d-flex flex-column border rounded-2 mb-3 pl-1"><div class="LatestCommit-module__Box--Fimpo"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vlUbc prc-Heading-Heading-MtWFE" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vlUbc prc-Heading-Heading-MtWFE" data-testid="screen-reader-heading">History</h2><a href="/n3bkv/TP-Link-Tapo-P125M/commits/main/README.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__code-view-link-button--thtqc flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="History" id="history-icon-button-tooltip" class="prc-Tooltip-Tooltip-JLsri prc-Tooltip-Tooltip--n-SqCQ- tooltipped-n"><a aria-label="View commit history for this file." href="/n3bkv/TP-Link-Tapo-P125M/commits/main/README.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__code-view-link-button--thtqc flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="history-icon-button-tooltip"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></div><div class="Box-sc-62in7e-0 hGzGyY"><div class="Box-sc-62in7e-0 ekdrwn container"><div class="Box-sc-62in7e-0 fpyUWF react-code-size-details-banner"><div class="react-code-size-details-banner CodeSizeDetails-module__Box--g57tw"><div class="text-mono CodeSizeDetails-module__Box_1--mgPJs"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1--SXHND prc-Truncate-Truncate-2G1eo" data-inline="true" title="4.03 KB" style="--truncate-max-width:100%"><span>214 lines (144 loc) · 4.03 KB</span></div></div></div><div class="react-code-size-details-banner"><button type="button" style="--button-color:fg.default" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="Code 55% faster with GitHub Copilot" class="prc-Button-ButtonBase-9n-Xk Button__StyledButtonComponent-sc-vqy3e4-0 gWpYFp" data-loading="false" data-size="small" data-variant="invisible" id="_R_ipal9lab_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg></span></span></button></div></div><div class="Box-sc-62in7e-0 iafbuG react-blob-view-header-sticky" id="repos-sticky-header"><div class="BlobViewHeader-module__Box--kEu6z"><div class="react-blob-sticky-header"><div class="Box-sc-62in7e-0 iNRqcN"><div class="FileNameStickyHeader-module__Box_5--o8uey"><div class="Breadcrumb-module__container--u5hNw Breadcrumb-module__md--YqBrk"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav--kjUkO"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vlUbc prc-Heading-Heading-MtWFE" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list--lkq0r"><li class="Breadcrumb-module__listItem--r4enD"><a class="Breadcrumb-module__repoLink--ZlDIS prc-Link-Link-9ZwDx" data-testid="breadcrumbs-repo-link" href="/n3bkv/TP-Link-Tapo-P125M/tree/main" data-discover="true">TP-Link-Tapo-P125M</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename--n2aVJ"><span class="Breadcrumb-module__separator--DqIXz Breadcrumb-module__md--YqBrk" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading--Paorw Breadcrumb-module__md--YqBrk prc-Heading-Heading-MtWFE" tabindex="-1" id="sticky-file-name-id">README.md</h1></div></div><button type="button" class="prc-Button-ButtonBase-9n-Xk Button__StyledButtonComponent-sc-vqy3e4-0 FileNameStickyHeader-module__Button--uOm_J FileNameStickyHeader-module__GoToTopButton--Ubgke" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="Box-sc-62in7e-0 koZdcA BlobViewHeader-module__Box_1--_sZV1"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vlUbc prc-Heading-Heading-MtWFE" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2--fPJpL"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl--UrXKO" data-variant="default" data-size="small"><li class="prc-SegmentedControl-Item-tSCQh" data-selected=""><button aria-current="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh"><button aria-current="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh"><button aria-current="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><div class="react-code-size-details-in-header CodeSizeDetails-module__Box--g57tw"><div class="text-mono CodeSizeDetails-module__Box_1--mgPJs"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1--SXHND prc-Truncate-Truncate-2G1eo" data-inline="true" title="4.03 KB" style="--truncate-max-width:100%"><span>214 lines (144 loc) · 4.03 KB</span></div></div></div><div class="react-code-size-details-in-header"><button type="button" style="--button-color:fg.default" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="Code 55% faster with GitHub Copilot" class="prc-Button-ButtonBase-9n-Xk Button__StyledButtonComponent-sc-vqy3e4-0 gWpYFp" data-loading="false" data-size="small" data-variant="invisible" id="_R_1qcpal9lab_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg></span></span></button></div></div><div class="BlobViewHeader-module__Box_3--c1yoS"><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4--PCpYh"><div class="prc-ButtonGroup-ButtonGroup-vFUrY"><div><a href="https://github.com/n3bkv/TP-Link-Tapo-P125M/raw/refs/heads/main/README.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-sc-1v6zkmg-0 iwmTUC BlobViewHeader-module__LinkButton--j1CPd" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_pbecpal9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" aria-hidden="true" id="_R_pbecpal9lab_">Copy raw file</span></div><div><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 gXjFlG prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_dbecpal9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" aria-hidden="true" id="_R_dbecpal9lab_">Download raw file</span></div></div><button hidden="" data-testid="raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="copy-raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="download-raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><a class="js-github-dev-shortcut d-none prc-Link-Link-9ZwDx" href="https://github.dev/"></a><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><a class="js-github-dev-new-tab-shortcut d-none prc-Link-Link-9ZwDx" href="https://github.dev/" target="_blank"></a><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><div class="prc-ButtonGroup-ButtonGroup-vFUrY"><div><a data-component="IconButton" type="button" data-testid="edit-button" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 gRAczH prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_6jecpal9lab_" href="/n3bkv/TP-Link-Tapo-P125M/edit/main/README.md" data-discover="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-pencil" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path></svg></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-hidden="true" id="_R_6jecpal9lab_">Edit this file</span></div><div><button data-component="IconButton" type="button" data-testid="more-edit-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_7qjecpal9lab_" id="_R_ajecpal9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-hidden="true" id="_R_7qjecpal9lab_">More edit options</span></div></div><button hidden="" data-testid="" data-hotkey="e,Shift+E" data-hotkey-scope="read-only-cursor-text-area"></button></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 fvatuQ TableOfContents-module__IconButton--yD4jb prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_4ecpal9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" aria-hidden="true" id="_R_4ecpal9lab_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 js-blob-dropdown-click BlobViewHeader-module__IconButton--JW7qq prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkucpal9lab_" id="_R_kucpal9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" aria-hidden="true" id="_R_fkucpal9lab_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="Box-sc-62in7e-0 doYuhf"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="Box-sc-62in7e-0 iZiBDT"><div class="Box-sc-62in7e-0 lhfNqO js-snippet-clipboard-copy-unpositioned undefined" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)</h1><a id="user-content-tp-link-tapo-p125m-local-control-with-node-red-raspberry-pi" class="anchor" aria-label="Permalink: TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)" href="#tp-link-tapo-p125m-local-control-with-node-red-raspberry-pi"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
896
|
+
<p dir="auto">This project provides <strong>local (LAN) on/off control</strong> of <strong>TP-Link Tapo smart plugs (P125M)</strong> from <strong>Node-RED</strong>, running natively on <strong>Raspberry Pi OS</strong>.</p>
|
|
897
|
+
<p dir="auto">No Home Assistant or Matter required.<br>
|
|
898
|
+
No cloud dependency once credentials are set.</p>
|
|
899
|
+
<p dir="auto">It works on <strong>Raspberry Pi 3 (armv7 / 32-bit)</strong>, where Matter containers are not supported.</p>
|
|
900
|
+
<hr>
|
|
901
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">What this does</h2><a id="user-content-what-this-does" class="anchor" aria-label="Permalink: What this does" href="#what-this-does"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
902
|
+
<ul dir="auto">
|
|
903
|
+
<li>Controls a <strong>TP-Link Tapo P125M</strong> outlet directly over your LAN</li>
|
|
904
|
+
<li>Uses a small <strong>Node.js CLI script</strong> (<code>tapo.js</code>)</li>
|
|
905
|
+
<li>Node-RED calls the script via an <strong>exec</strong> node</li>
|
|
906
|
+
<li>Returns <strong>JSON output</strong> that Node-RED can parse</li>
|
|
907
|
+
<li>Supports:
|
|
908
|
+
<ul dir="auto">
|
|
909
|
+
<li><code>on</code></li>
|
|
910
|
+
<li><code>off</code></li>
|
|
911
|
+
<li><code>status</code></li>
|
|
912
|
+
</ul>
|
|
913
|
+
</li>
|
|
914
|
+
</ul>
|
|
915
|
+
<hr>
|
|
916
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Requirements</h2><a id="user-content-requirements" class="anchor" aria-label="Permalink: Requirements" href="#requirements"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
917
|
+
<ul dir="auto">
|
|
918
|
+
<li>Raspberry Pi running <strong>Raspberry Pi OS</strong></li>
|
|
919
|
+
<li><strong>Node.js 18+</strong> (Node 20 works)</li>
|
|
920
|
+
<li><strong>Node-RED (native install)</strong></li>
|
|
921
|
+
<li>TP-Link <strong>Tapo P125M</strong> smart plug</li>
|
|
922
|
+
<li>Tapo account email + password</li>
|
|
923
|
+
<li>Plug must already be set up and working in the <strong>Tapo mobile app</strong></li>
|
|
924
|
+
</ul>
|
|
925
|
+
<hr>
|
|
926
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Why not Matter or Home Assistant?</h2><a id="user-content-why-not-matter-or-home-assistant" class="anchor" aria-label="Permalink: Why not Matter or Home Assistant?" href="#why-not-matter-or-home-assistant"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
927
|
+
<p dir="auto">The Matter server images provided by Home Assistant <strong>do not support armv7 (32-bit)</strong>.<br>
|
|
928
|
+
Raspberry Pi 3 cannot run Matter Server containers.</p>
|
|
929
|
+
<p dir="auto">This approach:</p>
|
|
930
|
+
<ul dir="auto">
|
|
931
|
+
<li>Is local and fast</li>
|
|
932
|
+
<li>Avoids Docker + firewall complexity</li>
|
|
933
|
+
<li>Integrates cleanly with Node-RED automations</li>
|
|
934
|
+
</ul>
|
|
935
|
+
<hr>
|
|
936
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Installation</h2><a id="user-content-installation" class="anchor" aria-label="Permalink: Installation" href="#installation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
937
|
+
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">1) Create the working directory</h3><a id="user-content-1-create-the-working-directory" class="anchor" aria-label="Permalink: 1) Create the working directory" href="#1-create-the-working-directory"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
938
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="sudo mkdir -p /opt/tapo
|
|
939
|
+
sudo chown -R pi:pi /opt/tapo
|
|
940
|
+
cd /opt/tapo"><pre>sudo mkdir -p /opt/tapo
|
|
941
|
+
sudo chown -R pi:pi /opt/tapo
|
|
942
|
+
<span class="pl-c1">cd</span> /opt/tapo</pre></div>
|
|
943
|
+
<hr>
|
|
944
|
+
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">2) Install the Tapo control library</h3><a id="user-content-2-install-the-tapo-control-library" class="anchor" aria-label="Permalink: 2) Install the Tapo control library" href="#2-install-the-tapo-control-library"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
945
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npm init -y
|
|
946
|
+
npm install tp-link-tapo-connect"><pre>npm init -y
|
|
947
|
+
npm install tp-link-tapo-connect</pre></div>
|
|
948
|
+
<hr>
|
|
949
|
+
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">3) Create the control script</h3><a id="user-content-3-create-the-control-script" class="anchor" aria-label="Permalink: 3) Create the control script" href="#3-create-the-control-script"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
950
|
+
<p dir="auto">Create <code>/opt/tapo/tapo.js</code>:</p>
|
|
951
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="nano /opt/tapo/tapo.js"><pre>nano /opt/tapo/tapo.js</pre></div>
|
|
952
|
+
<p dir="auto">Paste the following:</p>
|
|
953
|
+
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="#!/usr/bin/env node
|
|
954
|
+
"use strict";
|
|
955
|
+
|
|
956
|
+
const { loginDeviceByIp } = require("tp-link-tapo-connect");
|
|
957
|
+
|
|
958
|
+
async function main() {
|
|
959
|
+
const cmd = (process.argv[2] || "").toLowerCase();
|
|
960
|
+
const email = process.env.TAPO_EMAIL;
|
|
961
|
+
const password = process.env.TAPO_PASSWORD;
|
|
962
|
+
const ip = process.env.TAPO_IP;
|
|
963
|
+
|
|
964
|
+
if (!email || !password || !ip) {
|
|
965
|
+
throw new Error("Missing env vars. Need TAPO_EMAIL, TAPO_PASSWORD, TAPO_IP");
|
|
966
|
+
}
|
|
967
|
+
if (!["on", "off", "status"].includes(cmd)) {
|
|
968
|
+
throw new Error("Usage: tapo.js <on|off|status>");
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
const device = await loginDeviceByIp(email, password, ip);
|
|
972
|
+
|
|
973
|
+
if (cmd === "on") await device.turnOn();
|
|
974
|
+
if (cmd === "off") await device.turnOff();
|
|
975
|
+
|
|
976
|
+
const info = await device.getDeviceInfo();
|
|
977
|
+
|
|
978
|
+
const out = {
|
|
979
|
+
ok: true,
|
|
980
|
+
cmd,
|
|
981
|
+
ip,
|
|
982
|
+
device_on: info?.result?.device_on ?? info?.device_on ?? null,
|
|
983
|
+
model: info?.result?.model ?? info?.model ?? null,
|
|
984
|
+
raw: info
|
|
985
|
+
};
|
|
986
|
+
|
|
987
|
+
process.stdout.write(JSON.stringify(out));
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
main().catch((err) => {
|
|
991
|
+
const out = { ok: false, error: String(err?.message || err) };
|
|
992
|
+
process.stdout.write(JSON.stringify(out));
|
|
993
|
+
process.exit(1);
|
|
994
|
+
});"><pre>#!/usr/bin/env node
|
|
995
|
+
<span class="pl-s">"use strict"</span><span class="pl-kos">;</span>
|
|
996
|
+
|
|
997
|
+
<span class="pl-k">const</span> <span class="pl-kos">{</span> loginDeviceByIp <span class="pl-kos">}</span> <span class="pl-c1">=</span> <span class="pl-en">require</span><span class="pl-kos">(</span><span class="pl-s">"tp-link-tapo-connect"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
998
|
+
|
|
999
|
+
<span class="pl-k">async</span> <span class="pl-k">function</span> <span class="pl-en">main</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
|
|
1000
|
+
<span class="pl-k">const</span> <span class="pl-s1">cmd</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-c1">argv</span><span class="pl-kos">[</span><span class="pl-c1">2</span><span class="pl-kos">]</span> <span class="pl-c1">||</span> <span class="pl-s">""</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toLowerCase</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1001
|
+
<span class="pl-k">const</span> <span class="pl-s1">email</span> <span class="pl-c1">=</span> <span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-c1">env</span><span class="pl-kos">.</span><span class="pl-c1">TAPO_EMAIL</span><span class="pl-kos">;</span>
|
|
1002
|
+
<span class="pl-k">const</span> <span class="pl-s1">password</span> <span class="pl-c1">=</span> <span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-c1">env</span><span class="pl-kos">.</span><span class="pl-c1">TAPO_PASSWORD</span><span class="pl-kos">;</span>
|
|
1003
|
+
<span class="pl-k">const</span> <span class="pl-s1">ip</span> <span class="pl-c1">=</span> <span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-c1">env</span><span class="pl-kos">.</span><span class="pl-c1">TAPO_IP</span><span class="pl-kos">;</span>
|
|
1004
|
+
|
|
1005
|
+
<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-c1">!</span><span class="pl-s1">email</span> <span class="pl-c1">||</span> <span class="pl-c1">!</span><span class="pl-s1">password</span> <span class="pl-c1">||</span> <span class="pl-c1">!</span><span class="pl-s1">ip</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
|
|
1006
|
+
<span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-v">Error</span><span class="pl-kos">(</span><span class="pl-s">"Missing env vars. Need TAPO_EMAIL, TAPO_PASSWORD, TAPO_IP"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1007
|
+
<span class="pl-kos">}</span>
|
|
1008
|
+
<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-c1">!</span><span class="pl-kos">[</span><span class="pl-s">"on"</span><span class="pl-kos">,</span> <span class="pl-s">"off"</span><span class="pl-kos">,</span> <span class="pl-s">"status"</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-en">includes</span><span class="pl-kos">(</span><span class="pl-s1">cmd</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
|
|
1009
|
+
<span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-v">Error</span><span class="pl-kos">(</span><span class="pl-s">"Usage: tapo.js <on|off|status>"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1010
|
+
<span class="pl-kos">}</span>
|
|
1011
|
+
|
|
1012
|
+
<span class="pl-k">const</span> <span class="pl-s1">device</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-en">loginDeviceByIp</span><span class="pl-kos">(</span><span class="pl-s1">email</span><span class="pl-kos">,</span> <span class="pl-s1">password</span><span class="pl-kos">,</span> <span class="pl-s1">ip</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1013
|
+
|
|
1014
|
+
<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">cmd</span> <span class="pl-c1">===</span> <span class="pl-s">"on"</span><span class="pl-kos">)</span> <span class="pl-k">await</span> <span class="pl-s1">device</span><span class="pl-kos">.</span><span class="pl-en">turnOn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1015
|
+
<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">cmd</span> <span class="pl-c1">===</span> <span class="pl-s">"off"</span><span class="pl-kos">)</span> <span class="pl-k">await</span> <span class="pl-s1">device</span><span class="pl-kos">.</span><span class="pl-en">turnOff</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1016
|
+
|
|
1017
|
+
<span class="pl-k">const</span> <span class="pl-s1">info</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-s1">device</span><span class="pl-kos">.</span><span class="pl-en">getDeviceInfo</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1018
|
+
|
|
1019
|
+
<span class="pl-k">const</span> <span class="pl-s1">out</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
|
|
1020
|
+
<span class="pl-c1">ok</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
|
|
1021
|
+
cmd<span class="pl-kos">,</span>
|
|
1022
|
+
ip<span class="pl-kos">,</span>
|
|
1023
|
+
<span class="pl-c1">device_on</span>: <span class="pl-s1">info</span><span class="pl-kos">?.</span><span class="pl-c1">result</span><span class="pl-kos">?.</span><span class="pl-c1">device_on</span> <span class="pl-c1">??</span> <span class="pl-s1">info</span><span class="pl-kos">?.</span><span class="pl-c1">device_on</span> <span class="pl-c1">??</span> <span class="pl-c1">null</span><span class="pl-kos">,</span>
|
|
1024
|
+
<span class="pl-c1">model</span>: <span class="pl-s1">info</span><span class="pl-kos">?.</span><span class="pl-c1">result</span><span class="pl-kos">?.</span><span class="pl-c1">model</span> <span class="pl-c1">??</span> <span class="pl-s1">info</span><span class="pl-kos">?.</span><span class="pl-c1">model</span> <span class="pl-c1">??</span> <span class="pl-c1">null</span><span class="pl-kos">,</span>
|
|
1025
|
+
<span class="pl-c1">raw</span>: <span class="pl-s1">info</span>
|
|
1026
|
+
<span class="pl-kos">}</span><span class="pl-kos">;</span>
|
|
1027
|
+
|
|
1028
|
+
<span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-c1">stdout</span><span class="pl-kos">.</span><span class="pl-en">write</span><span class="pl-kos">(</span><span class="pl-c1">JSON</span><span class="pl-kos">.</span><span class="pl-en">stringify</span><span class="pl-kos">(</span><span class="pl-s1">out</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1029
|
+
<span class="pl-kos">}</span>
|
|
1030
|
+
|
|
1031
|
+
<span class="pl-en">main</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">catch</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-s1">err</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span>
|
|
1032
|
+
<span class="pl-k">const</span> <span class="pl-s1">out</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">ok</span>: <span class="pl-c1">false</span><span class="pl-kos">,</span> <span class="pl-c1">error</span>: <span class="pl-v">String</span><span class="pl-kos">(</span><span class="pl-s1">err</span><span class="pl-kos">?.</span><span class="pl-c1">message</span> <span class="pl-c1">||</span> <span class="pl-s1">err</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">;</span>
|
|
1033
|
+
<span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-c1">stdout</span><span class="pl-kos">.</span><span class="pl-en">write</span><span class="pl-kos">(</span><span class="pl-c1">JSON</span><span class="pl-kos">.</span><span class="pl-en">stringify</span><span class="pl-kos">(</span><span class="pl-s1">out</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1034
|
+
<span class="pl-s1">process</span><span class="pl-kos">.</span><span class="pl-en">exit</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
|
|
1035
|
+
<span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
|
|
1036
|
+
<p dir="auto">Make it executable:</p>
|
|
1037
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="chmod +x /opt/tapo/tapo.js"><pre>chmod +x /opt/tapo/tapo.js</pre></div>
|
|
1038
|
+
<hr>
|
|
1039
|
+
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">4) Create the environment file (credentials)</h3><a id="user-content-4-create-the-environment-file-credentials" class="anchor" aria-label="Permalink: 4) Create the environment file (credentials)" href="#4-create-the-environment-file-credentials"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1040
|
+
<p dir="auto">Create <code>/opt/tapo/.env</code>:</p>
|
|
1041
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="nano /opt/tapo/.env"><pre>nano /opt/tapo/.env</pre></div>
|
|
1042
|
+
<p dir="auto">Example:</p>
|
|
1043
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export TAPO_EMAIL="you@example.com"
|
|
1044
|
+
export TAPO_PASSWORD="your_tapo_password"
|
|
1045
|
+
export TAPO_IP="192.168.1.50""><pre><span class="pl-k">export</span> TAPO_EMAIL=<span class="pl-s"><span class="pl-pds">"</span>you@example.com<span class="pl-pds">"</span></span>
|
|
1046
|
+
<span class="pl-k">export</span> TAPO_PASSWORD=<span class="pl-s"><span class="pl-pds">"</span>your_tapo_password<span class="pl-pds">"</span></span>
|
|
1047
|
+
<span class="pl-k">export</span> TAPO_IP=<span class="pl-s"><span class="pl-pds">"</span>192.168.1.50<span class="pl-pds">"</span></span></pre></div>
|
|
1048
|
+
<p dir="auto">Secure it:</p>
|
|
1049
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="chmod 600 /opt/tapo/.env
|
|
1050
|
+
chown pi:pi /opt/tapo/.env"><pre>chmod 600 /opt/tapo/.env
|
|
1051
|
+
chown pi:pi /opt/tapo/.env</pre></div>
|
|
1052
|
+
<hr>
|
|
1053
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Test from the command line</h2><a id="user-content-test-from-the-command-line" class="anchor" aria-label="Permalink: Test from the command line" href="#test-from-the-command-line"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1054
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bash -lc 'source /opt/tapo/.env && node /opt/tapo/tapo.js status'
|
|
1055
|
+
bash -lc 'source /opt/tapo/.env && node /opt/tapo/tapo.js on'
|
|
1056
|
+
bash -lc 'source /opt/tapo/.env && node /opt/tapo/tapo.js off'"><pre>bash -lc <span class="pl-s"><span class="pl-pds">'</span>source /opt/tapo/.env && node /opt/tapo/tapo.js status<span class="pl-pds">'</span></span>
|
|
1057
|
+
bash -lc <span class="pl-s"><span class="pl-pds">'</span>source /opt/tapo/.env && node /opt/tapo/tapo.js on<span class="pl-pds">'</span></span>
|
|
1058
|
+
bash -lc <span class="pl-s"><span class="pl-pds">'</span>source /opt/tapo/.env && node /opt/tapo/tapo.js off<span class="pl-pds">'</span></span></pre></div>
|
|
1059
|
+
<hr>
|
|
1060
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Node-RED Notes</h2><a id="user-content-node-red-notes" class="anchor" aria-label="Permalink: Node-RED Notes" href="#node-red-notes"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1061
|
+
<ul dir="auto">
|
|
1062
|
+
<li>Use <strong>exec nodes with spawn disabled</strong></li>
|
|
1063
|
+
<li>Buffer stdout before JSON parsing</li>
|
|
1064
|
+
<li>Node-RED user must have read access to <code>/opt/tapo/.env</code></li>
|
|
1065
|
+
</ul>
|
|
1066
|
+
<p dir="auto">Check Node-RED user:</p>
|
|
1067
|
+
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="ps -o user= -C node-red"><pre>ps -o user= -C node-red</pre></div>
|
|
1068
|
+
<hr>
|
|
1069
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Sample Node-RED Control Flow</h2><a id="user-content-sample-node-red-control-flow" class="anchor" aria-label="Permalink: Sample Node-RED Control Flow" href="#sample-node-red-control-flow"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1070
|
+
<p dir="auto">See the file Node-Red-Tapo-P125M.json for a sample Node-RED plug flow.</p>
|
|
1071
|
+
<hr>
|
|
1072
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Security</h2><a id="user-content-security" class="anchor" aria-label="Permalink: Security" href="#security"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1073
|
+
<ul dir="auto">
|
|
1074
|
+
<li>Credentials stored outside flows</li>
|
|
1075
|
+
<li>No cloud calls after authentication</li>
|
|
1076
|
+
<li>Local LAN only</li>
|
|
1077
|
+
</ul>
|
|
1078
|
+
<hr>
|
|
1079
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Supported Devices</h2><a id="user-content-supported-devices" class="anchor" aria-label="Permalink: Supported Devices" href="#supported-devices"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1080
|
+
<ul dir="auto">
|
|
1081
|
+
<li><strong>Tapo P125M</strong> (confirmed)</li>
|
|
1082
|
+
<li>Other Tapo plugs may work but are not guaranteed</li>
|
|
1083
|
+
</ul>
|
|
1084
|
+
<hr>
|
|
1085
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Support This Project</h2><a id="user-content-support-this-project" class="anchor" aria-label="Permalink: Support This Project" href="#support-this-project"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1086
|
+
<p dir="auto">If you find this useful, star ⭐ the repo! It helps others discover it.</p>
|
|
1087
|
+
<hr>
|
|
1088
|
+
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">More Info</h2><a id="user-content-more-info" class="anchor" aria-label="Permalink: More Info" href="#more-info"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
|
|
1089
|
+
<p dir="auto">Blog: <a href="https://hamradiohacks.blogspot.com" rel="nofollow">https://hamradiohacks.blogspot.com</a></p>
|
|
1090
|
+
<p dir="auto">GitHub: <a href="https://github.com/n3bkv">https://github.com/n3bkv</a></p>
|
|
1091
|
+
<hr>
|
|
1092
|
+
</article></div><button hidden=""></button></section></div></div><div class="Box-sc-62in7e-0 kuJVuq"></div><div class="Box-sc-62in7e-0 iafbuG Panel-module__Box--U9sAo panel-content-narrow-styles inner-panel-content-not-narrow"><div id="symbols-pane"><div aria-labelledby="symbols-pane-header" class="Box-sc-62in7e-0 cxWhiL"><div class="Box-sc-62in7e-0 fHoMbg"><h2 id="symbols-pane-header" tabindex="-1" class="Box-sc-62in7e-0 cnoVsg">Symbols</h2><button data-component="IconButton" type="button" data-hotkey="Escape" class="prc-Button-ButtonBase-9n-Xk IconButton__StyledIconButton-sc-i53dt6-0 eJnQTt prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_hd9al9lab_"><svg aria-hidden="true" focusable="false" class="octicon octicon-x" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="w" aria-hidden="true" id="_R_hd9al9lab_">Close symbols</span></div><div class="Box-sc-62in7e-0 caOZLR">Find definitions and references for functions and other symbols in this file by clicking a symbol below or in the code.</div><span class="TextInput__StyledTextInput-sc-ttxlvl-0 bLATi TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-block="true" data-trailing-action="true" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_3d9al9lab_" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-filter" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M.75 3h14.5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5ZM3 7.75A.75.75 0 0 1 3.75 7h8.5a.75.75 0 0 1 0 1.5h-8.5A.75.75 0 0 1 3 7.75Zm3 4a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg></span><input type="text" placeholder="Filter symbols" aria-label="Filter symbols" aria-controls="filter-results" aria-expanded="true" aria-autocomplete="list" role="combobox" aria-describedby="_R_3d9al9lab_ _R_3d9al9labH1_" data-component="input" class="prc-components-Input-IwWrt" name="Filter symbols" value=""/><span class="TextInput-icon" id="_R_3d9al9labH1_" aria-hidden="true"><div class="Box-sc-62in7e-0 cIntug"><kbd>r</kbd></div></span></span><div class="Box-sc-62in7e-0 dILSWH"><div id="filter-results" class="Box-sc-62in7e-0 knbnik"><span class="prc-src-InternalVisuallyHidden-2YaI6"><div></div></span><ul role="tree" aria-label="Code Navigation" data-omit-spacer="false" data-truncate-text="true" class="prc-TreeView-TreeViewRootUlStyles-Mzrmj"><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="0TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)" role="treeitem" aria-labelledby="_R_1kd9al9lab_" aria-level="1" aria-expanded="true" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:1"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"></div></div><div class="PRIVATE_TreeView-item-toggle PRIVATE_TreeView-item-toggle--hover PRIVATE_TreeView-item-toggle--end prc-TreeView-TreeViewItemToggle-hq3Xq prc-TreeView-TreeViewItemToggleHover-H9tbt prc-TreeView-TreeViewItemToggleEnd-nWt9I"><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-down" viewBox="0 0 12 12" width="12" height="12" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6 8.825c-.2 0-.4-.1-.5-.2l-3.3-3.3c-.3-.3-.3-.8 0-1.1.3-.3.8-.3 1.1 0l2.7 2.7 2.7-2.7c.3-.3.8-.3 1.1 0 .3.3.3.8 0 1.1l-3.2 3.2c-.2.2-.4.3-.6.3Z"></path></svg></div><div id="_R_1kd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h1</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)" style="--truncate-max-width:125px"><span>TP-Link Tapo P125M Local Control with Node-RED (Raspberry Pi)</span></div></div></span></div></div><ul role="group" style="list-style:none;padding:0;margin:0" aria-label=""><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="0What this does" role="treeitem" aria-labelledby="_R_2rkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_2rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="What this does" style="--truncate-max-width:125px"><span>What this does</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="1Requirements" role="treeitem" aria-labelledby="_R_4rkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_4rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Requirements" style="--truncate-max-width:125px"><span>Requirements</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="2Why not Matter or Home Assistant?" role="treeitem" aria-labelledby="_R_6rkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_6rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Why not Matter or Home Assistant?" style="--truncate-max-width:125px"><span>Why not Matter or Home Assistant?</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="3Installation" role="treeitem" aria-labelledby="_R_8rkd9al9lab_" aria-level="2" aria-expanded="true" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div class="PRIVATE_TreeView-item-toggle PRIVATE_TreeView-item-toggle--hover prc-TreeView-TreeViewItemToggle-hq3Xq prc-TreeView-TreeViewItemToggleHover-H9tbt prc-TreeView-TreeViewItemToggleEnd-nWt9I"><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-down" viewBox="0 0 12 12" width="12" height="12" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6 8.825c-.2 0-.4-.1-.5-.2l-3.3-3.3c-.3-.3-.3-.8 0-1.1.3-.3.8-.3 1.1 0l2.7 2.7 2.7-2.7c.3-.3.8-.3 1.1 0 .3.3.3.8 0 1.1l-3.2 3.2c-.2.2-.4.3-.6.3Z"></path></svg></div><div id="_R_8rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Installation" style="--truncate-max-width:125px"><span>Installation</span></div></div></span></div></div><ul role="group" style="list-style:none;padding:0;margin:0" aria-label=""><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="01) Create the working directory" role="treeitem" aria-labelledby="_R_1d8rkd9al9lab_" aria-level="3" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:3"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_1d8rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h3</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="1) Create the working directory" style="--truncate-max-width:125px"><span>1) Create the working directory</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="12) Install the Tapo control library" role="treeitem" aria-labelledby="_R_2d8rkd9al9lab_" aria-level="3" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:3"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_2d8rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h3</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="2) Install the Tapo control library" style="--truncate-max-width:125px"><span>2) Install the Tapo control library</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="23) Create the control script" role="treeitem" aria-labelledby="_R_3d8rkd9al9lab_" aria-level="3" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:3"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_3d8rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h3</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="3) Create the control script" style="--truncate-max-width:125px"><span>3) Create the control script</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="34) Create the environment file (credentials)" role="treeitem" aria-labelledby="_R_4d8rkd9al9lab_" aria-level="3" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:3"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_4d8rkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h3</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="4) Create the environment file (credentials)" style="--truncate-max-width:125px"><span>4) Create the environment file (credentials)</span></div></div></span></div></div></li></ul></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="4Test from the command line" role="treeitem" aria-labelledby="_R_arkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_arkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Test from the command line" style="--truncate-max-width:125px"><span>Test from the command line</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="5Node-RED Notes" role="treeitem" aria-labelledby="_R_crkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_crkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Node-RED Notes" style="--truncate-max-width:125px"><span>Node-RED Notes</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="6Sample Node-RED Control Flow" role="treeitem" aria-labelledby="_R_erkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_erkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Sample Node-RED Control Flow" style="--truncate-max-width:125px"><span>Sample Node-RED Control Flow</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="7Security" role="treeitem" aria-labelledby="_R_grkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_grkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Security" style="--truncate-max-width:125px"><span>Security</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="8Supported Devices" role="treeitem" aria-labelledby="_R_irkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_irkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Supported Devices" style="--truncate-max-width:125px"><span>Supported Devices</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="9Support This Project" role="treeitem" aria-labelledby="_R_krkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_krkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="Support This Project" style="--truncate-max-width:125px"><span>Support This Project</span></div></div></span></div></div></li><li class="PRIVATE_TreeView-item prc-TreeView-TreeViewItem-Ter5f" tabindex="0" id="10More Info" role="treeitem" aria-labelledby="_R_mrkd9al9lab_" aria-level="2" aria-selected="false"><div class="PRIVATE_TreeView-item-container prc-TreeView-TreeViewItemContainer-z6qqQ" style="--level:2"><div style="grid-area:spacer;display:flex"><div style="width:100%;display:flex"><div class="PRIVATE_TreeView-item-level-line prc-TreeView-TreeViewItemLevelLine-F-0-2"></div></div></div><div id="_R_mrkd9al9lab_" class="PRIVATE_TreeView-item-content prc-TreeView-TreeViewItemContent-RKsCI"><span class="PRIVATE_TreeView-item-content-text prc-TreeView-TreeViewItemContentText-FFaKp"><div class="Box-sc-62in7e-0 iRVXIo"><div class="Box-sc-62in7e-0 kOALiS"><div class="Box-sc-62in7e-0 ihXXeg"></div><div class="Box-sc-62in7e-0 bHnTee">h2</div></div> <div class="Truncate-sc-x3i4it-0 bkmqFA prc-Truncate-Truncate-2G1eo" title="More Info" style="--truncate-max-width:125px"><span>More Info</span></div></div></span></div></div></li></ul></li></ul></div></div></div></div></div></div> <!-- --> <!-- --> </div></div></div></div></div></div></div><div id="find-result-marks-container" class="Box-sc-62in7e-0 vdPNv"></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA__R_0___">{"resolvedServerColorMode":"day"}</script></div>
|
|
1093
|
+
</react-app>
|
|
1094
|
+
</turbo-frame>
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
</div>
|
|
1099
|
+
|
|
1100
|
+
</turbo-frame>
|
|
1101
|
+
|
|
1102
|
+
</main>
|
|
1103
|
+
</div>
|
|
1104
|
+
|
|
1105
|
+
</div>
|
|
1106
|
+
|
|
1107
|
+
<footer class="footer pt-7 pb-6 f6 color-fg-muted color-border-subtle p-responsive" role="contentinfo" >
|
|
1108
|
+
<h2 class='sr-only'>Footer</h2>
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
<div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
|
|
1114
|
+
<div class="d-flex flex-items-center flex-shrink-0 mx-2">
|
|
1115
|
+
<a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
|
|
1116
|
+
<svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
|
|
1117
|
+
<path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"></path>
|
|
1118
|
+
</svg>
|
|
1119
|
+
</a>
|
|
1120
|
+
<span>
|
|
1121
|
+
© 2026 GitHub, Inc.
|
|
1122
|
+
</span>
|
|
1123
|
+
</div>
|
|
1124
|
+
|
|
1125
|
+
<nav aria-label="Footer">
|
|
1126
|
+
<h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>
|
|
1127
|
+
|
|
1128
|
+
<ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">
|
|
1129
|
+
|
|
1130
|
+
<li class="mx-2">
|
|
1131
|
+
<a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
|
|
1132
|
+
</li>
|
|
1133
|
+
|
|
1134
|
+
<li class="mx-2">
|
|
1135
|
+
<a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
|
|
1136
|
+
</li>
|
|
1137
|
+
|
|
1138
|
+
<li class="mx-2">
|
|
1139
|
+
<a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
|
|
1140
|
+
</li>
|
|
1141
|
+
|
|
1142
|
+
<li class="mx-2">
|
|
1143
|
+
<a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
|
|
1144
|
+
</li>
|
|
1145
|
+
|
|
1146
|
+
<li class="mx-2">
|
|
1147
|
+
<a data-analytics-event="{"category":"Footer","action":"go to community","label":"text:community"}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
|
|
1148
|
+
</li>
|
|
1149
|
+
|
|
1150
|
+
<li class="mx-2">
|
|
1151
|
+
<a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
|
|
1152
|
+
</li>
|
|
1153
|
+
|
|
1154
|
+
<li class="mx-2">
|
|
1155
|
+
<a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
|
|
1156
|
+
</li>
|
|
1157
|
+
|
|
1158
|
+
<li class="mx-2" >
|
|
1159
|
+
<cookie-consent-link>
|
|
1160
|
+
<button
|
|
1161
|
+
type="button"
|
|
1162
|
+
class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
|
|
1163
|
+
data-action="click:cookie-consent-link#showConsentManagement"
|
|
1164
|
+
data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}"
|
|
1165
|
+
>
|
|
1166
|
+
Manage cookies
|
|
1167
|
+
</button>
|
|
1168
|
+
</cookie-consent-link>
|
|
1169
|
+
</li>
|
|
1170
|
+
|
|
1171
|
+
<li class="mx-2">
|
|
1172
|
+
<cookie-consent-link>
|
|
1173
|
+
<button
|
|
1174
|
+
type="button"
|
|
1175
|
+
class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
|
|
1176
|
+
data-action="click:cookie-consent-link#showConsentManagement"
|
|
1177
|
+
data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}"
|
|
1178
|
+
>
|
|
1179
|
+
Do not share my personal information
|
|
1180
|
+
</button>
|
|
1181
|
+
</cookie-consent-link>
|
|
1182
|
+
</li>
|
|
1183
|
+
|
|
1184
|
+
</ul>
|
|
1185
|
+
</nav>
|
|
1186
|
+
</div>
|
|
1187
|
+
</footer>
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
<ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
|
|
1192
|
+
data-locale="en"
|
|
1193
|
+
data-initial-cookie-consent-allowed=""
|
|
1194
|
+
data-cookie-consent-required="false"
|
|
1195
|
+
></ghcc-consent>
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
<div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
|
|
1201
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
|
|
1202
|
+
<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
|
|
1203
|
+
</svg>
|
|
1204
|
+
<button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
|
|
1205
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
|
|
1206
|
+
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
|
|
1207
|
+
</svg>
|
|
1208
|
+
</button>
|
|
1209
|
+
You can’t perform that action at this time.
|
|
1210
|
+
</div>
|
|
1211
|
+
|
|
1212
|
+
<template id="site-details-dialog">
|
|
1213
|
+
<details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
|
|
1214
|
+
<summary role="button" aria-label="Close dialog"></summary>
|
|
1215
|
+
<details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
|
|
1216
|
+
<button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
|
|
1217
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
|
|
1218
|
+
<path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
|
|
1219
|
+
</svg>
|
|
1220
|
+
</button>
|
|
1221
|
+
<div class="octocat-spinner my-6 js-details-dialog-spinner"></div>
|
|
1222
|
+
</details-dialog>
|
|
1223
|
+
</details>
|
|
1224
|
+
</template>
|
|
1225
|
+
|
|
1226
|
+
<div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
|
|
1227
|
+
<div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
|
|
1228
|
+
</div>
|
|
1229
|
+
</div>
|
|
1230
|
+
|
|
1231
|
+
<template id="snippet-clipboard-copy-button">
|
|
1232
|
+
<div class="zeroclipboard-container position-absolute right-0 top-0">
|
|
1233
|
+
<clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
|
|
1234
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2">
|
|
1235
|
+
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
|
|
1236
|
+
</svg>
|
|
1237
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2">
|
|
1238
|
+
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
|
|
1239
|
+
</svg>
|
|
1240
|
+
</clipboard-copy>
|
|
1241
|
+
</div>
|
|
1242
|
+
</template>
|
|
1243
|
+
<template id="snippet-clipboard-copy-button-unpositioned">
|
|
1244
|
+
<div class="zeroclipboard-container">
|
|
1245
|
+
<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
|
|
1246
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
|
|
1247
|
+
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
|
|
1248
|
+
</svg>
|
|
1249
|
+
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
|
|
1250
|
+
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
|
|
1251
|
+
</svg>
|
|
1252
|
+
</clipboard-copy>
|
|
1253
|
+
</div>
|
|
1254
|
+
</template>
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
<style>
|
|
1258
|
+
.user-mention[href$="/n3bkv"] {
|
|
1259
|
+
color: var(--color-user-mention-fg);
|
|
1260
|
+
background-color: var(--bgColor-attention-muted, var(--color-attention-subtle));
|
|
1261
|
+
border-radius: 2px;
|
|
1262
|
+
margin-left: -2px;
|
|
1263
|
+
margin-right: -2px;
|
|
1264
|
+
}
|
|
1265
|
+
.user-mention[href$="/n3bkv"]:before,
|
|
1266
|
+
.user-mention[href$="/n3bkv"]:after {
|
|
1267
|
+
content: '';
|
|
1268
|
+
display: inline-block;
|
|
1269
|
+
width: 2px;
|
|
1270
|
+
}
|
|
1271
|
+
</style>
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
</div>
|
|
1275
|
+
<div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
|
|
1276
|
+
<div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
|
|
1277
|
+
</body>
|
|
1278
|
+
</html>
|
|
1279
|
+
|