@@ -852,7 +852,7 @@ def power(self):
852
852
name = self .args .name
853
853
target = self ._get_target (place )
854
854
from ..resource .power import NetworkPowerPort , PDUDaemonPort
855
- from ..resource .remote import NetworkUSBPowerPort , NetworkSiSPMPowerPort
855
+ from ..resource .remote import NetworkUSBPowerPort , NetworkSiSPMPowerPort , NetworkSysfsGPIO
856
856
from ..resource import TasmotaPowerPort , NetworkYKUSHPowerPort
857
857
858
858
drv = None
@@ -874,6 +874,8 @@ def power(self):
874
874
drv = self ._get_driver_or_new (target , "TasmotaPowerDriver" , name = name )
875
875
elif isinstance (resource , NetworkYKUSHPowerPort ):
876
876
drv = self ._get_driver_or_new (target , "YKUSHPowerDriver" , name = name )
877
+ elif isinstance (resource , NetworkSysfsGPIO ):
878
+ drv = self ._get_driver_or_new (target , "GpioDigitalOutputDriver" , name = name )
877
879
if drv :
878
880
break
879
881
@@ -885,6 +887,32 @@ def power(self):
885
887
if action == "get" :
886
888
print (f"power{ ' ' + name if name else '' } for place { place .name } is { 'on' if res else 'off' } " )
887
889
890
+ def button (self ):
891
+ place = self .get_acquired_place ()
892
+ action = self .args .action
893
+ delay = self .args .delay
894
+ name = self .args .name
895
+ target = self ._get_target (place )
896
+ from ..resource .remote import NetworkSysfsGPIO
897
+
898
+ drv = None
899
+ try :
900
+ drv = target .get_driver ("ButtonProtocol" , name = name )
901
+ except NoDriverFoundError :
902
+ for resource in target .resources :
903
+ if isinstance (resource , NetworkSysfsGPIO ):
904
+ drv = self ._get_driver_or_new (target , "GpioDigitalOutputDriver" , name = name )
905
+ if drv :
906
+ break
907
+
908
+ if not drv :
909
+ raise UserError ("target has no compatible resource available" )
910
+ if delay is not None :
911
+ drv .delay = delay
912
+ res = getattr (drv , action )()
913
+ if action == "get" :
914
+ print (f"button{ ' ' + name if name else '' } for place { place .name } is { 'pressed' if res else 'released' } " )
915
+
888
916
def digital_io (self ):
889
917
place = self .get_acquired_place ()
890
918
action = self .args .action
@@ -923,6 +951,8 @@ def digital_io(self):
923
951
drv .set (True )
924
952
elif action == "low" :
925
953
drv .set (False )
954
+ elif action == "invert" :
955
+ drv .invert ()
926
956
927
957
async def _console (self , place , target , timeout , * , logfile = None , loop = False , listen_only = False ):
928
958
name = self .args .name
@@ -1807,8 +1837,16 @@ def main():
1807
1837
subparser .add_argument ("--name" , "-n" , help = "optional resource name" )
1808
1838
subparser .set_defaults (func = ClientSession .power )
1809
1839
1840
+ subparser = subparsers .add_parser ("button" , help = "change (or get) a place's button status" )
1841
+ subparser .add_argument ("action" , choices = ["press" , "release" , "press_for" , "get" ])
1842
+ subparser .add_argument (
1843
+ "-t" , "--delay" , type = float , default = None , help = "wait time in seconds between the press and release during press_for"
1844
+ )
1845
+ subparser .add_argument ("--name" , "-n" , help = "optional resource name" )
1846
+ subparser .set_defaults (func = ClientSession .button )
1847
+
1810
1848
subparser = subparsers .add_parser ("io" , help = "change (or get) a digital IO status" )
1811
- subparser .add_argument ("action" , choices = ["high" , "low" , "get" ], help = "action" )
1849
+ subparser .add_argument ("action" , choices = ["high" , "low" , "invert" , " get" ], help = "action" )
1812
1850
subparser .add_argument ("name" , help = "optional resource name" , nargs = "?" )
1813
1851
subparser .set_defaults (func = ClientSession .digital_io )
1814
1852
0 commit comments