Skip to content

Commit

Permalink
Merge branch 'rc-stable7-019' into read-metering-temperature
Browse files Browse the repository at this point in the history
  • Loading branch information
pipiche38 authored Jan 14, 2025
2 parents 3071e6e + 14b9ac0 commit 6dfef58
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 30 deletions.
52 changes: 31 additions & 21 deletions Classes/WebServer/WebServer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1082,8 +1082,8 @@ def rest_zDevice(self, verb, data, parameters):
if attribut == "Battery" and attribut in self.ListOfDevices[item]:
if self.ListOfDevices[item]["Battery"] in ( {}, ) and "IASBattery" in self.ListOfDevices[item]:
device[attribut] = str(self.ListOfDevices[item][ "IASBattery" ])
elif isinstance( self.ListOfDevices[item]["Battery"], int):
device[attribut] = self.ListOfDevices[item]["Battery"]
elif isinstance( self.ListOfDevices[item]["Battery"], (int,float)):
device[attribut] = int(self.ListOfDevices[item]["Battery"])
device["BatteryInside"] = True

elif item == "CheckParam":
Expand Down Expand Up @@ -1530,43 +1530,53 @@ def rest_zigate_mode(self, verb, data, parameters):
_response["Data"] = json.dumps("ZiGate mode: %s requested" % mode)
return _response


def rest_battery_state(self, verb, data, parameters):
_response = prepResponseMessage(self, setupHeadersResponse())
_response["Headers"]["Content-Type"] = "application/json; charset=utf-8"
if verb == "GET":
_battEnv = {"Battery":{"<30%":{}, "<50%": {}, ">50%" : {}},"Update Time":{ "Unknown": {}, "< 1 week": {}, "> 1 week": {}}}
for x in self.ListOfDevices:
self.logging("Debug", f"rest_battery_state - {x}")
if x == "0000":
continue
continue

if self.ListOfDevices[x]["ZDeviceName"] == "":
_deviceName = x
else:
_deviceName = self.ListOfDevices[x]["ZDeviceName"]
battery = self.ListOfDevices[x].get("Battery")

if "Battery" in self.ListOfDevices[x] and isinstance(self.ListOfDevices[x]["Battery"], int):
if self.ListOfDevices[x]["Battery"] > 50:
_battEnv["Battery"][">50%"][_deviceName] = {"Battery": self.ListOfDevices[x]["Battery"]}
if battery is None:
continue
self.logging("Debug", f"rest_battery_state - {x} Battery found")

elif self.ListOfDevices[x]["Battery"] > 30:
_battEnv["Battery"]["<50%"][_deviceName] = {"Battery": self.ListOfDevices[x]["Battery"]}
_deviceName = self.ListOfDevices[x].get("ZDeviceName", x )

else:
_battEnv["Battery"]["<30%"][_deviceName] = {"Battery": self.ListOfDevices[x]["Battery"]}
if not isinstance( battery, (int, float)):
self.logging("Debug", f"rest_battery_state - {x} Battery found, but not int !! {type(battery)}")
continue
battery = int(battery)

if "BatteryUpdateTime" in self.ListOfDevices[x]:
if (int(time.time()) - self.ListOfDevices[x]["BatteryUpdateTime"]) > 604800: # one week in seconds
_battEnv["Update Time"]["> 1 week"][_deviceName] = {"BatteryUpdateTime": self.ListOfDevices[x]["BatteryUpdateTime"]}
if self.ListOfDevices[x]["Battery"] > 50:
_battEnv["Battery"][">50%"][_deviceName] = {"Battery": battery}

else:
_battEnv["Update Time"]["< 1 week"][_deviceName] = {"BatteryUpdateTime": self.ListOfDevices[x]["BatteryUpdateTime"]}
elif self.ListOfDevices[x]["Battery"] > 30:
_battEnv["Battery"]["<50%"][_deviceName] = {"Battery": battery}

else:
_battEnv["Battery"]["<30%"][_deviceName] = {"Battery": battery}

if "BatteryUpdateTime" in self.ListOfDevices[x]:
if (int(time.time()) - self.ListOfDevices[x]["BatteryUpdateTime"]) > 604800: # one week in seconds
_battEnv["Update Time"]["> 1 week"][_deviceName] = {"BatteryUpdateTime": self.ListOfDevices[x]["BatteryUpdateTime"]}

else:
_battEnv["Update Time"]["Unknown"][_deviceName] = "Unknown"
_battEnv["Update Time"]["< 1 week"][_deviceName] = {"BatteryUpdateTime": self.ListOfDevices[x]["BatteryUpdateTime"]}

else:
_battEnv["Update Time"]["Unknown"][_deviceName] = "Unknown"

self.logging("Debug", f"rest_battery_state - {_battEnv}")
_response["Data"] = json.dumps(_battEnv, sort_keys=True)
return _response

def logging(self, logType, message):
self.log.logging("WebServer", logType, message)

Expand Down
32 changes: 24 additions & 8 deletions Modules/actuators.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def actuator_setcolor(self, nwkid, EPout, value, Color):
if ( "Param" in self.ListOfDevices[nwkid] and "moveToLevel" in self.ListOfDevices[nwkid]["Param"] ):
transitionMoveLevel = "%04x" % int(self.ListOfDevices[nwkid]["Param"]["moveToLevel"])

force_color_command = get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "FORCE_COLOR_COMMAND", return_default=None)
force_color_command = is_tuya_hue_saturation_needed(self, nwkid)
ColorCapabilitiesList = device_color_capabilities( self, nwkid, EPout)
self.log.logging("Command", "Debug", "actuator_setcolor force_color_command %s" % force_color_command, nwkid)

Expand All @@ -266,7 +266,7 @@ def actuator_setcolor(self, nwkid, EPout, value, Color):
handle_color_mode_2(self, nwkid, EPout, Hue_List)
actuator_setlevel(self, nwkid, EPout, value, "Light", transitionMoveLevel)

elif Hue_List["m"] == 3 and force_color_command == "TuyaMovetoHueandSaturation":
elif Hue_List["m"] == 3 and force_color_command:
handle_color_mode_tuya( self, nwkid, EPout, Hue_List, value)

elif Hue_List["m"] == 3:
Expand Down Expand Up @@ -308,7 +308,7 @@ def handle_color_mode_3(self, nwkid, EPout, Hue_List):
#strxy = Hex_Format(4, x) + Hex_Format(4, y)
self.log.logging("Command", "Debug", "handle_color_mode_3 Set Temp X: %s Y: %s" % (x, y), nwkid)
transitionMoveLevel , transitionRGB , transitionMoveLevel , transitionHue , transitionTemp = get_all_transition_mode( self, nwkid)
if get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "TUYAColorControlRgbMode", return_default=None):
if is_tuya_rgb_mode_needed(self, nwkid):
tuya_color_control_rgbMode( self, nwkid, "01")
zcl_move_to_colour(self, nwkid, EPout, Hex_Format(4, x), Hex_Format(4, y), transitionRGB)

Expand All @@ -326,7 +326,7 @@ def handle_color_mode_4(self, nwkid, EPout, Hue_List ):
TempMired = 1000000 // TempKelvin
self.log.logging( "Command", "Log", "handle_color_mode_4 Set Temp Kelvin: %s-%s" % (
TempMired, Hex_Format(4, TempMired)), nwkid )
if get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "TUYAColorControlRgbMode", return_default=None):
if is_tuya_rgb_mode_needed(self, nwkid):
tuya_color_control_rgbMode( self, nwkid, "01")
zcl_move_to_colour_temperature( self, nwkid, EPout, Hex_Format(4, TempMired), transitionTemp)

Expand All @@ -339,7 +339,7 @@ def handle_color_mode_4(self, nwkid, EPout, Hue_List ):

self.log.logging("Command", "Log", "handle_color_mode_4 Set Hue X: %s Saturation: %s" % (
hue, saturation), nwkid)
if get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "TUYAColorControlRgbMode", return_default=None):
if is_tuya_rgb_mode_needed(self, nwkid):
tuya_color_control_rgbMode( self, nwkid, "01")
zcl_move_hue_and_saturation(self, nwkid, EPout, Hex_Format(2, hue), Hex_Format(2, saturation), transitionRGB)

Expand All @@ -353,10 +353,10 @@ def handle_color_mode_9998( self, nwkid, EPout, Hue_List, value):
hue = int(hue * 254 // 360)

self.log.logging("Command", "Debug", "handle_color_mode_9998 Set Hue X: %s Saturation: %s" % (hue, saturation), nwkid)
if get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "TUYAColorControlRgbMode", return_default=None):
if is_tuya_rgb_mode_needed(self, nwkid):
tuya_color_control_rgbMode( self, nwkid, "01")

if get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "FORCE_COLOR_COMMAND", return_default=None) == "TuyaMovetoHueandSaturation":
if is_tuya_hue_saturation_needed(self, nwkid):
tuya_Move_To_Hue_Saturation( self, nwkid, hue, saturation, value)
else:
zcl_move_hue_and_saturation(self, nwkid, EPout, Hex_Format(2, hue), Hex_Format(2, saturation), transitionRGB)
Expand All @@ -365,6 +365,22 @@ def handle_color_mode_9998( self, nwkid, EPout, Hue_List, value):
actuator_setlevel(self, nwkid, EPout, value, "Light", transitionMoveLevel)


def is_tuya_hue_saturation_needed(self, nwkid):
model = self.ListOfDevices[nwkid].get("Model","")
tuya_move_to_hue_and_saturation = get_deviceconf_parameter_value(self, model, "FORCE_COLOR_COMMAND", return_default=None) or get_device_config_param(self, nwkid, "FORCE_COLOR_COMMAND")
return tuya_move_to_hue_and_saturation == "TuyaMovetoHueandSaturation"


def is_tuya_rgb_mode_needed(self, nwkid):
model = self.ListOfDevices[nwkid].get("Model","")
return get_deviceconf_parameter_value(
self,
model,
"TUYAColorControlRgbMode",
return_default=None,
) or get_device_config_param(self, nwkid, "TUYAColorControlRgbMode")


def handle_color_mode_tuya( self, nwkid, EPout, Hue_List, value):

self.log.logging("Command", "Debug", "handle_color_mode_tuya Hue_list: %s Value: %s" % (
Expand All @@ -379,7 +395,7 @@ def handle_color_mode_tuya( self, nwkid, EPout, Hue_List, value):

self.log.logging("Command", "Log", "handle_color_mode_tuya Set Hue X: %s Saturation: %s Value: %s" % (
hue, saturation, value), nwkid)
if get_deviceconf_parameter_value(self, self.ListOfDevices[nwkid]["Model"], "TUYAColorControlRgbMode", return_default=None):
if is_tuya_rgb_mode_needed(self, nwkid):
tuya_color_control_rgbMode( self, nwkid, "01")
tuya_Move_To_Hue_Saturation( self, nwkid, EPout, hue, saturation, transitionHue, value )

Expand Down
1 change: 0 additions & 1 deletion Zigbee/zclDecoders.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@


import struct
from distutils.command.build import build
from os import stat

from Modules.tools import (is_direction_to_client, is_direction_to_server,
Expand Down

0 comments on commit 6dfef58

Please sign in to comment.