Pilot v2: Core implementation + battery telemetry
Major updates: - Complete Rust rewrite (pilot-v2/) with working MQTT client - Fixed MQTT event loop deadlock (background task pattern) - Battery telemetry for Linux (auto-detected via /sys/class/power_supply) - Home Assistant auto-discovery for all sensors and switches - Comprehensive documentation (AVANCEMENT.md, CLAUDE.md, roadmap) - Docker test environment with Mosquitto broker - Helper scripts for development and testing Features working: ✅ MQTT connectivity with LWT ✅ YAML configuration with validation ✅ Telemetry: CPU, memory, IP, battery (Linux) ✅ Commands: shutdown, reboot, sleep, screen (dry-run tested) ✅ HA discovery and integration ✅ Allowlist and cooldown protection Ready for testing on real hardware. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/enum.ConnectReturnCode.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/enum.ConnectReturnCode.html">../../../../rumqttc/mqttbytes/v4/enum.ConnectReturnCode.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/enum.ConnectReturnCode.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.ConnAck.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.ConnAck.html">../../../../rumqttc/mqttbytes/v4/struct.ConnAck.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.ConnAck.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.Connect.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.Connect.html">../../../../rumqttc/mqttbytes/v4/struct.Connect.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.Connect.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.LastWill.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.LastWill.html">../../../../rumqttc/mqttbytes/v4/struct.LastWill.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.LastWill.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.Login.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.Login.html">../../../../rumqttc/mqttbytes/v4/struct.Login.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.Login.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.Disconnect.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.Disconnect.html">../../../../rumqttc/mqttbytes/v4/struct.Disconnect.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.Disconnect.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
30
pilot-v2/target/doc/rumqttc/mqttbytes/v4/enum.Packet.html
Normal file
30
pilot-v2/target/doc/rumqttc/mqttbytes/v4/enum.Packet.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
pilot-v2/target/doc/rumqttc/mqttbytes/v4/fn.read.html
Normal file
2
pilot-v2/target/doc/rumqttc/mqttbytes/v4/fn.read.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reads a stream of bytes and extracts next MQTT packet out of it"><title>read in rumqttc::mqttbytes::v4 - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="rumqttc" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0 (ded5c06cf 2025-12-08)" data-channel="1.92.0" data-search-js="search-d69d8955.js" data-stringdex-js="stringdex-c3e638e9.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">read</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../rumqttc/index.html">rumqttc</a><span class="version">0.24.0</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"><h2><a href="index.html">In rumqttc::<wbr>mqttbytes::<wbr>v4</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">rumqttc</a>::<wbr><a href="../index.html">mqttbytes</a>::<wbr><a href="index.html">v4</a></div><h1>Function <span class="fn">read</span> <button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/rumqttc/mqttbytes/v4/mod.rs.html#51-87">Source</a> </span></div><pre class="rust item-decl"><code>pub fn read(stream: &mut BytesMut, max_size: <a class="primitive" href="https://doc.rust-lang.org/1.92.0/std/primitive.usize.html">usize</a>) -> <a class="enum" href="https://doc.rust-lang.org/1.92.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="enum" href="enum.Packet.html" title="enum rumqttc::mqttbytes::v4::Packet">Packet</a>, <a class="enum" href="../enum.Error.html" title="enum rumqttc::mqttbytes::Error">Error</a>></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Reads a stream of bytes and extracts next MQTT packet out of it</p>
|
||||
</div></details></section></div></main></body></html>
|
||||
1
pilot-v2/target/doc/rumqttc/mqttbytes/v4/index.html
Normal file
1
pilot-v2/target/doc/rumqttc/mqttbytes/v4/index.html
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.PingReq.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.PingReq.html">../../../../rumqttc/mqttbytes/v4/struct.PingReq.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.PingReq.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.PingResp.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.PingResp.html">../../../../rumqttc/mqttbytes/v4/struct.PingResp.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.PingResp.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.PubAck.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.PubAck.html">../../../../rumqttc/mqttbytes/v4/struct.PubAck.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.PubAck.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.PubComp.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.PubComp.html">../../../../rumqttc/mqttbytes/v4/struct.PubComp.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.PubComp.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.Publish.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.Publish.html">../../../../rumqttc/mqttbytes/v4/struct.Publish.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.Publish.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.PubRec.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.PubRec.html">../../../../rumqttc/mqttbytes/v4/struct.PubRec.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.PubRec.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.PubRel.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.PubRel.html">../../../../rumqttc/mqttbytes/v4/struct.PubRel.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.PubRel.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1 @@
|
||||
window.SIDEBAR_ITEMS = {"enum":["ConnectReturnCode","Packet","RetainForwardRule","SubscribeReasonCode"],"fn":["read"],"struct":["ConnAck","Connect","Disconnect","LastWill","Login","PingReq","PingResp","PubAck","PubComp","PubRec","PubRel","Publish","SubAck","Subscribe","SubscribeFilter","UnsubAck","Unsubscribe"]};
|
||||
18
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.ConnAck.html
Normal file
18
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.ConnAck.html
Normal file
File diff suppressed because one or more lines are too long
32
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.Connect.html
Normal file
32
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.Connect.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.Login.html
Normal file
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.Login.html
Normal file
File diff suppressed because one or more lines are too long
14
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PingReq.html
Normal file
14
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PingReq.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubAck.html
Normal file
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubAck.html
Normal file
File diff suppressed because one or more lines are too long
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubComp.html
Normal file
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubComp.html
Normal file
File diff suppressed because one or more lines are too long
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubRec.html
Normal file
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubRec.html
Normal file
File diff suppressed because one or more lines are too long
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubRel.html
Normal file
17
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.PubRel.html
Normal file
File diff suppressed because one or more lines are too long
30
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.Publish.html
Normal file
30
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.Publish.html
Normal file
File diff suppressed because one or more lines are too long
18
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.SubAck.html
Normal file
18
pilot-v2/target/doc/rumqttc/mqttbytes/v4/struct.SubAck.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/enum.SubscribeReasonCode.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/enum.SubscribeReasonCode.html">../../../../rumqttc/mqttbytes/v4/enum.SubscribeReasonCode.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/enum.SubscribeReasonCode.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.SubAck.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.SubAck.html">../../../../rumqttc/mqttbytes/v4/struct.SubAck.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.SubAck.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/enum.RetainForwardRule.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/enum.RetainForwardRule.html">../../../../rumqttc/mqttbytes/v4/enum.RetainForwardRule.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/enum.RetainForwardRule.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.Subscribe.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.Subscribe.html">../../../../rumqttc/mqttbytes/v4/struct.Subscribe.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.Subscribe.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.SubscribeFilter.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.SubscribeFilter.html">../../../../rumqttc/mqttbytes/v4/struct.SubscribeFilter.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.SubscribeFilter.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.UnsubAck.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.UnsubAck.html">../../../../rumqttc/mqttbytes/v4/struct.UnsubAck.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.UnsubAck.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;URL=../../../../rumqttc/mqttbytes/v4/struct.Unsubscribe.html">
|
||||
<title>Redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="../../../../rumqttc/mqttbytes/v4/struct.Unsubscribe.html">../../../../rumqttc/mqttbytes/v4/struct.Unsubscribe.html</a>...</p>
|
||||
<script>location.replace("../../../../rumqttc/mqttbytes/v4/struct.Unsubscribe.html" + location.search + location.hash);</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user