22
33from dataclasses import fields
44from datetime import datetime
5- from functools import partial
6- from textwrap import dedent
75from typing import Annotated , Callable , NamedTuple
86
97import typer
108from loguru import logger
9+ from paho .mqtt .client import Client
1110
1211from pms .core import exit_on_fail
1312from pms .sensors .base import ObsData
1413
1514
16- def __missing_mqtt (): # pragma: no cover
17- green = partial (typer .style , fg = typer .colors .GREEN )
18- red = partial (typer .style , fg = typer .colors .GREEN )
19- package = green ("pypms" , bold = True )
20- extra = module = red ("paho-mqtt" , bold = True )
21- msg = f"""
22- { green (__name__ , bold = True )} provides additional functionality to { package } .
23- This functionality requires the { module } module, which is not installed.
24-
25- You can install this additional dependency with
26- { green ("python3 -m pip install --upgrade" )} { package } [{ extra } ]
27- Or, if you installed { package } with { green ("pipx" )}
28- { green ("pipx inject" )} { package } { module }
29- Or, if you installed { package } with { green ("uv tool" )}
30- { green ("uv tool install" )} { package } [{ extra } ]
31- """
32- return dedent (msg )
33-
34-
3515def client_pub (
3616 * , topic : str , host : str , port : int , username : str , password : str
3717) -> Callable [[dict [str , int | str ]], None ]:
38- try :
39- from paho .mqtt import client
40- except ModuleNotFoundError : # pragma: no cover
41- typer .echo (__missing_mqtt ())
42- raise typer .Abort ()
43-
44- c = client .Client (client_id = topic )
18+ c = Client (client_id = topic )
4519 c .enable_logger (logger ) # type:ignore[arg-type]
4620 if username :
4721 c .username_pw_set (username , password )
@@ -50,7 +24,7 @@ def client_pub(
5024 f"{ topic } /$online" , "true" , 1 , True
5125 )
5226 c .will_set (f"{ topic } /$online" , "false" , 1 , True )
53- c .connect (host , port , 60 )
27+ c .connect (host , port )
5428 c .loop_start ()
5529
5630 def pub (data : dict [str , int | str ]) -> None :
@@ -106,28 +80,22 @@ def client_sub(
10680 * ,
10781 on_sensordata : Callable [[Data ], None ],
10882) -> None :
109- def on_message (client , userdata , msg ):
83+ def on_message (client : Client , userdata , msg ):
11084 try :
11185 data = Data .decode (msg .topic , msg .payload )
11286 except UserWarning as e :
11387 logger .debug (e )
11488 else :
11589 on_sensordata (data )
11690
117- try :
118- from paho .mqtt import client
119- except ModuleNotFoundError : # pragma: no cover
120- typer .echo (__missing_mqtt ())
121- raise typer .Abort ()
122-
123- c = client .Client (client_id = topic )
91+ c = Client (client_id = topic )
12492 c .enable_logger (logger ) # type:ignore[arg-type]
12593 if username :
12694 c .username_pw_set (username , password )
12795
12896 c .on_connect = lambda client , userdata , flags , rc : client .subscribe (topic )
12997 c .on_message = on_message
130- c .connect (host , port , 60 )
98+ c .connect (host , port )
13199 c .loop_forever ()
132100
133101
0 commit comments