Monitoring Your Samsung ASHP Controller

@pantherale0 Just to feedback I have a connection. Now to start the next learning curve and understand what I can do with it and HA.

I wrote a small test program to confirm I can see the message stream.

32 00 3d 10 01 00 b0 01 ff c0 14 80 0d 82 3f 00 c8 80 8d 00 80 01 02 82 48 00 ff 82 49 00 ff 80 03 02 84 04 04 80 82 02 82 44 00 00 82 47 00 ff 80 61 ff 80 62 00 80 75 ff 80 5e 01 61 63 34
Using Sarahs decoder I see this, so assume I have a clean connection.

Using your cli as per your github documentation output is not what I was expecting:

python -m pysamsungnasa
Samsung NASA Interactive CLI. Type ā€˜help’ for a list of commands.

python -m pysamsungnasa
Samsung NASA Interactive CLI. Type ā€˜help’ for a list of commands.

list
Unknown command: list
list
Unknown command: list
device 100100
Device 100100:
Last seen: 2026-03-24 09:14:50.429912+00:00
Address: 100100
Device Type: OUTDOOR
Config: NasaConfig(client_address=1, device_dump_only=False, device_pnp=True, device_addresses=, max_buffer_size=262144, log_all_messages=False, devices_to_log=, messages_to_log=, log_buffer_messages=False, enable_read_retries=True, read_retry_max_attempts=3, read_retry_interval=1.0, read_retry_backoff_factor=1.1, enable_write_retries=True, write_retry_max_attempts=3, write_retry_interval=1.0, write_retry_backoff_factor=1.1)
Total attributes: 132
FSV Config: {}
33317: {ā€˜message_id’: 33317, ā€˜message_name’: ā€˜Unknown Temperature Sensor’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 43.6, ā€˜is_fsv_message’: False}
33523: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0107’, ā€˜is_fsv_message’: False}
33315: {ā€˜message_id’: 33315, ā€˜message_name’: ā€˜Outdoor Target Discharge Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 43.900000000000006, ā€˜is_fsv_message’: False}
33343: {ā€˜message_id’: 33343, ā€˜message_name’: ā€˜Outdoor Control Prime Unit’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
32909: {ā€˜message_id’: 32909, ā€˜message_name’: ā€˜Message 808D’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32769: {ā€˜message_id’: 32769, ā€˜message_name’: ā€˜Outdoor Operation Status’, ā€˜unit_of_measurement’: None, ā€˜value’: <OutdoorOperationStatus.OP_NORMAL: 2>, ā€˜is_fsv_message’: False}
33352: {ā€˜message_id’: 33352, ā€˜message_name’: ā€˜Outdoor Safety Start’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33353: {ā€˜message_id’: 33353, ā€˜message_name’: ā€˜Message 8249’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
32771: {ā€˜message_id’: 32771, ā€˜message_name’: ā€˜Outdoor Operation Heat/Cool Mode’, ā€˜unit_of_measurement’: None, ā€˜value’: <OutdoorOperationHeatCool.HEAT: 2>, ā€˜is_fsv_message’: False}
33796: {ā€˜message_id’: 33796, ā€˜message_name’: ā€˜Message 8404’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜04808202’, ā€˜is_fsv_message’: False}
33348: {ā€˜message_id’: 33348, ā€˜message_name’: ā€˜Message 8244’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33351: {ā€˜message_id’: 33351, ā€˜message_name’: ā€˜Outdoor Defrost Stage’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
32865: {ā€˜message_id’: 32865, ā€˜message_name’: ā€˜Outdoor Defrost Status’, ā€˜unit_of_measurement’: None, ā€˜value’: <OutdoorIndoorDefrostStep.NO_DEFROST_OPERATION: 255>, ā€˜is_fsv_message’: False}
32866: {ā€˜message_id’: 32866, ā€˜message_name’: ā€˜Message 8062’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32885: {ā€˜message_id’: 32885, ā€˜message_name’: ā€˜Message 8075’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ff’, ā€˜is_fsv_message’: False}
32862: {ā€˜message_id’: 32862, ā€˜message_name’: ā€˜Message 805E’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜01’, ā€˜is_fsv_message’: False}
33331: {ā€˜message_id’: 33331, ā€˜message_name’: ā€˜Outdoor Operation Capacity Sum’, ā€˜unit_of_measurement’: None, ā€˜value’: 11.781999999999998, ā€˜is_fsv_message’: False}
33432: {ā€˜message_id’: 33432, ā€˜message_name’: ā€˜Message 8298’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33448: {ā€˜message_id’: 33448, ā€˜message_name’: ā€˜IDU absolute capacity’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33449: {ā€˜message_id’: 33449, ā€˜message_name’: ā€˜Message 82A9’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33450: {ā€˜message_id’: 33450, ā€˜message_name’: ā€˜Message 82AA’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
32831: {ā€˜message_id’: 32831, ā€˜message_name’: ā€˜Message 803F’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
33347: {ā€˜message_id’: 33347, ā€˜message_name’: ā€˜Message 8243’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33333: {ā€˜message_id’: 33333, ā€˜message_name’: ā€˜Outdoor Error Code’, ā€˜unit_of_measurement’: None, ā€˜value’: 0, ā€˜is_fsv_message’: False}
32959: {ā€˜message_id’: 32959, ā€˜message_name’: ā€˜Message 80BF’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32817: {ā€˜message_id’: 32817, ā€˜message_name’: ā€˜Message 8031’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
514: {ā€˜message_id’: 514, ā€˜message_name’: ā€˜Current Error Code’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜E65535’, ā€˜is_fsv_message’: False}
1040: {ā€˜message_id’: 1040, ā€˜message_name’: ā€˜Operation Mode Limit’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
1051: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0020ffff’, ā€˜is_fsv_message’: False}
32768: {ā€˜message_id’: 32768, ā€˜message_name’: ā€˜Outdoor Operation Service Operation’, ā€˜unit_of_measurement’: None, ā€˜value’: None, ā€˜is_fsv_message’: False}
32791: {ā€˜message_id’: 32791, ā€˜message_name’: ā€˜Outdoor Hot Gas 1 Load’, ā€˜unit_of_measurement’: None, ā€˜value’: <OutdoorHotGasLoad.OFF: 0>, ā€˜is_fsv_message’: False}
32794: {ā€˜message_id’: 32794, ā€˜message_name’: ā€˜Outdoor Load 4-Way Valve’, ā€˜unit_of_measurement’: None, ā€˜value’: <Outdoor4WayLoad.OFF: 0>, ā€˜is_fsv_message’: False}
32801: {ā€˜message_id’: 32801, ā€˜message_name’: ā€˜EVI Bypass Load’, ā€˜unit_of_measurement’: None, ā€˜value’: <OutdoorEviBypassLoad.OFF: 0>, ā€˜is_fsv_message’: False}
32818: {ā€˜message_id’: 32818, ā€˜message_name’: ā€˜Message 8032’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ff’, ā€˜is_fsv_message’: False}
32819: {ā€˜message_id’: 32819, ā€˜message_name’: ā€˜Message 8033’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32837: {ā€˜message_id’: 32837, ā€˜message_name’: ā€˜Message 8045’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32870: {ā€˜message_id’: 32870, ā€˜message_name’: ā€˜Message 8066’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32887: {ā€˜message_id’: 32887, ā€˜message_name’: ā€˜Message 8077’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32888: {ā€˜message_id’: 32888, ā€˜message_name’: ā€˜Message 8078’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32889: {ā€˜message_id’: 32889, ā€˜message_name’: ā€˜Message 8079’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32890: {ā€˜message_id’: 32890, ā€˜message_name’: ā€˜Message 807A’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32891: {ā€˜message_id’: 32891, ā€˜message_name’: ā€˜Message 807B’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32892: {ā€˜message_id’: 32892, ā€˜message_name’: ā€˜Message 807C’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32893: {ā€˜message_id’: 32893, ā€˜message_name’: ā€˜Message 807D’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32894: {ā€˜message_id’: 32894, ā€˜message_name’: ā€˜Message 807E’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32895: {ā€˜message_id’: 32895, ā€˜message_name’: ā€˜Message 807F’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ff’, ā€˜is_fsv_message’: False}
32937: {ā€˜message_id’: 32937, ā€˜message_name’: ā€˜Message 80A9’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32943: {ā€˜message_id’: 32943, ā€˜message_name’: ā€˜Base Heater’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32945: {ā€˜message_id’: 32945, ā€˜message_name’: ā€˜Message 80B1’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32951: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32983: {ā€˜message_id’: 32983, ā€˜message_name’: ā€˜PHE Heater’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
33284: {ā€˜message_id’: 33284, ā€˜message_name’: ā€˜Outdoor Air Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 12.100000000000001, ā€˜is_fsv_message’: False}
33286: {ā€˜message_id’: 33286, ā€˜message_name’: ā€˜High Pressure’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33288: {ā€˜message_id’: 33288, ā€˜message_name’: ā€˜Low Pressure’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33290: {ā€˜message_id’: 33290, ā€˜message_name’: ā€˜Condenser In Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 40.800000000000004, ā€˜is_fsv_message’: False}
33303: {ā€˜message_id’: 33303, ā€˜message_name’: ā€˜Outdoor Current’, ā€˜unit_of_measurement’: ā€˜A’, ā€˜value’: 2.1, ā€˜is_fsv_message’: False}
33304: {ā€˜message_id’: 33304, ā€˜message_name’: ā€˜Evaporator In Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 8.200000000000001, ā€˜is_fsv_message’: False}
33306: {ā€˜message_id’: 33306, ā€˜message_name’: ā€˜Outdoor Suction Sensor Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 8.8, ā€˜is_fsv_message’: False}
33310: {ā€˜message_id’: 33310, ā€˜message_name’: ā€˜EVI IN’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: -50.0, ā€˜is_fsv_message’: False}
33312: {ā€˜message_id’: 33312, ā€˜message_name’: ā€˜EVI OUT’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: -50.0, ā€˜is_fsv_message’: False}
33316: {ā€˜message_id’: 33316, ā€˜message_name’: ā€˜Message 8224’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 9.700000000000001, ā€˜is_fsv_message’: False}
33318: {ā€˜message_id’: 33318, ā€˜message_name’: ā€˜Fan speed step setting’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33321: {ā€˜message_id’: 33321, ā€˜message_name’: ā€˜EEV1 Position’, ā€˜unit_of_measurement’: None, ā€˜value’: 205, ā€˜is_fsv_message’: False}
33326: {ā€˜message_id’: 33326, ā€˜message_name’: ā€˜EVI EEV’, ā€˜unit_of_measurement’: None, ā€˜value’: 0, ā€˜is_fsv_message’: False}
33329: {ā€˜message_id’: 33329, ā€˜message_name’: ā€˜Compressor running?’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33332: {ā€˜message_id’: 33332, ā€˜message_name’: ā€˜Message 8234’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33334: {ā€˜message_id’: 33334, ā€˜message_name’: ā€˜Outdoor Compressor Order Frequency’, ā€˜unit_of_measurement’: ā€˜Hz’, ā€˜value’: 21, ā€˜is_fsv_message’: False}
33335: {ā€˜message_id’: 33335, ā€˜message_name’: ā€˜Outdoor Compressor Target Frequency’, ā€˜unit_of_measurement’: ā€˜Hz’, ā€˜value’: 21, ā€˜is_fsv_message’: False}
33336: {ā€˜message_id’: 33336, ā€˜message_name’: ā€˜Outdoor Compressor Run Frequency’, ā€˜unit_of_measurement’: ā€˜Hz’, ā€˜value’: 21, ā€˜is_fsv_message’: False}
33337: {ā€˜message_id’: 33337, ā€˜message_name’: ā€˜Message 8239’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33341: {ā€˜message_id’: 33341, ā€˜message_name’: ā€˜Outdoor Fan RPM 1’, ā€˜unit_of_measurement’: ā€˜RPM’, ā€˜value’: 290, ā€˜is_fsv_message’: False}
33364: {ā€˜message_id’: 33364, ā€˜message_name’: ā€˜Outdoor IPM Temp 1’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 30.0, ā€˜is_fsv_message’: False}
33400: {ā€˜message_id’: 33400, ā€˜message_name’: ā€˜OCT1’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33402: {ā€˜message_id’: 33402, ā€˜message_name’: ā€˜Desuperheater temp’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33408: {ā€˜message_id’: 33408, ā€˜message_name’: ā€˜Outdoor Top Sensor Temp 1’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 44.400000000000006, ā€˜is_fsv_message’: False}
33439: {ā€˜message_id’: 33439, ā€˜message_name’: ā€˜Saturated T_Pd’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33440: {ā€˜message_id’: 33440, ā€˜message_name’: ā€˜Outdoor Sensor Low Press Temp’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 6.9, ā€˜is_fsv_message’: False}
33458: {ā€˜message_id’: 33458, ā€˜message_name’: ā€˜Message 82B2’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33461: {ā€˜message_id’: 33461, ā€˜message_name’: ā€˜Message 82B5’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33502: {ā€˜message_id’: 33502, ā€˜message_name’: ā€˜Condenser Out Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 33.2, ā€˜is_fsv_message’: False}
33503: {ā€˜message_id’: 33503, ā€˜message_name’: ā€˜Outdoor TW1 Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 31.0, ā€˜is_fsv_message’: False}
33504: {ā€˜message_id’: 33504, ā€˜message_name’: ā€˜Outdoor TW2 Temperature’, ā€˜unit_of_measurement’: ā€˜C’, ā€˜value’: 35.2, ā€˜is_fsv_message’: False}
33507: {ā€˜message_id’: 33507, ā€˜message_name’: ā€˜Outdoor Product Capacity’, ā€˜unit_of_measurement’: ā€˜kW’, ā€˜value’: 16.0, ā€˜is_fsv_message’: False}
33517: {ā€˜message_id’: 33517, ā€˜message_name’: ā€˜Message 82ED’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33526: {ā€˜message_id’: 33526, ā€˜message_name’: ā€˜Message 82F6’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33532: {ā€˜message_id’: 33532, ā€˜message_name’: ā€˜EVI SOL EEV’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33534: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00e2’, ā€˜is_fsv_message’: False}
33800: {ā€˜message_id’: 33800, ā€˜message_name’: ā€˜Message 8408’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00000430’, ā€˜is_fsv_message’: False}
33818: {ā€˜message_id’: 33818, ā€˜message_name’: ā€˜Message 841A’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00010000’, ā€˜is_fsv_message’: False}
519: {ā€˜message_id’: 519, ā€˜message_name’: ā€˜Linked Indoor Units’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
8951: {ā€˜message_id’: 8951, ā€˜message_name’: ā€˜Variable NM 1’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0010’, ā€˜is_fsv_message’: False}
8953: {ā€˜message_id’: 8953, ā€˜message_name’: ā€˜Variable NM 2’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0000’, ā€˜is_fsv_message’: False}
8954: {ā€˜message_id’: 8954, ā€˜message_name’: ā€˜Variable NM 3’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0000’, ā€˜is_fsv_message’: False}
8955: {ā€˜message_id’: 8955, ā€˜message_name’: ā€˜Variable NM 4’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜002e’, ā€˜is_fsv_message’: False}
8956: {ā€˜message_id’: 8956, ā€˜message_name’: ā€˜Variable NM 5’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ffff’, ā€˜is_fsv_message’: False}
8957: {ā€˜message_id’: 8957, ā€˜message_name’: ā€˜Variable NM 6’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0000’, ā€˜is_fsv_message’: False}
8958: {ā€˜message_id’: 8958, ā€˜message_name’: ā€˜Variable NM 7’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜000a’, ā€˜is_fsv_message’: False}
1573: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜020ffffd03fff8ffffffffffffffffff’, ā€˜is_fsv_message’: False}
8959: {ā€˜message_id’: 8959, ā€˜message_name’: ā€˜Variable NM 8’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜000d’, ā€˜is_fsv_message’: False}
9216: {ā€˜message_id’: 9216, ā€˜message_name’: ā€˜All Layer Device Count’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ff02ffff’, ā€˜is_fsv_message’: False}
9217: {ā€˜message_id’: 9217, ā€˜message_name’: ā€˜Layer Variable NM 1’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00010000’, ā€˜is_fsv_message’: False}
9467: {ā€˜message_id’: 9467, ā€˜message_name’: ā€˜Layer Variable NM 2’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00000000’, ā€˜is_fsv_message’: False}
9468: {ā€˜message_id’: 9468, ā€˜message_name’: ā€˜Heat Pump Voltage’, ā€˜unit_of_measurement’: ā€˜V’, ā€˜value’: 426.0, ā€˜is_fsv_message’: False}
16611: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ff’, ā€˜is_fsv_message’: False}
32773: {ā€˜message_id’: 32773, ā€˜message_name’: ā€˜Message 8005’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ff’, ā€˜is_fsv_message’: False}
32867: {ā€˜message_id’: 32867, ā€˜message_name’: ā€˜Message 8063’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜01’, ā€˜is_fsv_message’: False}
32897: {ā€˜message_id’: 32897, ā€˜message_name’: ā€˜Message 8081’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32925: {ā€˜message_id’: 32925, ā€˜message_name’: ā€˜Outdoor Cool Only Model’, ā€˜unit_of_measurement’: None, ā€˜value’: <OutOutdoorCoolonlyModel.NO_HEAT_PUMP: 0>, ā€˜is_fsv_message’: False}
32935: {ā€˜message_id’: 32935, ā€˜message_name’: ā€˜Message 80A7’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32938: {ā€˜message_id’: 32938, ā€˜message_name’: ā€˜Message 80AA’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜01’, ā€˜is_fsv_message’: False}
32950: {ā€˜message_id’: 32950, ā€˜message_name’: ā€˜Message 80B6’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜01’, ā€˜is_fsv_message’: False}
32974: {ā€˜message_id’: 32974, ā€˜message_name’: ā€˜Message 80CE’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00’, ā€˜is_fsv_message’: False}
32984: {ā€˜message_id’: 32984, ā€˜message_name’: ā€˜Waterout Type’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜02’, ā€˜is_fsv_message’: False}
33280: {ā€˜message_id’: 33280, ā€˜message_name’: ā€˜Message 8200’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33371: {ā€˜message_id’: 33371, ā€˜message_name’: ā€˜Message 825B’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33372: {ā€˜message_id’: 33372, ā€˜message_name’: ā€˜Message 825C’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33373: {ā€˜message_id’: 33373, ā€˜message_name’: ā€˜Message 825D’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33468: {ā€˜message_id’: 33468, ā€˜message_name’: ā€˜Outdoor Project Code’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0000’, ā€˜is_fsv_message’: False}
33489: {ā€˜message_id’: 33489, ā€˜message_name’: ā€˜Message 82D1’, ā€˜unit_of_measurement’: None, ā€˜value’: -0.0, ā€˜is_fsv_message’: False}
33493: {ā€˜message_id’: 33493, ā€˜message_name’: ā€˜Message 82D5’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33494: {ā€˜message_id’: 33494, ā€˜message_name’: ā€˜Message 82D6’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33495: {ā€˜message_id’: 33495, ā€˜message_name’: ā€˜Message 82D7’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33496: {ā€˜message_id’: 33496, ā€˜message_name’: ā€˜Message 82D8’, ā€˜unit_of_measurement’: None, ā€˜value’: 0.0, ā€˜is_fsv_message’: False}
33793: {ā€˜message_id’: 33793, ā€˜message_name’: ā€˜Message 8401’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00000000’, ā€˜is_fsv_message’: False}
33801: {ā€˜message_id’: 33801, ā€˜message_name’: ā€˜Message 8409’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00000000’, ā€˜is_fsv_message’: False}
33815: {ā€˜message_id’: 33815, ā€˜message_name’: ā€˜Message 8417’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜00000003’, ā€˜is_fsv_message’: False}
33823: {ā€˜message_id’: 33823, ā€˜message_name’: ā€˜Message 841F’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜ffffffff’, ā€˜is_fsv_message’: False}
34305: {ā€˜message_id’: 34305, ā€˜message_name’: ā€˜Inverter1 Micom’, ā€˜unit_of_measurement’: None, ā€˜value’: {ā€˜_submessages’: {596: <pysamsungnasa.protocol.factory.types.RawMessage object at 0x788319850a10>}, ā€˜_joined’: ā€˜9a0000000010000800000000000000000000000000000000000000000000000000000000000000’}, ā€˜is_fsv_message’: False}
34317: {ā€˜message_id’: 34317, ā€˜message_name’: ā€˜Installed Outdoor Unit model info’, ā€˜unit_of_measurement’: None, ā€˜value’: {ā€˜header_hex’: ā€˜04080017’, ā€˜header_value’: 67633175, ā€˜data_hex’: ā€˜fe’, ā€˜data_length’: 1, ā€˜total_length’: 5, ā€˜raw_hex’: ā€˜04080017fe’, ā€˜note’: ā€˜Structure definition not yet available in NASA.ptc - fields represent outdoor unit model information’}, ā€˜is_fsv_message’: False}
34329: {ā€˜message_id’: None, ā€˜message_name’: ā€˜UNKNOWN’, ā€˜unit_of_measurement’: None, ā€˜value’: ā€˜0000ffff0000000000000000000000000000’, ā€˜is_fsv_message’: False}
33811: {ā€˜message_id’: 33811, ā€˜message_name’: ā€˜Outdoor Instantaneous Power’, ā€˜unit_of_measurement’: ā€˜kW’, ā€˜value’: 0.8210000000000001, ā€˜is_fsv_message’: False}
33812: {ā€˜message_id’: 33812, ā€˜message_name’: ā€˜Outdoor Cumulative Energy’, ā€˜unit_of_measurement’: ā€˜kWh’, ā€˜value’: 665.442, ā€˜is_fsv_message’: False}

Good progress, @antonical.
I’m not sure how you are intercepting the NASA packets, but they are obviously coming through loud and clear :slightly_smiling_face:.
Just be aware that some do not contain any ā€œusefulā€ messages, or are split into two or more parts which need to be re-joined by hand, or may have a random character appended (so you can’t necessarily rely on the 0x34 as the last character). This may just be my particular VCOM misbehaving, but even my Python serial data sniffer does the same so probably it’s just a problem in the MIM software…

Got the basics working.
In terms of software, this is a test python program program running on my laptop (Ubuntu) we don’t use windows for anything.

Tried pasting it in here bu tthe formatting went all over. Couldn’t find any code blocks.

So no SNET (tried running it via Wine) but I am intrigued and might just fire up a windows VM on the ESXi Server just to run SNET/SNET Pro and see what that is all about. Assuming it can connect to a TCP connection.

Onwards…

When posting code or output, please put 3 ā€˜backticks’ (normally found at the top left of the keyboard) on a line of their own before the code, and 3 more backticks also on a line of their own after the code:

```
code
```

If it is something like php you can add a language identifier after the first 3 backticks: ```php or even ```text if you don’t want any language markup applied.

In case it helps others. I setup a new venv for the version of python this code required to ensure ti did not break my existing python setup.

Runs fine.

Cheers

import asyncio
from pysamsungnasa import SamsungNasa

# Mapping discovered from your CLI 'device dump'
# Key: (Decimal_ID, Label, Unit)
INDOOR_MAP = {
    17023: ("Water Law Target", "°C"),
    16952: ("Leaving Water (LWT)", "°C"),
    16950: ("Return Water (RWT)", "°C"),
    17129: ("Flow Rate", "L/min"),
    16951: ("DHW Tank Temp", "°C"),
    17446: ("Heat Output (Last Min)", "kW"),
}

OUTDOOR_MAP = {
    33284: ("Outdoor Ambient (OAT)", "°C"),
    33811: ("Power Consumption", "kW"),
    33336: ("Compressor Frequency", "Hz"),
}

async def main():
    # Initialize connection to your Waveshare
    nasa = SamsungNasa("192.168.0.136", 8000, {"device_addresses": ["100100", "200100"]})
    await nasa.start()

    try:
        print("--- Samsung ASHP Live Monitor (3.6 Setup) ---")
        print("Waiting for data broadcast...")
        
        while True:
            await asyncio.sleep(10) # Update every 10 seconds
            
            output = []
            thermal_power = 0.0
            electric_power = 0.0

            # Process Outdoor Unit (100100)
            if "100100" in nasa.devices:
                out_dev = nasa.devices["100100"]
                output.append("\n[Outdoor Unit - 100100]")
                for mid, (label, unit) in OUTDOOR_MAP.items():
                    val = out_dev.attributes.get(mid)
                    val_text = f"{val.VALUE} {unit}" if val else "Waiting..."
                    output.append(f"  {label:<25}: {val_text}")
                    if mid == 33811 and val: electric_power = val.VALUE

            # Process Indoor Unit (200100)
            if "200100" in nasa.devices:
                in_dev = nasa.devices["200100"]
                output.append("\n[Indoor Unit - 200100]")
                for mid, (label, unit) in INDOOR_MAP.items():
                    val = in_dev.attributes.get(mid)
                    val_text = f"{val.VALUE} {unit}" if val else "Waiting..."
                    output.append(f"  {label:<25}: {val_text}")
                    if mid == 17446 and val: thermal_power = val.VALUE

            # Calculate Live COP
            if thermal_power > 0 and electric_power > 0:
                cop = thermal_power / electric_power
                output.append(f"\n>> Calculated Live COP: {cop:.2f}")
            
            # Clear screen (optional) and print
            print("\033c", end="") # Clears terminal for a clean dashboard look
            print("\n".join(output))
            print("\n(Press Ctrl+C to stop)")

    except KeyboardInterrupt:
        print("\nStopping monitor...")
    finally:
        await nasa.stop()

if __name__ == "__main__":
    asyncio.run(main())

@pantherale0 @SarahH Now I have a NASA connection I am struggling to find the correct registers for the WL parameters in FSV 2011 2012 2031 2032 In the documents the registers listed are not correct for a Gen 7 unit.

The objective is to manage the water law parameters depending on TOD and OAT, ensure the property is cooler during the night and has the right WL for the coming conditions or even during the day if weather shifts are happening.

One I have the key registers I can start the HA integration and automation.

Any help or advice appreciated.

Cheers

Hi @antonical.
It sounds from the foregoing posts that in the Gen 7, Samsung have in their wisdom changed the NASA registers for some FSVs, and 2011/2 and 2031/2 are no longer 0x4254/5 and 0x4258/9.
Do you use a VCOM or have some NASA sniffer code available? What I would do in your position would be to get my VCOM monitor going, change (say) #2011 up and then down by 1degC using SNET-Pro2 and look at the resulting monitor output. I would expect to see two similar packets - the outgoing one from SNET and the MIM’s response - and these will include the register numbers for #2011. Then repeat the process for the other unknown FSVs.

Hi Sarah,

No we don;t use windows software. Talking to it directly via python. Yeah we tried doing a bi of that. Manually changing the WL FSV’s in the controller and trying to find matching registers. Appears not so simple. Like looking for a needle in a haystack. I am just wondering if they are there at all and some kind of calculated ref registers are used to dynamically alter the target WL the outdoor unit is attempting to hit. And the values are in the Controller head. Maybe totally wrong. But can’t seem to find them. I can see the raw hex but there are hundreds of messages broadcast.

Cheers

I just ran a little test on my HTQ series.

My setup is F1/F2 → RS485-to-Ethernet adapter → router → laptop via wi-fi → VCOM → Python proxy → SNET-Pro2. The proxy detects incoming (MIM-to-SNET) and outgoing (SNET-to-MIM) NASA packets and assigns a timestamp.

When I reset #2011 from -2 to -1degC from SNET just now I saw this:

[2026-03-27 11:56:41.811] [OUTGOING] (120 bytes): (100 x 0x55) 32 00 12 80 FF 00 20 00 00 C0 12 3B 01 42 54 FF F6 7F 90 34
[2026-03-27 11:56:42.011] [INCOMING] (25 bytes): FD FD FD FD FD 32 00 12 20 00 00 80 FF 00 C0 15 3B 01 42 54 FF F6 F7 4F 34

(In pre-Gen 7 units, 0x4254 is FSV#2011, and the payload FF F6 is -10 in 2’s complement which translates to -1degC per the NASA.ptc divisor rules. The two packets are the SNET write and the MIM response respectively.)

However, when I repeated the same #2011 reset on the WRC (connected to F3/F4 of course), the proxy did not see any reads or writes to 0x4254.

I’m no comms expert, but I suspect that this is why you aren’t detecting such traffic - you are writing to the controller via F3/F4, but looking for the command/response on F1/F2, when it isn’t there to be found. Possible?

Not sure. As we only have a connection to the F1 F2 terminals and not the F3 F4 terminals. The unit is an Integrated Unit with Indoor and outdoor units in the same box.

Cheers

Yes, I haven’t been able to get hold of the Gen7 manual, but was aware that the MIM controller is integral with the outdoor unit. So there’s no need for F3/F4 - the Micom is wired directly.
But I think my later comment may still apply. As ā€œF3/F4ā€ traffic is effectively internal, you won’t necessarily see this on F1/F2. You may have no option but to resort to SNET, even if it does mean installing a VM to run it :face_with_diagonal_mouth:

Afterthought @antonical.
@pantherale0’s HA integration specifically provides (at my request) the capability to change FSV#2021/2 (just so I can run different WL settings at night, just like you are trying to do):


Have you actually tried them yet? They work fine on my HTQ :slightly_smiling_face:.
[Edit: Interestingly, changing FSV#2021 from 52degC to 50degC using the HA Integration shows up on my proxy as an Incoming packet (see above) but with no associated Outgoing packet:
[2026-03-27 14:12:03.520] [INCOMING] (25 bytes): FD FD FD FD FD 32 00 12 20 00 00 80 FF 01 C0 15 E0 01 42 56 01 F4 05 96 34]

I wonder if these integrated units are ā€œnot as exposedā€ as others. Could also be some variation of the NASA protocol if it’s an ā€œall in oneā€.

What’s the model number?

AE160CXYBEK

Cheers

That’s interesting. The Installation Manual https://midsummerwholesale.co.uk/pdfs/ehs-r290-mono-with-pump-installation-guide.pdf p21 shows F1/F2 as ā€œNot usedā€, yet you are seeing serial data at them. It also shows F3/F4 connected to the WRC (per previous model ranges). I presume there’s a more detailed manual, because that one hardly mentions FSVs or how to set them…

I found this (too big to upload) ……..

The wiring diagram on Page 20 shows the Control Kit (a MIM-03-alike in Gen6 speak) wired via F1/F2 to the Main Out PCB. So there is nothing new in the Gen7 control architecture, it just has everything bunged together in one box.

From past investigation we can be reasonably certain that the FSVs are stored in the MIM-03-alike, and that a temperature will use the standard Samsung resolution of 1/10 degC and is stored in a ā€œVariableā€ sized value, so the FSV is going to be available on NASA in a 0x42xx register, so only 512 possibilities. Since the Water Law FSVs have fixed values it should be fairly straightforward to knock up a test program to issue NASA Reads for all possible candidate registers and look for the known fixed values.

On the other hand, since the end game is to use HA, the problem could be avoided by turning off WL in the Gen7, implementing same (or something better) in HA, and just send Water Flow set points to the Gen7.

I think ultimately you’re right and a full automation could be written in HA to manage the unit. I am not yet fully understanding the dynamics of its operation. It would be good to be able to write to the WL variables depending on actual conditions. We have access to the basic data OAT etc. But we also have quite sophisticated weather forecast information in and out of HA. The relationship between flow rate OAT and WL is interesting. Also, the annoying startup behaviour (Confirmed by Samsung) of running the pump flat out following a cycle creates a destabilised system in my installation. I have an automation in HA that sets the pum pto 40% following a Standby, safety, Normal sequence, stabilises the system to a DT avg of ~5 over a 5 minute period then hands pump control back to Samsung.

That seems to be helping. I have another Automation that ensures Samsung has pump control during a DHW cycle. Then following a switch back to auto heat it stabilises the system again before giving pump control back to Samsung.

Cheers

I also think it is useful to leave the White controller on the wall. It’s already wired in and serves as a useful panel should we need to change anything material. Manipulating the WL variables also preserves the internal Samsung logic (let’s it do it’s thing) unless we want to intervene by manipulating the Pump etc.

The issue for my installation and system dynamics it seems is that the Samsung logic creates a situation it can’t recover from. It essentially collapses the DT we have paid to create from underneath by bringing the RWT upto the LWT. The LWT seems to be controlled only by the WL not sure how it treats the Target DT which is also set via another FSV.

In essence you would expect it to do something like this: Everything from here supposes a properly installed and balanced system with a ā€˜system’ DT.

Look at WL and determine target LWT, look at current working DT (Averaged over a period or PIT not sure) work out how hard to push the comp to raise the LWT to target. Continually monitor the RWT and LWT and moderate the pump to stabilse the system.

What really happens in my system.

Target LWT is established comp kicks in pump runs at Max or close to max for too long. Heat is stripped from the system, RWT climbs towards LWT DT collapses Comp kicks in further but now at or above target pump continues to run at max DT then collapses totally and RWT is now > LWT system cycles off Pump continues to run.

System comes back up pump running at max, comp now needs to generate a lot of heat to re-establish target LWT and negate heat loss from property create a good working DT, BUT RWT is already too high so short cycling ensues and round we go…

Mitigation.

Following the first cycle off the automation caps the pump at 40% system balance is restored quickly <5 mins, then runs extremely well close to perfect DT after an hour, property is lovely temp is even around the property exactly as it should be, pump control is given back to Samsung.

Hi @antonical.

I find your description of what is happening in your setup a bit ambiguous, so please bear with me with my understanding of the controller action.

  1. Once the compressor starts, the controller runs the circulating pump at 100% speed for 20-30 minutes, irrespective of any PWM configuration set with FSV#405*.
  2. The compressor starts per the Safety Start controller algorithm (usually 50Hz inverter frequency) for about 5 minutes before the Normal Operation algorithm kicks in. The latter tries to control LWT approach to WL target (already calculated from FSV#2011/2 and #2021/2) through 2- or 3-term control of compressor inverter frequency (i.e. compressor speed) to maximise approach rate but minimise overshoot. AFAIK there’s nothing you can do about this.
  3. Compressor discharge pressure is set based on RWT. The controller has been pre-programmed with refrigerant saturation pressures/temperatures and acts (using EEV position and compressor speed) so as to minimise discharge pressure consistent with complete refrigerant condensation (but with minimum subcool) against RWT. This strategy minimises evaporator size (thus cost).
  4. RWT depends in turn on LWT and the heat your emitters remove (Q) from the circulating fluid and the latter’s flow rate according to the equation RWT = LWT – Q / (m.Cp) (where m is mass flow rate and Q is emitter heat duty). If you have PWM enabled on your circulating pump, it will change m to try to achieve your (LWT – RWT) setting (#4052), but (IMHO and within limits) this is largely arbitrary; indeed there is a powerful thermodynamic argument that circulating flow should be maximised (and LWT – RWT minimised) so as to maximise emitter temperature thus duty for any given room temperature. So when you say ā€œDT collapsesā€ this may actually be beneficial.
  5. The only way RWT can exceed LWT is if you have another source of heat to the circulating fluid (such as a back-up heater) or momentarily following compressor stoppage, if the circulating pump also stops. (For a few seconds, and with zero flow, your LWT sensor may cool faster than your RWT sensor, so this temperature reversal is not ā€œrealā€.)
  6. Compressor cycling occurs when either the minimum heat input from the heat pump exceeds that required to achieve the target LWT (the emitters are too small to remove the generated heat so LWT exceeds target) or it exceeds room heat loss (so the roomstat takes control).
  7. There are several ways to prevent or reduce compressor cycling – these have been widely described above and elsewhere, but in the short term I wouldn’t obsess about your (LWT - RWT) figure - I think that this may be a bit of a ā€œred herringā€ in your thinking…

@SarahH That’s a helpful summary. It is interesting that a high circulating pump flow rate can cause cycling during the start up phase even when LWT is sufficiently high for the emitters to be able to emit more than the minimum heat output. Setting 2093 = 1 (thermostat only) would prevent the cycling as you intimate, so automation may be a bit of an overkill, but perhaps more fun.