Files
pilot/pilot-v2/target/doc/search.index/name/0477f12f5d61.js
Gilles Soulier c5381b7112 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>
2025-12-30 06:23:00 +01:00

1 line
11 KiB
JavaScript

rd_("b()bIObIo00000bV4bV5b[]bcabeq00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bid00bu8bv40bv5000cAnycBuscCpucGidcHDDcIOTcOrdcPidcQoS0cRuncSSDcSyscTLS0cTcpcTls00cUidcVeccack000caddccmd0ccmp0000ccpu0ccwd0cdup0cexe0cf32cf64cfmt000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cmax00000cmutcnew000000000000000000000000000000000000000000000000conecpidcqos0000000cramcstrctcpctlscu16cu32cu64dAddr0dDeaddDiskdFromdHashdIdledIntodItemdIter00dKilldPathdPipedPolldQuitdSegvdStop0dTSTPdTTINdTTOUdTermdTrapdUnixdUserdXCPUdXFSZdalpndbooldcode0dcpusddrop0000000000000000000000000000dfivedfrom0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dhash00dinit0000000000000000000000000000dinto000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000diter0dkilldkinddlist0000dname00000dnext0dpath0dping0dpkid00000000000000000dpoll0dread000000000000000000000000000000000000000drecv0droot0dsize0000000000000000000000dswapdunitdunixduserdwaiteAborteAlarmeByteseChildeCloneeDebugeDerefeDiskseEmptyeError000000eEvent0eGroupeLogin0eNever00eOsStrePowereSleepeUser1eUser2eUserseWinchealiasebrandecheck0eclean000eclone0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ederef00000000000000000000000000000000000eisizeelabelelinuxeloginesliceestate000etasksetopic0000etupleeusizeewrite000000000000000000000000000000000000000000000fAlwaysfBannedfBorrowfClient0fFilterfGroupsfHangupfHasherfKernelfOptionfPacket0fParkedfPubAck0000000000fPubRec0000000000fPubRel0000000000fResult0fRustlsfSenderfSignalfSimple0fStringfSubAck000000000fSystemfTypeIdfUrgentfWakingfWebPki0fZombiefas_u32fborrow000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fclient0fcommonfevents0fgroupsfmemory00fparentfpuback0fpubrec0fpubrel0freason0000000000fretain000fsource00000fstatusfsuback0ftopicsfuptimegConnAck0000000gConnect0000000gDNSName0gDefaultgDisplaygElapsedgFailure0gFromStrgHashMapgHashSetgIllegalgLoadAvggMacAddrgPingReq0000000000gProcessgPubComp0000000000gPublish0000000000gRequest000gSubFail0gSuccess00000000gTimeout0gToOwnedgTracinggTryFromgTryIntogUnknown0gconnack0gconnect0gdefault000000000000000000000000genviron0gfifteengfilters00gmatches0gmax_qosgmessage0gnew_allgnolocalgoptionsgpayload0gpending0gpointergprocessgpubcomp0gpublish00000greasonsgrefresh0000grumqttcgsysinfogtry_ack000gtype_id000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000guser_idhAwaitAckhBytesMuthConnFail0hContinuehDerefMuthDiskKindhDurationhIncoming000hIteratorhLastWill0hNetworkshOrderinghOutgoing00hPingResp0000000000hProtocolhTlsError0hToStringhUnsubAck000000000hUserlandhVecDequehWakekillhcpu_archhcriticalhfrom_str00hfrom_u32hgroup_id0hinflight00hlist_mut000hnew_many0hpassword0hpkt_size000hprotocolhreceivedhrun_timehto_owned0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000htry_from0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000htry_into000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000htry_recv0hunsuback0husername0hvalidatehwith_cmdhwith_cpu0hwith_cwdhwith_exehwith_ramiBorrowMutiComponentiCoversioniDiskUsageiEventLoop0iFormatteriInterruptiMqttState000iPartialEqiPkidInUseiPointableiProfilingiRecvErroriSendErroriSubscribe0000000000iTransportiUnsubFail0iUtf8Erroriboot_timeiclient_id000icollision0icpu_usage00ideref_mut00000000000000000000000000000000ieventloop000ifree_swap0ifrequency0ihost_nameiinto_iter0000000000ikill_withilast_will00imqttbytes000iprocesses0ireferenceiset_loginisubscribe00000ito_string0000000000000itransport0iused_swapivendor_idiwith_rootiwith_swapiwith_userjAtMostOnce0jComponentsjConnection0jDisconnect0000000000jInvalidQoS0jNotConnAck0jNotConnectjPacketType0jPartialOrdjPubAckFail0jPubRecFail0jPubRelFail0jServerBusy0jStateError000jThreadKindjTryRequest0jUpdateKindjborrow_mut000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000jclone_into0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000jdisconnect00000jdisk_usage0jeverything000jfrom_bytesjkeep_alive000jos_versionjproperties000000000000jread_bytesjsession_idjstart_timejtotal_swapkAsyncClient0kAtLeastOnce0kBadClientId0kClientError0kExactlyOnce0kFixedHeader0kLockBlockedkMqttOptions0kNetworkDatakPubCompFail0kRefreshKindkServerMoved0kUNSPECIFIEDkUnsolicited0kUnspecifiedkUnsubscribe0000000000kWrongPacket0kclean_start0kclient_authkcredentials0kfile_systemkfree_memory0kfrom_sender0kmac_addresskmanual_acks000kmount_pointkpacket_type0kpartial_cmp0000000000kreason_code0kreceive_maxkrefresh_allkrefresh_cpuktemperaturekthread_kindktopic_aliasktotal_spacektransmittedktry_publish000kunsubscribe00000kused_memorykvalid_topic0kwith_memory0kwithout_cmdkwithout_cpu0kwithout_cwdkwithout_exekwithout_ramlCGroupLimitslClientConfiglDisconnected0lFlushTimeoutlIntoIteratorlInvalidAlias0lInvalidState0lOnlyIfNotSetlPacketIdZero0lPubAckReasonlPubRecReasonlPubRelReasonlRequestsDone0lTopicNotUtf80lTryRecvErrorlTrySendErrorlVirtualAlarmlcontent_type0lframe_length0lfrom_senders0lis_removablelload_averagelmqtt_optionslrecv_timeout0lrefresh_list0000lrefresh_pidslreturn_codes0lset_inflightltokio_rustlsltotal_memory0lvalid_filter0lwith_environlwithout_rootlwithout_swaplwithout_usermAwaitPingResp0mCloneToUninitmInvalidReasonmNotAuthorized000000mProcessStatusmProtocolError0mPubCompReasonmQuotaExceeded0000mcgroup_limitsmclean_session0mhas_wildcards0mpublish_bytes0mreason_string0000000mset_last_will0mset_transport0mtry_subscribe000mwritten_bytesnAddrParseErrornCpuRefreshKindnNetworkOptionsnNetworkTimeoutnOnNewSubscribe0nPacketTooLarge0nPayloadNotUtf8nPayloadTooLong0nUnsubAckReasonnawait_pingresp0nbroker_address0ndelay_intervalnget_user_by_idnis_unspecifiednkernel_versionnrefresh_memorynresponse_topic0nset_keep_alive0nsubscribe_many000ntotal_receivedntry_disconnect000nvirtual_memorynwith_cpu_usagenwith_frequencynwith_processesnwithout_memory0oBoundaryCrossed0oConnectionError0oDeserialization0oInvalidProtocol0oMalformedPacket000oPayloadRequired0oQoSNotSupported0oSubscribeFilteroTryFromIntErroroavailable_spaceoclone_to_uninit0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000odistribution_idoget_current_pidoglobal_cpu_infoolong_os_versionomax_packet_size000onetwork_options00opreserve_retainoreceive_maximum0orefresh_processosession_present0oset_bind_deviceoset_clean_startoset_credentials0oset_manual_acks0otls_with_configotopic_alias_max00otry_unsubscribe000ouser_properties000000000000owith_disk_usageowithout_environA`CollisionTimeout0A`KeepAliveTimeoutA`OnEverySubscribe0A`PubAckPropertiesA`PubRecPropertiesA`PubRelPropertiesA`RecvTimeoutErrorA`ServerDisconnect0A`SessionTakenOverA`SubAckPropertiesA`TlsConfiguration0A`TopicNameInvalid000A`UnspecifiedError0000A`UseAnotherServer0A`available_memoryA`correlation_data0A`packets_receivedA`pending_throttle0A`retain_availableA`server_referenceA`total_read_bytesAaConnAckPropertiesAaConnectPropertiesAaConnectReturnCode0AaConnectionRefused0AaEmptySubscription000AaInsufficientBytes0AaInvalidPacketType0AaMemoryRefreshKindAaNoValidKeyInChain0AaPubCompPropertiesAaPublishPropertiesAaRetainForwardRule0AaSUPPORTED_SIGNALSAaServerUnavailableAaTopicAliasInvalidAaUnexpectedConnectAaeffective_user_idAaprocesses_by_nameAarefresh_cpu_usageAarefresh_processesAarefresh_specificsAaserver_keep_aliveAaset_clean_sessionAatotal_transmittedAawithout_cpu_usageAawithout_frequencyAawithout_processesAbLastWillPropertiesAbMaximumConnectTimeAbMessageRateTooHighAbNoValidCertInChain0AbProcessRefreshKindAbRetainNotSupported0AbServerShuttingDownAbServiceUnavailable0AbSubscriptionIdZeroAbTopicFilterInvalid00AbUnsubAckPropertiesAbconnect_propertiesAbconnection_timeout0Abeffective_group_idAberrors_on_receivedAbnew_with_specificsAbtry_subscribe_many000Abwithout_disk_usageAcBadUserNamePassword0AcIS_SUPPORTED_SYSTEMAcInvalidDnsNameErrorAcInvalidPropertyType0AcNormalDisconnectionAcSubscribePropertiesAcSubscribeReasonCode0Acauthentication_data00Acpackets_transmittedAcphysical_core_countAcretain_forward_ruleAcset_max_packet_size0Acset_network_options0Acset_receive_maximumAcset_topic_alias_maxAcset_user_propertiesActotal_written_bytesAdAdministrativeActionAdDisconnectReasonCodeAdInvalidProtocolLevel0AdPayloadFormatInvalid000AdPayloadSizeIncorrect0Adcollision_ping_count0Adrequest_problem_info0Adresponse_informationAdset_open_files_limitAdset_pending_throttle0AeIncorrectPacketFormat0AeNoMatchingSubscribers0AeNoSubscriptionExistedAePacketIdentifierInUse00AeUnsubscribePropertiesAeauthentication_method00Aeerrors_on_transmittedAehandle_protocol_errorAerefresh_cpu_frequencyAerefresh_cpu_specificsAerequest_response_info0AfConnectionRateExceeded0AfFloatingPointExceptionAfImplementationSpecificAfIncomingPacketTooLarge0AfInvalidRemainingLengthAfOutgoingPacketTooLarge000AfReceiveMaximumExceededAfRefusedProtocolVersion0Afbroker_topic_alias_maxAfhandle_incoming_packet0Afhandle_outgoing_packet0Afrefresh_pids_specificsAfset_connect_propertiesAfset_connection_timeout0Aftotal_packets_receivedAgBadAuthenticationMethodAgmessage_expiry_interval0Agnew_with_refreshed_list0000Agprocesses_by_exact_nameAgpublish_with_properties0Agsession_expiry_interval0Agset_authentication_dataAgtls_with_default_configAhClientIdentifierNotValidAhInvalidConnectReturnCode0AhInvalidRetainForwardRuleAhMalformedRemainingLength0AhNoValidClientCertInChain0AhPacketIdentifierNotFound0AhPayloadSizeLimitExceeded00AhUninterruptibleDiskSleepAhmax_outgoing_packet_size0Ahpayload_format_indicator0Ahrefresh_memory_specificsAhrequest_channel_capacity0Ahset_request_problem_infoAhset_tcp_recv_buffer_sizeAhset_tcp_send_buffer_sizeAhsubscription_identifiersAhtotal_errors_on_receivedAiDisconnectWithWillMessageAirefresh_process_specificsAiset_authentication_methodAiset_request_response_infoAisubscribe_with_properties0Aitotal_packets_transmittedAjInvalidSubscribeReasonCode0AjSubscriptionIdNotSupportedAjUnsupportedProtocolVersionAjassigned_client_identifierAkImplementationSpecificError0000AkMINIMUM_CPU_UPDATE_INTERVALAkrefresh_processes_specificsAktotal_errors_on_transmittedAktry_publish_with_properties0Akunsubscribe_with_properties0Alset_request_channel_capacity0Ampublish_bytes_with_propertiesAmshared_subscription_availableAmtry_subscribe_with_properties0AnSharedSubscriptionNotSupportedAnsubscribe_many_with_properties0AoSharedSubscriptionsNotSupportedAotry_unsubscribe_with_properties0Aowildcard_subscription_availableBaWildcardSubscriptionsNotSupported0Baget_outgoing_inflight_upper_limitBaset_outgoing_inflight_upper_limitBbsubscription_identifiers_availableBbtry_subscribe_many_with_properties0BcSubscriptionIdentifiersNotSupported")