Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

upgrade to use zigpy packet_receive instead of handle_message #1662

Merged
merged 6 commits into from
Oct 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 6 additions & 15 deletions Classes/ZigpyTransport/AppBellows.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import logging

import bellows.config as bellows_conf
import bellows.types as t
import bellows.types as bt
import zigpy.types as t
import bellows.zigbee.application
import zigpy.config as zigpy_conf
import zigpy.device
Expand Down Expand Up @@ -136,7 +137,7 @@ async def register_endpoints(self, endpoint=1):
def get_device(self, ieee=None, nwk=None):
return Classes.ZigpyTransport.AppGeneric.get_device(self, ieee, nwk)

def handle_join(self, nwk: t.EmberNodeId, ieee: t.EmberEUI64, parent_nwk: t.EmberNodeId, *, handle_rejoin: bool = True,) -> None:
def handle_join(self, nwk: bt.EmberNodeId, ieee: bt.EmberEUI64, parent_nwk: bt.EmberNodeId, *, handle_rejoin: bool = True,) -> None:
return Classes.ZigpyTransport.AppGeneric.handle_join(self, nwk, ieee, parent_nwk)

def get_device_ieee(self, nwk):
Expand All @@ -148,19 +149,9 @@ def handle_leave(self, nwk, ieee):
def get_zigpy_version(self):
return Classes.ZigpyTransport.AppGeneric.get_zigpy_version(self)

def handle_message(
self,
sender: zigpy.device.Device,
profile: int,
cluster: int,
src_ep: int,
dst_ep: int,
message: bytes,
* ,
dst_addressing=None,
)->None:
return Classes.ZigpyTransport.AppGeneric.handle_message(self,sender,profile,cluster,src_ep,dst_ep,message, dst_addressing=dst_addressing)

def packet_received(self, packet: t.ZigbeePacket) -> None:
return Classes.ZigpyTransport.AppGeneric.packet_received(self,packet)

async def set_zigpy_tx_power(self, power):
# EmberConfigTxPowerMode - EZSP_CONFIG_TX_POWER_MODE in EzspConfigId
# 0x00: Normal mode
Expand Down
14 changes: 2 additions & 12 deletions Classes/ZigpyTransport/AppDeconz.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,18 +142,8 @@ def get_device_ieee(self, nwk):
def handle_leave(self, nwk, ieee):
Classes.ZigpyTransport.AppGeneric.handle_leave(self, nwk, ieee)

def handle_message(
self,
sender: zigpy.device.Device,
profile: int,
cluster: int,
src_ep: int,
dst_ep: int,
message: bytes,
* ,
dst_addressing=None,
) -> None:
return Classes.ZigpyTransport.AppGeneric.handle_message(self,sender,profile,cluster,src_ep,dst_ep,message,dst_addressing=dst_addressing)
def packet_received(self, packet: t.ZigbeePacket) -> None:
return Classes.ZigpyTransport.AppGeneric.packet_received(self,packet)

async def set_zigpy_tx_power(self, power):
pass
Expand Down
106 changes: 47 additions & 59 deletions Classes/ZigpyTransport/AppGeneric.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ async def initialize(self, *, auto_form: bool = False, force_form: bool = False)
Starts the network on a connected radio, optionally forming one with random
settings if necessary.
"""
self.log.logging("TransportZigpy", "Debug", "AppGeneric:initialize auto_form: %s force_form: %s Class: %s" %( auto_form, force_form, type(self)))
self.log.logging("TransportZigpy", "Log", "AppGeneric:initialize auto_form: %s force_form: %s Class: %s" %( auto_form, force_form, type(self)))

_retreived_backup = None
if "autoRestore" in self.pluginconf.pluginConf and self.pluginconf.pluginConf["autoRestore"]:
Expand All @@ -45,7 +45,7 @@ async def initialize(self, *, auto_form: bool = False, force_form: bool = False)

if _retreived_backup:
if self.pluginconf.pluginConf[ "OverWriteCoordinatorIEEEOnlyOnce"]:
LOGGER.debug("Allow eui64 overwrite only once !!!")
LOGGER.debug("Allow eui64 overwrite only once !!!")
_retreived_backup.network_info.stack_specific.setdefault("ezsp", {})[ "i_understand_i_can_update_eui64_only_once_and_i_still_want_to_do_it"] = True

LOGGER.debug("Last backup retreived: %s" % _retreived_backup )
Expand Down Expand Up @@ -161,7 +161,7 @@ def get_device_ieee(self, nwk):
return None

def handle_leave(self, nwk, ieee):
self.log.logging("TransportZigpy", "Debug","handle_leave (0x%04x %s)" %(nwk, ieee))
self.log.logging("TransportZigpy", "Log","handle_leave (0x%04x %s)" %(nwk, ieee))
plugin_frame = build_plugin_8048_frame_content(self, ieee)
self.callBackFunction(plugin_frame)
super(type(self),self).handle_leave(nwk, ieee)
Expand All @@ -171,86 +171,74 @@ def get_zigpy_version(self):
LOGGER.debug("get_zigpy_version ake version number. !!")
return self.version

def handle_message(
self,
sender: zigpy.device.Device,
profile: int,
cluster: int,
src_ep: int,
dst_ep: int,
message: bytes,
dst_addressing=None,
) -> None:

def packet_received(self, packet: t.ZigbeePacket) -> None:
"""Notify zigpy of a received Zigbee packet."""
try:
sender = self.get_device_with_address(packet.src)
self.log.logging("TransportZigpy", "Debug", "identified device - %s (%s)" %(str(sender), type(sender)) )

except KeyError:
self.log.logging("TransportZigpy", "Debug", "Unknown device %r", packet.src)
return

self.log.logging("TransportZigpy", "Debug", "identified device - %s (%s)" % (str(sender), type(sender)))

write_capture_rx_frames( self, sender, profile, cluster, src_ep, dst_ep, message, binascii.hexlify(message).decode("utf-8"), dst_addressing)
profile, cluster, src_ep, dst_ep = packet.profile_id, packet.cluster_id, packet.src_ep, packet.dst_ep
message = packet.data.serialize()
hex_message = binascii.hexlify(message).decode("utf-8")
dst_addressing = packet.dst.addr_mode if packet.dst else None

write_capture_rx_frames( self, sender, profile, cluster, src_ep, dst_ep, message, hex_message, dst_addressing)

self.log.logging("TransportZigpy", "Debug", "packet_received - %s %s %s %s %s %s %s %s" %(
sender, profile, cluster, src_ep, dst_ep, message, hex_message, dst_addressing))

if sender.nwk == 0x0000:
self.log.logging("TransportZigpy", "Debug", "handle_message from Controller Sender: %s Profile: %04x Cluster: %04x srcEp: %02x dstEp: %02x message: %s" %(
str(sender.nwk), profile, cluster, src_ep, dst_ep, binascii.hexlify(message).decode("utf-8")))
#self.super().handle_message(sender, profile, cluster, src_ep, dst_ep, message)
super(type(self),self).handle_message(sender, profile, cluster, src_ep, dst_ep, message)
# When coming from coordinator we have to send it back to zigpy
self.log.logging("TransportZigpy", "Debug", "packet_received from Controller Sender: %s Profile: %04x Cluster: %04x srcEp: %02x dstEp: %02x message: %s" %(
str(sender.nwk), profile, cluster, src_ep, dst_ep, hex_message))
super(type(self),self).packet_received(packet)

if cluster == 0x8036:
# This has been handle via on_zdo_mgmt_permitjoin_rsp()
self.log.logging("TransportZigpy", "Debug", "handle_message 0x8036: %s Profile: %04x Cluster: %04x srcEp: %02x dstEp: %02x message: %s" %(
str(sender.nwk), profile, cluster, src_ep, dst_ep, binascii.hexlify(message).decode("utf-8")))
self.callBackFunction( build_plugin_8014_frame_content(self, str(sender), binascii.hexlify(message).decode("utf-8") ) )
super(type(self),self).handle_message(sender, profile, cluster, src_ep, dst_ep, message)
self.log.logging("TransportZigpy", "Debug", "packet_received 0x8036: %s Profile: %04x Cluster: %04x srcEp: %02x dstEp: %02x message: %s" %(
str(sender.nwk), profile, cluster, src_ep, dst_ep, hex_message))
self.callBackFunction( build_plugin_8014_frame_content(self, str(sender), hex_message ) )
super(type(self),self).packet_received(packet)
return

if cluster == 0x8034:
# This has been handle via on_zdo_mgmt_leave_rsp()
self.log.logging("TransportZigpy", "Debug", "handle_message 0x8036: %s Profile: %04x Cluster: %04x srcEp: %02x dstEp: %02x message: %s" %(
str(sender.nwk), profile, cluster, src_ep, dst_ep, binascii.hexlify(message).decode("utf-8")))
self.callBackFunction( build_plugin_8047_frame_content(self, str(sender), binascii.hexlify(message).decode("utf-8")) )
self.log.logging("TransportZigpy", "Debug", "packet_received 0x8036: %s Profile: %04x Cluster: %04x srcEp: %02x dstEp: %02x message: %s" %(
str(sender.nwk), profile, cluster, src_ep, dst_ep, hex_message))
self.callBackFunction( build_plugin_8047_frame_content(self, str(sender), hex_message) )
return

addr = None
if sender.nwk is not None:
addr_mode = 0x02
addr = sender.nwk.serialize()[::-1].hex()
if profile and cluster:
self.log.logging(
"TransportZigpy",
"Debug",
"handle_message device 1: %s Profile: %04x Cluster: %04x sEP: %s dEp: %s message: %s lqi: %s" % (
str(sender), profile, cluster, src_ep, dst_ep, binascii.hexlify(message).decode("utf-8"), sender.lqi)),

elif sender.ieee is not None:
addr = "%016x" % t.uint64_t.deserialize(sender.ieee.serialize())[0]
addr_mode = 0x03
if profile and cluster:
self.log.logging(
"TransportZigpy",
"Debug",
"handle_message device 1: %s Profile: %04x Cluster: %04x sEP: %s dEp: %s message: %s lqi: %s" % (
str(sender), profile, cluster, src_ep, dst_ep, binascii.hexlify(message).decode("utf-8"), sender.lqi)),

if sender.lqi is None:
sender.lqi = 0x00

addr_mode = 0x02 if sender.nwk is not None else 0x03
sender.lqi = sender.lqi or 0x00

# Let's force profile to ZDP if eps == 0x00
if src_ep == dst_ep == 0x00:
profile = 0x0000

if profile and cluster:
self.log.logging(
"TransportZigpy",
"Debug",
"handle_message device 2: %s Profile: %04x Cluster: %04x sEP: %s dEp: %s message: %s lqi: %s" % (
str(addr), profile, cluster, src_ep, dst_ep, binascii.hexlify(message).decode("utf-8"), sender.lqi),
)
if profile is not None and cluster is not None:
self.log.logging( "TransportZigpy", "Debug", "packet_received device: %s Profile: %04x Cluster: %04x sEP: %s dEp: %s message: %s lqi: %s" % (
str(addr), profile, cluster, src_ep, dst_ep, hex_message, sender.lqi), )

if addr:
if addr is not None:
plugin_frame = build_plugin_8002_frame_content(self, addr, profile, cluster, src_ep, dst_ep, message, sender.lqi, src_addrmode=addr_mode)
self.log.logging("TransportZigpy", "Debug", "handle_message Sender: %s frame for plugin: %s" % (addr, plugin_frame))
self.callBackFunction(plugin_frame)
else:
self.log.logging(
"TransportZigpy",
"Error",
"handle_message - Issue with sender is %s %s" % (sender.nwk, sender.ieee),
)
self.log.logging("TransportZigpy", "Debug", "packet_received Sender: %s frame for plugin: %s" % (addr, plugin_frame))
return self.callBackFunction(plugin_frame)

self.log.logging( "TransportZigpy", "Error", "packet_received - Issue with sender is %s %s" % (
sender.nwk, sender.ieee), )

return

Expand Down
16 changes: 4 additions & 12 deletions Classes/ZigpyTransport/AppZnp.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
import zigpy.zdo.types as zdo_types
import zigpy_znp.commands.util
import zigpy_znp.config as znp_conf
import zigpy_znp.types as t
#import zigpy_znp.types as znp_t
import zigpy.types as t
import zigpy_znp.zigbee.application
from Classes.ZigpyTransport.firmwareversionHelper import \
znp_extract_versioning_for_plugin
Expand Down Expand Up @@ -116,17 +117,8 @@ def handle_leave(self, nwk, ieee):
def get_zigpy_version(self):
return Classes.ZigpyTransport.AppGeneric.get_zigpy_version(self)

def handle_message(
self,
sender: zigpy.device.Device,
profile: int,
cluster: int,
src_ep: int,
dst_ep: int,
message: bytes,
dst_addressing=None,
) -> None:
return Classes.ZigpyTransport.AppGeneric.handle_message(self,sender,profile,cluster,src_ep,dst_ep,message, dst_addressing=dst_addressing)
def packet_received(self, packet: t.ZigbeePacket) -> None:
return Classes.ZigpyTransport.AppGeneric.packet_received(self,packet)

async def set_zigpy_tx_power(self, power):
self.log.logging("TransportZigpy", "Debug", "set_tx_power %s" %power)
Expand Down
2 changes: 1 addition & 1 deletion plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -1502,7 +1502,7 @@ def update_DB_device_status_to_reinit( self ):
def check_python_modules_version( self ):

MODULES_VERSION = {
"zigpy": "0.58.1",
"zigpy": "0.59.0",
"zigpy_znp": "0.11.6",
"zigpy_deconz": "0.21.1",
"bellows": "0.36.8",
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
zigpy==0.58.1
zigpy==0.59.0
zigpy_deconz==0.21.1
zigpy-cli==1.0.4
zigpy_znp==0.11.6
Expand Down
Loading