explaingit

ardacelep/fanctl

Analysis updated 2026-05-18

0PythonAudience · generalComplexity · 3/5LicenseSetup · moderate

TLDR

A Python app with desktop, web, and CLI interfaces for controlling Levoit VeSync tower fans without the phone app, with token auth and auto-syncing state.

Mindmap

mindmap
  root((fanctl))
    Fan Controls
      Power Toggle
      Speed 1 to 12
      Mode Selection
      Oscillation and Mute
    Interfaces
      Flet Desktop and Web
      tkinter Desktop
      macOS Menu Bar
    Backend
      VeSync API Auth
      Token Session
      State Polling
    Distribution
      macOS Bundle
      Windows Bundle
      Linux Bundle
Click or tap to explore — scroll the page freely

Code map

Detail Auto

An interactive map of this repo's files and how they connect — its source is parsed live in your browser. Click Visualize to build it.

filefunction / class

What do people build with it?

USE CASE 1

Control a Levoit LTF-F422S tower fan from a desktop or browser interface instead of the VeSync phone app.

USE CASE 2

Automate fan control from the command line as part of a home automation script.

USE CASE 3

Run a local web interface for your fan accessible from any device on your home network.

USE CASE 4

Extend the controller to support another VeSync device by subclassing the FanController.

What is it built with?

PythonFlettkinterpyvesync

How does it compare?

ardacelep/fanctl0xhassaan/nn-from-scratcha-little-hoof/dsr
Stars000
LanguagePythonPythonPython
Setup difficultymoderatemoderatehard
Complexity3/54/55/5
Audiencegeneraldeveloperresearcher

Figures from each repo's GitHub metadata at analysis time.

How do you get it running?

Difficulty · moderate Time to first run · 30min

Requires a Levoit LTF-F422S fan and a VeSync account, other VeSync devices are not supported without additional code.

Use freely for any purpose, including commercial use, as long as you keep the copyright notice.

In plain English

Fanctl is a Python application that lets you control Levoit tower fans (specifically the LTF-F422S model) from your desktop, browser, or the command line, without using the official VeSync mobile app. It talks to the VeSync cloud API using your existing account credentials and gives you a local interface to turn the fan on or off, change its speed (1 to 12), switch modes (Normal, Turbo, Auto, Sleep), toggle oscillation and display, and see the current room temperature. The app has three different interfaces that share the same underlying logic. The primary one uses a framework called Flet, which can run as a desktop app or be opened in a web browser from the same code. There is also a traditional desktop window built with tkinter, and a macOS menu bar icon. Each interface subscribes to state and calls methods on the backend, which handles authentication, device communication, and keeping the state in sync. You log in once with your VeSync email and password. The session token is saved so you are not asked again. The app polls the device's state from the cloud every ten seconds, so changes made elsewhere (from the phone app or the physical fan) appear automatically. End users who do not want to install Python can download a prebuilt bundle from the GitHub releases page for macOS, Windows, or Linux. First-time launches show a security warning because the app is not code-signed, but the README explains clearly how to bypass it on each platform. The app is limited to the one specific fan model it was tested on. The architecture is designed to make adding support for other VeSync devices possible with a new controller subclass. The project is MIT-licensed.

Copy-paste prompts

Prompt 1
I want to control a VeSync smart home device from Python using pyvesync. Show me how to authenticate with email and password, list my devices, and toggle power.
Prompt 2
Help me build a Flet desktop app in Python with a slider that sends its value to a backend on release and shows a status indicator while the command is processing.
Prompt 3
I want my Python app to poll a cloud API every 10 seconds and update the UI when the state changes. Show me how to do this with asyncio and a background polling loop.
Prompt 4
How do I use PyInstaller to bundle a Python desktop app with Tkinter into a standalone executable for macOS and Windows?

Frequently asked questions

What is fanctl?

A Python app with desktop, web, and CLI interfaces for controlling Levoit VeSync tower fans without the phone app, with token auth and auto-syncing state.

What language is fanctl written in?

Mainly Python. The stack also includes Python, Flet, tkinter.

What license does fanctl use?

Use freely for any purpose, including commercial use, as long as you keep the copyright notice.

How hard is fanctl to set up?

Setup difficulty is rated moderate, with roughly 30min to a first successful run.

Who is fanctl for?

Mainly general.

Open on GitHub → Explain another repo

This repo across BitVibe Labs

Scan in gitsafehub Deploy in gitdeployhub ardacelep on gitmyhub

Verify against the repo before relying on details.