@@ -866,7 +866,7 @@ def power(self):
866
866
name = self .args .name
867
867
target = self ._get_target (place )
868
868
from ..resource .power import NetworkPowerPort , PDUDaemonPort
869
- from ..resource .remote import NetworkUSBPowerPort , NetworkSiSPMPowerPort
869
+ from ..resource .remote import NetworkUSBPowerPort , NetworkSiSPMPowerPort , NetworkSysfsGPIO
870
870
from ..resource import TasmotaPowerPort , NetworkYKUSHPowerPort
871
871
872
872
drv = None
@@ -888,6 +888,8 @@ def power(self):
888
888
drv = self ._get_driver_or_new (target , "TasmotaPowerDriver" , name = name )
889
889
elif isinstance (resource , NetworkYKUSHPowerPort ):
890
890
drv = self ._get_driver_or_new (target , "YKUSHPowerDriver" , name = name )
891
+ elif isinstance (resource , NetworkSysfsGPIO ):
892
+ drv = self ._get_driver_or_new (target , "GpioDigitalOutputDriver" , name = name )
891
893
if drv :
892
894
break
893
895
@@ -899,6 +901,32 @@ def power(self):
899
901
if action == "get" :
900
902
print (f"power{ ' ' + name if name else '' } for place { place .name } is { 'on' if res else 'off' } " )
901
903
904
+ def button (self ):
905
+ place = self .get_acquired_place ()
906
+ action = self .args .action
907
+ delay = self .args .delay
908
+ name = self .args .name
909
+ target = self ._get_target (place )
910
+ from ..resource .remote import NetworkSysfsGPIO
911
+
912
+ drv = None
913
+ try :
914
+ drv = target .get_driver ("ButtonProtocol" , name = name )
915
+ except NoDriverFoundError :
916
+ for resource in target .resources :
917
+ if isinstance (resource , NetworkSysfsGPIO ):
918
+ drv = self ._get_driver_or_new (target , "GpioDigitalOutputDriver" , name = name )
919
+ if drv :
920
+ break
921
+
922
+ if not drv :
923
+ raise UserError ("target has no compatible resource available" )
924
+ if delay is not None :
925
+ drv .delay = delay
926
+ res = getattr (drv , action )()
927
+ if action == "get" :
928
+ print (f"button{ ' ' + name if name else '' } for place { place .name } is { 'pressed' if res else 'released' } " )
929
+
902
930
def digital_io (self ):
903
931
place = self .get_acquired_place ()
904
932
action = self .args .action
@@ -937,6 +965,8 @@ def digital_io(self):
937
965
drv .set (True )
938
966
elif action == "low" :
939
967
drv .set (False )
968
+ elif action == "invert" :
969
+ drv .invert ()
940
970
941
971
async def _console (self , place , target , timeout , * , logfile = None , loop = False , listen_only = False ):
942
972
name = self .args .name
@@ -1821,8 +1851,16 @@ def main():
1821
1851
subparser .add_argument ("--name" , "-n" , help = "optional resource name" )
1822
1852
subparser .set_defaults (func = ClientSession .power )
1823
1853
1854
+ subparser = subparsers .add_parser ("button" , help = "change (or get) a place's button status" )
1855
+ subparser .add_argument ("action" , choices = ["press" , "release" , "press_for" , "get" ])
1856
+ subparser .add_argument (
1857
+ "-t" , "--delay" , type = float , default = None , help = "wait time in seconds between the press and release during press_for"
1858
+ )
1859
+ subparser .add_argument ("--name" , "-n" , help = "optional resource name" )
1860
+ subparser .set_defaults (func = ClientSession .button )
1861
+
1824
1862
subparser = subparsers .add_parser ("io" , help = "change (or get) a digital IO status" )
1825
- subparser .add_argument ("action" , choices = ["high" , "low" , "get" ], help = "action" )
1863
+ subparser .add_argument ("action" , choices = ["high" , "low" , "invert" , " get" ], help = "action" )
1826
1864
subparser .add_argument ("name" , help = "optional resource name" , nargs = "?" )
1827
1865
subparser .set_defaults (func = ClientSession .digital_io )
1828
1866
0 commit comments