TISControlProtocol 1.0.65__tar.gz → 1.0.67__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/PKG-INFO +1 -1
  2. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/pyproject.toml +1 -1
  3. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/api.py +81 -24
  4. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/.gitignore +0 -0
  5. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/.vscode/c_cpp_properties.json +0 -0
  6. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/.vscode/launch.json +0 -0
  7. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/.vscode/settings.json +0 -0
  8. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/.vscode/tasks.json +0 -0
  9. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/LICENSE +0 -0
  10. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/MANIFEST.in +0 -0
  11. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/README.md +0 -0
  12. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/dev/pump_version.py +0 -0
  13. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/BytesHelper.py +0 -0
  14. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/__init__.py +0 -0
  15. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/AckCoordinator.py +0 -0
  16. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketDispatcher.py +0 -0
  17. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketExtractor.py +0 -0
  18. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/AnalogFeedbackHandler.py +0 -0
  19. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/AutoBinaryFeedbackHandler.py +0 -0
  20. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/BinaryFeedbackHandler.py +0 -0
  21. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/ClimateBinaryFeedbackHandler.py +0 -0
  22. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/ClimateControlFeedbackHandler.py +0 -0
  23. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/ControlResponseHandler.py +0 -0
  24. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/DiscoveryFeedbackHandler.py +0 -0
  25. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/EnergyFeedbackHandler.py +0 -0
  26. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/FloorBinaryFeedbackHandler.py +0 -0
  27. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/HealthFeedbackHandler.py +0 -0
  28. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/LunaTempFeedbackHandler.py +0 -0
  29. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/RealTimeFeedbackHandler.py +0 -0
  30. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/SearchResponseHandler.py +0 -0
  31. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/SecurityFeedbackHandler.py +0 -0
  32. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/UpdateResponseHandler.py +0 -0
  33. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/UpdateSecurityHandler.py +0 -0
  34. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/WeatherFeedbackHandler.py +0 -0
  35. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketHandlers/__init__.py +0 -0
  36. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketProtocol.py +0 -0
  37. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketReceiver.py +0 -0
  38. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/PacketSender.py +0 -0
  39. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/ProtocolHandler.py +0 -0
  40. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/UpdateCoordinator.py +0 -0
  41. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/Protocols/udp/__init__.py +0 -0
  42. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/__init__.py +0 -0
  43. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/__init__.py +0 -0
  44. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/bill_config_endpoint.py +0 -0
  45. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/change_password_endpoint.py +0 -0
  46. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/get_bill_config_endpoint.py +0 -0
  47. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/get_key_endpoint.py +0 -0
  48. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/password_dashboard.py +0 -0
  49. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/password_form_endpoint.py +0 -0
  50. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/passwords_endpoint.py +0 -0
  51. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/restart_endpoint.py +0 -0
  52. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/scan_devices_endpoint.py +0 -0
  53. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/shared.py +0 -0
  54. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/submit_password.py +0 -0
  55. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/tis_endpoint.py +0 -0
  56. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/apis/update_endpoint.py +0 -0
  57. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/crc.py +0 -0
  58. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/logo.png +0 -0
  59. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/package-lock.json +0 -0
  60. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/package.json +0 -0
  61. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/postcss.config.mjs +0 -0
  62. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/public/__init__.py +0 -0
  63. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/public/dashboard.css +0 -0
  64. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/public/password_dashboard_loader.js +0 -0
  65. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/shared.py +0 -0
  66. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/views/__init__.py +0 -0
  67. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/views/password_dashboard/index.html +0 -0
  68. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/views/password_dashboard/styles.css +0 -0
  69. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/views/password_form/index.html +0 -0
  70. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/src/TISControlProtocol/views/password_form/styles.css +0 -0
  71. {tiscontrolprotocol-1.0.65 → tiscontrolprotocol-1.0.67}/tests/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TISControlProtocol
3
- Version: 1.0.65
3
+ Version: 1.0.67
4
4
  Summary: A library for TIS Control Protocol
5
5
  Project-URL: Homepage, https://github.com/TISControlHass
6
6
  Project-URL: Issues, https://github.com/TISControlHass/issues
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "TISControlProtocol"
7
- version = "1.0.65"
7
+ version = "1.0.67"
8
8
  description = "A library for TIS Control Protocol"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -32,8 +32,10 @@ from .apis import (
32
32
  )
33
33
 
34
34
  try:
35
- import RPi.GPIO as GPIO
36
- import ST7789
35
+ import time
36
+ import spidev
37
+ import gpiod
38
+ from gpiod.line import Direction, Value
37
39
 
38
40
  HAS_ST7789 = True
39
41
  except (ImportError, RuntimeError) as e:
@@ -216,30 +218,62 @@ class TISApi:
216
218
  "ram_percent": mem.percent,
217
219
  }
218
220
 
221
+ def send_command(self, cmd):
222
+ self.gpio_request.set_value(23, Value.INACTIVE) # Command mode (0)
223
+ self.spi.xfer2([cmd])
224
+
225
+ def send_data(self, data):
226
+ self.gpio_request.set_value(23, Value.ACTIVE) # Data mode (1)
227
+ self.spi.xfer2(list(data))
228
+
229
+ def init_display(self):
230
+ # Hardware Reset
231
+ self.gpio_request.set_value(25, Value.INACTIVE)
232
+ time.sleep(0.1)
233
+ self.gpio_request.set_value(25, Value.ACTIVE)
234
+ time.sleep(0.1)
235
+
236
+ # ST7789 Initialization Sequence
237
+ self.send_command(0x11) # Sleep out
238
+ time.sleep(0.12)
239
+
240
+ self.send_command(0x3A) # Color mode 16-bit
241
+ self.send_data([0x55]) # 0x55 for RGB565
242
+
243
+ self.send_command(0x36) # Memory Access Control (MADCTL)
244
+ self.send_data([0x00]) # Normal rotation
245
+
246
+ self.send_command(0x29) # Display on
247
+ time.sleep(0.1)
248
+
249
+ def set_window(self, x1, y1, x2, y2):
250
+ self.send_command(0x2A) # Column Address Set
251
+ self.send_data([x1 >> 8, x1 & 0xFF, x2 >> 8, x2 & 0xFF])
252
+
253
+ self.send_command(0x2B) # Row Address Set
254
+ self.send_data([y1 >> 8, y1 & 0xFF, y2 >> 8, y2 & 0xFF])
255
+
219
256
  def run_display(self, style="dots"):
220
257
  try:
221
258
  if HAS_ST7789:
222
- self.display = ST7789.ST7789(
223
- width=320,
224
- height=240,
225
- rotation=0,
226
- port=0,
227
- cs=0,
228
- dc=23,
229
- rst=25,
230
- backlight=12,
231
- spi_speed_hz=60 * 1000 * 1000,
232
- offset_left=0,
233
- offset_top=0,
259
+ # Initialize SPI Bus
260
+ self.spi = spidev.SpiDev()
261
+ self.spi.open(0, 0)
262
+ self.spi.max_speed_hz = 30 * 1000 * 1000 # 30 MHz (conservative and stable)
263
+ self.spi.mode = 0b00
264
+
265
+ # Open and request GPIO lines using gpiod v2 API
266
+ self.gpio_request = gpiod.request_lines(
267
+ "/dev/gpiochip0",
268
+ consumer="display",
269
+ config={
270
+ 23: gpiod.LineSettings(direction=Direction.OUTPUT, output_value=Value.INACTIVE),
271
+ 25: gpiod.LineSettings(direction=Direction.OUTPUT, output_value=Value.ACTIVE),
272
+ 12: gpiod.LineSettings(direction=Direction.OUTPUT, output_value=Value.ACTIVE),
273
+ },
234
274
  )
235
- GPIO.setwarnings(False)
236
- GPIO.setmode(GPIO.BCM)
237
- GPIO.setup(12, GPIO.OUT)
238
- self._display_pwm = GPIO.PWM(12, 1000)
239
- self._display_pwm.start(100)
240
-
241
- # Initialize display.
242
- self.display.begin()
275
+
276
+ self.init_display()
243
277
  self.set_display_image()
244
278
  else:
245
279
  logging.error("Can't start display, some packages are missing")
@@ -254,12 +288,35 @@ class TISApi:
254
288
  version_text = f"V {self.version}"
255
289
 
256
290
  draw = ImageDraw.Draw(img)
257
- font = ImageFont.load_default(size=28)
291
+ try:
292
+ font = ImageFont.load_default(size=28)
293
+ except TypeError:
294
+ font = ImageFont.load_default()
295
+
258
296
  x, y = 78, 235
259
297
  draw.text((x, y), version_text, font=font, fill=(255, 255, 255))
260
298
  img = img.rotate(-90, expand=True)
261
299
 
262
- self.display.display(img)
300
+ # Convert image to RGB565 (16-bit)
301
+ img_bytes = []
302
+ for y in range(img.height):
303
+ for x in range(img.width):
304
+ r, g, b = img.getpixel((x, y))
305
+ # Pack into RGB565 format
306
+ rgb565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)
307
+ img_bytes.append((rgb565 >> 8) & 0xFF)
308
+ img_bytes.append(rgb565 & 0xFF)
309
+
310
+ # Send pixel data
311
+ self.set_window(0, 0, img.width - 1, img.height - 1)
312
+ self.send_command(0x2C) # Memory Write
313
+
314
+ # Send in chunks to avoid overwhelming the SPI buffer
315
+ chunk_size = 4096
316
+ for i in range(0, len(img_bytes), chunk_size):
317
+ chunk = img_bytes[i:i + chunk_size]
318
+ self.gpio_request.set_value(23, Value.ACTIVE) # Data mode
319
+ self.spi.xfer2(chunk)
263
320
 
264
321
  async def parse_device_manager_request(self, data: dict) -> None:
265
322
  """Parse the device manager request."""