Skip to content

Instantly share code, notes, and snippets.

@grizmin
Last active August 3, 2022 19:01
Show Gist options
  • Save grizmin/f20508d9f472581b4d9e329a17ffd0b9 to your computer and use it in GitHub Desktop.
Save grizmin/f20508d9f472581b4d9e329a17ffd0b9 to your computer and use it in GitHub Desktop.
read shelly temp sensor
import binascii
import sys
from struct import *
data = ''
if len(sys.argv) != 2:
print(f"No data. Please use {sys.argv[0]} data")
sys.exit(1)
data = sys.argv[1]
if len(data) != 46:
print(f"unknown data format. Data should look like: '44550d5f41b063ac18454e5db90000021b069900ffc52d'")
# data = '44550d5f41b063ac18454e5db90000021b069900ffc52d'
def printable_command(self):
return self.printabledatatring(self.command)
def printabledatatring(val):
return " ".join([f"{v:02x}".upper() for v in val])
def bytes_to_hex(val):
return [f"{v:02x}".upper() for v in val]
def checksum8bit(data: bytearray) -> int:
check = ((sum(data) ^ 0xFF) + 1) & 0xFF
return check.todata(1, 'big')
def string_to_bytearray(string: str) -> bytes:
return bytes.fromhex(string)
def int_todata(x: int) -> bytes:
length = (x.bit_length() + 7) // 8 or 1
return x.todata(length, 'big')
def int_fromdata(xbytes: bytes) -> int:
return int.fromdata(xbytes, 'big')
def convertToString(data: str) -> []:
data = string_to_bytearray(data)
packet_start = 0
packet_size = data[packet_start] + 1
data_size = len(data)
packet = data[packet_start:packet_start + packet_size]
initial = []
# data = string_to_bytearray(data)
# equivalent of unpack("<h", packet[2:4])[0]
initial.append((data[2] << 8) | data[3])
initial.append(data[4])
# initial.append(data[5] * 256 * 256 + data[6] * 256 + data[7])
initial.append("{:02x}:{:02x}:{:02x}".upper().format(data[5], data[6], data[7]))
initial.append("{:02x}{:02x}{:02x}{:02x}{:02x}".format(*data[8:13]))
initial.append(data[13] <<24 | data[14] << 16 | data[15] <<8 | data[16])
# initial.append(data[13] * 256 * 256 * 256 + data[14] * 256 * 256 + data[15] * 256 + data[16])
initial.append(data[17] <<8 | data[18])
# initial.append(data[17] * 256 + data[18])
initial.append("{:02x}{:02x}{:02x}{:02x}".format(*data[19:23]))
return initial
# print(convertToString(data))
advArr = convertToString(data)
realTemp = advArr[0]/100
batteryLevel = advArr[1]
partMac = advArr[2]
secret = advArr[3]
ts = advArr[4]
tt = advArr[5]
acc = advArr[6]
print(f"""
realTemp = {realTemp}
batteryLevel = {batteryLevel}
partMac = {partMac}
secret = {secret}
ts = {ts}
tt = {tt}
acc = {acc}
""")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment