@@ -859,7 +859,7 @@ def power(self):
859
859
name = self .args .name
860
860
target = self ._get_target (place )
861
861
from ..resource .power import NetworkPowerPort , PDUDaemonPort
862
- from ..resource .remote import NetworkUSBPowerPort , NetworkSiSPMPowerPort
862
+ from ..resource .remote import NetworkUSBPowerPort , NetworkSiSPMPowerPort , NetworkSysfsGPIO
863
863
from ..resource import TasmotaPowerPort , NetworkYKUSHPowerPort
864
864
865
865
drv = None
@@ -881,6 +881,8 @@ def power(self):
881
881
drv = self ._get_driver_or_new (target , "TasmotaPowerDriver" , name = name )
882
882
elif isinstance (resource , NetworkYKUSHPowerPort ):
883
883
drv = self ._get_driver_or_new (target , "YKUSHPowerDriver" , name = name )
884
+ elif isinstance (resource , NetworkSysfsGPIO ):
885
+ drv = self ._get_driver_or_new (target , "GpioDigitalOutputDriver" , name = name )
884
886
if drv :
885
887
break
886
888
@@ -892,6 +894,32 @@ def power(self):
892
894
if action == "get" :
893
895
print (f"power{ ' ' + name if name else '' } for place { place .name } is { 'on' if res else 'off' } " )
894
896
897
+ def button (self ):
898
+ place = self .get_acquired_place ()
899
+ action = self .args .action
900
+ delay = self .args .delay
901
+ name = self .args .name
902
+ target = self ._get_target (place )
903
+ from ..resource .remote import NetworkSysfsGPIO
904
+
905
+ drv = None
906
+ try :
907
+ drv = target .get_driver ("ButtonProtocol" , name = name )
908
+ except NoDriverFoundError :
909
+ for resource in target .resources :
910
+ if isinstance (resource , NetworkSysfsGPIO ):
911
+ drv = self ._get_driver_or_new (target , "GpioDigitalOutputDriver" , name = name )
912
+ if drv :
913
+ break
914
+
915
+ if not drv :
916
+ raise UserError ("target has no compatible resource available" )
917
+ if delay is not None :
918
+ drv .delay = delay
919
+ res = getattr (drv , action )()
920
+ if action == "get" :
921
+ print (f"button{ ' ' + name if name else '' } for place { place .name } is { 'pressed' if res else 'released' } " )
922
+
895
923
def digital_io (self ):
896
924
place = self .get_acquired_place ()
897
925
action = self .args .action
@@ -930,6 +958,8 @@ def digital_io(self):
930
958
drv .set (True )
931
959
elif action == "low" :
932
960
drv .set (False )
961
+ elif action == "invert" :
962
+ drv .invert ()
933
963
934
964
async def _console (self , place , target , timeout , * , logfile = None , loop = False , listen_only = False ):
935
965
name = self .args .name
@@ -1814,8 +1844,16 @@ def main():
1814
1844
subparser .add_argument ("--name" , "-n" , help = "optional resource name" )
1815
1845
subparser .set_defaults (func = ClientSession .power )
1816
1846
1847
+ subparser = subparsers .add_parser ("button" , help = "change (or get) a place's button status" )
1848
+ subparser .add_argument ("action" , choices = ["press" , "release" , "press_for" , "get" ])
1849
+ subparser .add_argument (
1850
+ "-t" , "--delay" , type = float , default = None , help = "wait time in seconds between the press and release during press_for"
1851
+ )
1852
+ subparser .add_argument ("--name" , "-n" , help = "optional resource name" )
1853
+ subparser .set_defaults (func = ClientSession .button )
1854
+
1817
1855
subparser = subparsers .add_parser ("io" , help = "change (or get) a digital IO status" )
1818
- subparser .add_argument ("action" , choices = ["high" , "low" , "get" ], help = "action" )
1856
+ subparser .add_argument ("action" , choices = ["high" , "low" , "invert" , " get" ], help = "action" )
1819
1857
subparser .add_argument ("name" , help = "optional resource name" , nargs = "?" )
1820
1858
subparser .set_defaults (func = ClientSession .digital_io )
1821
1859
0 commit comments