@@ -1532,6 +1532,7 @@ class Matter_Device
1532
1532
def register_commands ()
1533
1533
tasmota.add_cmd ( "MtrJoin" , / cmd_found, idx, payload, payload_json -> self .MtrJoin ( cmd_found, idx, payload, payload_json))
1534
1534
tasmota.add_cmd ( "MtrUpdate" , / cmd_found, idx, payload, payload_json -> self .MtrUpdate ( cmd_found, idx, payload, payload_json))
1535
+ tasmota.add_cmd ( "MtrInfo" , / cmd_found, idx, payload, payload_json -> self .MtrInfo ( cmd_found, idx, payload, payload_json))
1535
1536
end
1536
1537
1537
1538
#####################################################################
@@ -1553,47 +1554,111 @@ class Matter_Device
1553
1554
# `MtrUpdate`
1554
1555
#
1555
1556
# MtrUpdate {"ep":1, "Power":1}
1556
- # MtrUpdate {"Name":"ep1", "Power":1}
1557
- # MtrUpdate {"Name":"My_virtual_light", "Power":1}
1557
+ # MtrUpdate {"name":"ep1", "power":1}
1558
+ # MtrUpdate {"Name":"Light0", "Power":0}
1559
+ # MtrUpdate {"Name":"Light0", "Power":1}
1560
+ # MtrUpdate {"Name":"Light1", "Power":0}
1561
+ # MtrUpdate {"Name":"Light1", "Power":1,"Bri":55}
1562
+ # MtrUpdate {"Name":"Light2", "Power":0}
1563
+ # MtrUpdate {"Name":"Light2", "Power":1, "CT":400, "Bri":20}
1564
+ # MtrUpdate {"Name":"Light3", "Power":0}
1565
+ # MtrUpdate {"Name":"Light3", "Power":1, "Bri":20, "Hue":85, "Sat":200}
1558
1566
#
1559
1567
def MtrUpdate ( cmd_found, idx, payload, payload_json)
1560
- if payload_json == nil return tasmota.resp_cmnd ( "Invalid JSON" ) end
1568
+ if payload_json == nil return tasmota.resp_cmnd_str ( "Invalid JSON" ) end
1569
+
1570
+ var key_ep = tasmota.find_key_i ( payload_json, 'Ep' )
1571
+ var key_name = tasmota.find_key_i ( payload_json, 'Name' )
1572
+ if key_ep || key_name
1573
+ var pl = nil # plugin instance
1574
+
1575
+ if key_ep
1576
+ var ep = int ( payload_json[ key_ep])
1577
+ if ep <= 0 return tasmota.resp_cmnd_str ( "Invalid 'Ep' attribute" ) end
1578
+ pl = self .find_plugin_by_endpoint ( ep)
1579
+ payload_json.remove ( key_ep)
1580
+ end
1581
+
1582
+ if key_name
1583
+ if pl == nil
1584
+ pl = self .find_plugin_by_friendly_name ( payload_json[ key_name])
1585
+ end
1586
+ payload_json.remove ( key_name)
1587
+ end
1561
1588
1562
- var key_i
1563
- if ( key_i := tasmota.find_key_i ( payload_json, 'Device' )) != nil
1564
- var pl = self .find_plugin_by_name_or_ep ( payload[ key_i])
1565
- if ( pl == nil ) return tasmota.resp_cmnd ( "Invalid Device" ) end
1566
- if (! pl.virtual ) return tasmota.resp_cmnd ( "Device is not virtual" ) end
1567
- # find endpoint (plugin) by name
1568
- # can be:
1569
- # - integer: endpoint number
1570
- # - "ep<n>": endpoint number
1571
- # - "<name>": friendly name for endpoint
1589
+ if ( pl == nil ) return tasmota.resp_cmnd_str ( "Invalid Device" ) end
1590
+ if (! pl.virtual ) return tasmota.resp_cmnd_str ( "Device is not virtual" ) end
1591
+ # filter parameter accedpted by plugin, and rename with canonical
1592
+ # Ex: {"power":1,"HUE":2} becomes {"Power":1,"Hue":2}
1593
+ var uc = pl.consolidate_update_commands ()
1594
+ # check that all commands are in the list of supported commands
1595
+ var cmd_cleaned = {}
1596
+ for k: payload_json.keys ()
1597
+ var cleaned_command_idx = tasmota.find_list_i ( uc, k)
1598
+ if ( cleaned_command_idx == nil )
1599
+ tasmota.resp_cmnd_str ( f"Invalid command '{payload_json[k]}'" )
1600
+ return
1601
+ end
1602
+ cmd_cleaned[ uc[ cleaned_command_idx]] = payload_json[ k]
1603
+ end
1604
+ # call plug-in
1605
+ pl.update_virtual ( cmd_cleaned)
1606
+ var state_json = pl.state_json ()
1607
+ if state_json
1608
+ var cmnd_status = f'{{"{cmd_found}":{state_json}}}'
1609
+ return tasmota.resp_cmnd ( cmnd_status)
1610
+ else
1611
+ return tasmota.resp_cmnd_done ()
1612
+ end
1572
1613
end
1573
1614
1574
- tasmota.resp_cmnd_done ( )
1615
+ tasmota.resp_cmnd_str ( "Missing 'Device' attribute" )
1575
1616
end
1576
1617
1577
1618
#####################################################################
1578
- # find_plugin_by_name_or_ep
1619
+ # `MtrInfo`
1579
1620
#
1580
- # `name`can be:
1581
- # - integer: endpoint number
1582
- # - "ep<n>": endpoint number
1583
- # - "<name>": friendly name for endpoint
1584
- def find_plugin_by_name_or_ep ( name)
1585
- if type ( name) == 'int'
1586
- if ( name > 0 ) return self .find_plugin_by_endpoint ( name) end
1587
- elif type ( name) == 'string'
1588
- if name[ 0 . .1 ] == "ep"
1589
- var ep_num = int ( name[ 2 ..])
1590
- if ep_num > 0 return self .find_plugin_by_endpoint ( ep_num) end
1591
- else
1592
- return self .find_plugin_by_friendly_name ( name)
1621
+ # MtrInfo 9
1622
+ def MtrInfo ( cmd_found, idx, payload, payload_json)
1623
+ if payload == ""
1624
+ # dump all devices
1625
+ end
1626
+
1627
+ if payload == ""
1628
+ # dump all
1629
+ for pl: self .plugins
1630
+ self .MtrInfo_one ( pl.endpoint )
1631
+ end
1632
+
1633
+ elif type ( payload_json) == 'int'
1634
+ # try ep number
1635
+ self .MtrInfo_one ( payload_json)
1636
+
1637
+ else
1638
+ # try by name
1639
+ var pl = self .find_plugin_by_friendly_name ( payload)
1640
+ if pl != nil
1641
+ self .MtrInfo_one ( pl.endpoint )
1593
1642
end
1594
1643
end
1595
- return nil # invalid type
1644
+
1645
+ tasmota.resp_cmnd_done ()
1596
1646
end
1647
+
1648
+ # output for a single endpoint
1649
+ def MtrInfo_one ( ep)
1650
+ var pl = self .find_plugin_by_endpoint ( ep)
1651
+ if pl == nil return end # abort
1652
+
1653
+ var state_json = pl.state_json ()
1654
+ if state_json
1655
+ var mtr_info = f'{{"' 'MtrInfo"' ':{state_json}}}'
1656
+ # publish
1657
+ # tasmota.publish_rule(mtr_info)
1658
+ tasmota.publish_result ( mtr_info, "" )
1659
+ end
1660
+ end
1661
+
1597
1662
end
1598
1663
matter.Device = Matter_Device
1599
1664
0 commit comments