v1.0.0 - 2025-03-13 EHS-Sentinel has been heavily modified to incorporate the control mechanism The read-in behavior of the modbus registers has been revised from chunks to single byte MessageProcessor now runs asynchronously MessageProducer added which takes over the writing communication with the WP Configuration of HASS entities has moved from hardcoded to NASA Repository NASA Repository has been fundamentally changed All FSV Values, NASA_POWER, VAR_IN_TEMP_WATER_LAW_TARGET_F, NASA_INDOOR_OPMODE are allowed for writing mode NASA_OUTDOOR_DEFROST_STEP DEFROST STEP 10 (b'0xa') added ENUM_IN_SG_READY_MODE_STATE ACTIVE (b'0x2') added New configuration point allowControl to allow control of the Samsung EHS heat pump (deactivated by default). [!CAUTION] This functionality requires that EHS-Sentinel actively communicates with the Samsung EHS, so EHS-Sentinel intervenes here in the Modbus data traffic between the components (it sends its own messages). The activation of this functionality is exclusively at your own risk. I assume no liability for any damage caused. new configuration points in logging controlMessage (default False) to print out the controlled mesagges invalidPacket (default False) prints out invalid messages (length not ok, x34 not at end...) Dashboard template has been split, ressources/dashboard_readonly_template.yaml is for readonly mode and the ressources/dashboard_controlmode_template.yaml for control mode
240 lines
9.2 KiB
Python
240 lines
9.2 KiB
Python
import json
|
|
|
|
import os
|
|
import sys
|
|
import inspect
|
|
|
|
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
|
parentdir = os.path.dirname(currentdir)
|
|
sys.path.insert(0, parentdir)
|
|
|
|
import NASAPacket
|
|
import NASAMessage
|
|
|
|
|
|
encode_raw = "[50, 0, 17, 16, 0, 0, 176, 0, 255, 192, 20, 143, 1, 128, 49, 0, 157, 7, 52]"
|
|
encode_raw = "[50, 0, 60, 16, 0, 0, 176, 0, 255, 192, 20, 196, 13, 2, 2, 255, 255, 4, 16, 0, 0, 0, 0, 4, 27, 0, 32, 255, 255, 128, 0, 0, 128, 5, 255, 128, 23, 0, 128, 25, 0, 128, 26, 0, 128, 33, 1, 128, 50, 255, 128, 51, 0, 128, 60, 0, 128, 69, 0, 240, 94, 52]"
|
|
encode_raw = "[50, 0, 56, 98, 0, 144, 178, 0, 32, 192, 17, 3, 11, 64, 147, 0, 64, 148, 0, 66, 115, 0, 0, 66, 116, 0, 0, 66, 117, 0, 0, 66, 118, 0, 0, 66, 119, 0, 0, 66, 120, 0, 0, 66, 121, 0, 0, 66, 122, 0, 0, 66, 123, 0, 0, 221, 200, 52]"
|
|
encode_raw = "[50, 0, 56, 98, 0, 144, 178, 0, 32, 192, 17, 240, 11, 64, 147, 0, 64, 148, 0, 66, 115, 0, 0, 66, 116, 0, 0, 66, 117, 0, 0, 66, 118, 0, 0, 66, 119, 0, 0, 66, 120, 0, 0, 66, 121, 0, 0, 66, 122, 0, 0, 66, 123, 0, 0, 76, 33, 52]"
|
|
#encode_raw ="[50, 0, 48, 98, 0, 144, 178, 0, 32, 192, 17, 240, 11, 64, 147, 0, 64, 148, 0, 66, 115, 0, 0, 66, 116, 0, 66, 117, 0, 66, 118, 0, 66, 119, 0, 66, 120, 0, 66, 121, 0, 66, 122, 0, 66, 123, 0, 7, 180, 52]"
|
|
encode_raw = "['0x32', '0x00', '0x1A', '0x80', '0xFF', '0x00', '0x20', '0x00', '0x00', '0xC0', '0x11', '0xB0', '0x01', '0x06', '0x07', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0xBD', '0xBC', '0x34']"
|
|
try:
|
|
encode_bytearray = json.loads(encode_raw.strip()) # for [12, 234, 456 ,67]
|
|
except:
|
|
encode_tmp = encode_raw.strip().replace("'", "").replace("[", "").replace("]", "").split(", ") # for ['0x1', '0x2' ..]
|
|
encode_bytearray = [int(value, 16) for value in encode_tmp]
|
|
|
|
|
|
print(f"encode raw: {bytearray(encode_bytearray)}")
|
|
print(f"encode bytearray: {encode_bytearray}")
|
|
print(f"encode bytearray length: {len(encode_bytearray)}")
|
|
|
|
encoded_nasa = NASAPacket.NASAPacket()
|
|
encoded_nasa.parse(encode_bytearray)
|
|
|
|
print(f"encode NASA Object: {encoded_nasa}")
|
|
exit()
|
|
# time to reverse that thing!
|
|
decoded_nasa = NASAPacket.NASAPacket()
|
|
decoded_nasa.set_packet_source_address_class(NASAPacket.AddressClassEnum.JIGTester)
|
|
decoded_nasa.set_packet_source_channel(0)
|
|
decoded_nasa.set_packet_source_address(0)
|
|
decoded_nasa.set_packet_dest_address_class(NASAPacket.AddressClassEnum.BroadcastSelfLayer)
|
|
decoded_nasa.set_packet_dest_channel(0)
|
|
decoded_nasa.set_packet_dest_address(255)
|
|
decoded_nasa.set_packet_information(True)
|
|
decoded_nasa.set_packet_version(2)
|
|
decoded_nasa.set_packet_retry_count(0)
|
|
decoded_nasa.set_packet_type(NASAPacket.PacketType.Normal)
|
|
decoded_nasa.set_packet_data_type(NASAPacket.DataType.Notification)
|
|
decoded_nasa.set_packet_number(143)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8031)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
decoded_nasa.set_packet_messages([tmp_msg])
|
|
|
|
decoded_nasa = NASAPacket.NASAPacket()
|
|
decoded_nasa.set_packet_source_address_class(NASAPacket.AddressClassEnum.Outdoor)
|
|
decoded_nasa.set_packet_source_channel(0)
|
|
decoded_nasa.set_packet_source_address(0)
|
|
decoded_nasa.set_packet_dest_address_class(NASAPacket.AddressClassEnum.BroadcastSelfLayer)
|
|
decoded_nasa.set_packet_dest_channel(0)
|
|
decoded_nasa.set_packet_dest_address(255)
|
|
decoded_nasa.set_packet_information(True)
|
|
decoded_nasa.set_packet_version(2)
|
|
decoded_nasa.set_packet_retry_count(0)
|
|
decoded_nasa.set_packet_type(NASAPacket.PacketType.Normal)
|
|
decoded_nasa.set_packet_data_type(NASAPacket.DataType.Notification)
|
|
decoded_nasa.set_packet_number(196)
|
|
lst = []
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x0202)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([255, 255])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x0410)
|
|
tmp_msg.set_packet_message_type(2)
|
|
tmp_msg.set_packet_payload([0, 0, 0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x41b)
|
|
tmp_msg.set_packet_message_type(2)
|
|
tmp_msg.set_packet_payload([0, 32, 255, 255])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8000)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8005)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([255])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8017)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8019)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x801a)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8021)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([1])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8032)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([255])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8033)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x803c)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x8045)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
decoded_nasa.set_packet_messages(lst)
|
|
|
|
#rasw = decoded_nasa.to_raw()
|
|
|
|
decoded_nasa = NASAPacket.NASAPacket()
|
|
decoded_nasa.set_packet_source_address_class(NASAPacket.AddressClassEnum.WiFiKit)
|
|
decoded_nasa.set_packet_source_channel(0)
|
|
decoded_nasa.set_packet_source_address(144)
|
|
decoded_nasa.set_packet_dest_address_class(NASAPacket.AddressClassEnum.BroadcastSetLayer)
|
|
decoded_nasa.set_packet_dest_channel(0)
|
|
decoded_nasa.set_packet_dest_address(32)
|
|
decoded_nasa.set_packet_information(True)
|
|
decoded_nasa.set_packet_version(2)
|
|
decoded_nasa.set_packet_retry_count(0)
|
|
decoded_nasa.set_packet_type(NASAPacket.PacketType.Normal)
|
|
decoded_nasa.set_packet_data_type(NASAPacket.DataType.Read)
|
|
decoded_nasa.set_packet_number(240)
|
|
lst = []
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4093)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4094)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4273)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4274)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4275)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4276)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4277)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4278)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x4279)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x427a)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x427b)
|
|
tmp_msg.set_packet_message_type(1)
|
|
tmp_msg.set_packet_payload([0, 0])
|
|
lst.append(tmp_msg)
|
|
decoded_nasa.set_packet_messages(lst)
|
|
|
|
decoded_nasa = NASAPacket.NASAPacket()
|
|
decoded_nasa.set_packet_source_address_class(NASAPacket.AddressClassEnum.WiFiKit)
|
|
decoded_nasa.set_packet_source_channel(0)
|
|
decoded_nasa.set_packet_source_address(144)
|
|
decoded_nasa.set_packet_dest_address_class(NASAPacket.AddressClassEnum.BroadcastSelfLayer)
|
|
decoded_nasa.set_packet_dest_channel(255)
|
|
decoded_nasa.set_packet_dest_address(255)
|
|
decoded_nasa.set_packet_information(True)
|
|
decoded_nasa.set_packet_version(2)
|
|
decoded_nasa.set_packet_retry_count(0)
|
|
decoded_nasa.set_packet_type(NASAPacket.PacketType.Normal)
|
|
decoded_nasa.set_packet_data_type(NASAPacket.DataType.Notification)
|
|
decoded_nasa.set_packet_number(168)
|
|
tmp_msg = NASAMessage.NASAMessage()
|
|
tmp_msg.set_packet_message(0x0000)
|
|
tmp_msg.set_packet_message_type(0)
|
|
tmp_msg.set_packet_payload([2])
|
|
decoded_nasa.set_packet_messages([tmp_msg])
|
|
|
|
|
|
rasw = decoded_nasa.to_raw()
|
|
|
|
print(f"decoded bytearray: {rasw}")
|
|
print(f"decoded NASA Object: {decoded_nasa}")
|
|
print(f"decoded bytearray: {[int(value) for value in rasw]}")
|
|
|
|
print("Reverse Check:")
|
|
checkback = NASAPacket.NASAPacket()
|
|
checkback.parse(rasw)
|
|
print(checkback) |