diff --git a/tests/v1/__snapshots__/test_v1_combined_models.ambr b/tests/v1/__snapshots__/test_v1_combined_models.ambr new file mode 100644 index 00000000..e388c6e9 --- /dev/null +++ b/tests/v1/__snapshots__/test_v1_combined_models.ambr @@ -0,0 +1,28 @@ +# serializer version: 1 +# name: test_combined_model[HWE-KWH1] + CombinedModels(device=Device(model_name='Wi-Fi kWh Meter 1-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter', product_type='HWE-KWH1', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='My Wi-Fi', wifi_strength=74, energy_import_kwh=122.376, energy_import_t1_kwh=122.376, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=579.813, energy_export_t1_kwh=579.813, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-45.252, power_l1_w=-45.252, power_l2_w=None, power_l3_w=None, voltage_v=228.472, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=0.273, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=74.052, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=-58.612, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=0.611, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=50.0, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=74, wifi_ssid='My Wi-Fi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_model[HWE-KWH3] + CombinedModels(device=Device(model_name='Wi-Fi kWh Meter 3-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter 3-phase', product_type='HWE-KWH3', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='HW WiFi', wifi_strength=84, energy_import_kwh=2940.101, energy_import_t1_kwh=2940.101, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=0.0, energy_export_t1_kwh=0.0, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=7100.278, power_l1_w=0.0, power_l2_w=3547.015, power_l3_w=3553.263, voltage_v=None, voltage_l1_v=230.751, voltage_l2_v=228.391, voltage_l3_v=229.612, current_a=30.999, current_l1_a=0.0, current_l2_a=15.521, current_l3_a=15.477, apparent_power_va=7112.293, apparent_power_l1_va=0.0, apparent_power_l2_va=3548.879, apparent_power_l3_va=3563.414, reactive_power_var=-429.025, reactive_power_l1_var=0.0, reactive_power_l2_var=-166.675, reactive_power_l3_var=-262.35, power_factor=None, power_factor_l1=1.0, power_factor_l2=0.999, power_factor_l3=0.997, frequency_hz=49.926, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=84, wifi_ssid='HW WiFi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_model[HWE-P1] + CombinedModels(device=Device(model_name='Wi-Fi P1 Meter', id='appliance/p1dongle/3c39e7aabbcc', product_name='P1 Meter', product_type='HWE-P1', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='My Wi-Fi', wifi_strength=100, energy_import_kwh=13779.338, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=2948.827, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=0.0, energy_export_t1_kwh=0.0, energy_export_t2_kwh=0.0, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-543.0, power_l1_w=-676.0, power_l2_w=133.0, power_l3_w=0.0, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=-4.0, current_l2_a=2.0, current_l3_a=0.0, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=50.0, timestamp=None, protocol_version=50, meter_model='ISKRA 2M550T-101', unique_id='NGGYU', tariff=2, voltage_sag_l1_count=1, voltage_sag_l2_count=1, voltage_sag_l3_count=0, voltage_swell_l1_count=0, voltage_swell_l2_count=0, voltage_swell_l3_count=0, any_power_fail_count=4, long_power_fail_count=5, average_power_15m_w=123.0, monthly_power_peak_w=1111.0, monthly_power_peak_timestamp=datetime.datetime(2023, 1, 1, 8, 0, 10), external_devices={'gas_meter_NGLYD': ExternalDevice(unique_id='NGLYD', type=, value=111.111, unit='m3', timestamp=datetime.datetime(2021, 6, 6, 14, 0, 10)), 'heat_meter_NGRAADY': ExternalDevice(unique_id='NGRAADY', type=, value=222.222, unit='m3', timestamp=datetime.datetime(2021, 6, 6, 14, 0, 10)), 'warm_water_meter_NGMYC': ExternalDevice(unique_id='NGMYC', type=, value=333.333, unit='m3', timestamp=datetime.datetime(2021, 6, 6, 14, 0, 10)), 'water_meter_NGSG': ExternalDevice(unique_id='NGSG', type=, value=444.444, unit='m3', timestamp=datetime.datetime(2021, 6, 6, 14, 0, 10)), 'inlet_heat_meter_NGTALAHY': ExternalDevice(unique_id='NGTALAHY', type=, value=555.555, unit='m3', timestamp=datetime.datetime(2021, 6, 6, 14, 0, 10))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=100, wifi_ssid='My Wi-Fi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_model[HWE-SKT] + CombinedModels(device=Device(model_name='Wi-Fi Energy Socket', id='appliance/energysocket/3c39e7aabbcc', product_name='Energy Socket', product_type='HWE-SKT', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='My Wi-Fi', wifi_strength=100, energy_import_kwh=10830.511, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=2948.827, energy_export_t1_kwh=2948.827, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=123.0, power_l1_w=123.0, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=100, wifi_ssid='My Wi-Fi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_model[HWE-WTR] + CombinedModels(device=Device(model_name='Wi-Fi Watermeter', id='appliance/watermeter/3c39e7aabbcc', product_name='Water Meter', product_type='HWE-WTR', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='My Wi-Fi', wifi_strength=100, energy_import_kwh=None, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=None, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=13.12, total_liter_m3=8129.123, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=100, wifi_ssid='My Wi-Fi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_model[SDM230-wifi] + CombinedModels(device=Device(model_name='Wi-Fi kWh Meter 1-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter', product_type='SDM230-wifi', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='My Wi-Fi', wifi_strength=74, energy_import_kwh=122.376, energy_import_t1_kwh=122.376, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=579.813, energy_export_t1_kwh=579.813, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-45.252, power_l1_w=-45.252, power_l2_w=None, power_l3_w=None, voltage_v=228.472, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=0.273, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=74.052, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=-58.612, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=0.611, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=50.0, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=74, wifi_ssid='My Wi-Fi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_model[SDM630-wifi] + CombinedModels(device=Device(model_name='Wi-Fi kWh Meter 3-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter 3-phase', product_type='SDM630-wifi', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='HW WiFi', wifi_strength=84, energy_import_kwh=2940.101, energy_import_t1_kwh=2940.101, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=0.0, energy_export_t1_kwh=0.0, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=7100.278, power_l1_w=0.0, power_l2_w=3547.015, power_l3_w=3553.263, voltage_v=None, voltage_l1_v=230.751, voltage_l2_v=228.391, voltage_l3_v=229.612, current_a=30.999, current_l1_a=0.0, current_l2_a=15.521, current_l3_a=15.477, apparent_power_va=7112.293, apparent_power_l1_va=0.0, apparent_power_l2_va=3548.879, apparent_power_l3_va=3563.414, reactive_power_var=-429.025, reactive_power_l1_var=0.0, reactive_power_l2_var=-166.675, reactive_power_l3_var=-262.35, power_factor=None, power_factor_l1=1.0, power_factor_l2=0.999, power_factor_l3=0.997, frequency_hz=49.926, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=84, wifi_ssid='HW WiFi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_remaps_legacy_brightness_to_system + CombinedModels(device=Device(model_name='Wi-Fi Energy Socket', id='appliance/energysocket/3c39e7aabbcc', product_name='Energy Socket', product_type='HWE-SKT', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=None, state=State(power_on=False, switch_lock=False, brightness=255), system=System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=100.0, api_v1_enabled=None), batteries=None) +# --- +# name: test_combined_remaps_legacy_wifi_ssid_to_system + CombinedModels(device=Device(model_name='Wi-Fi Energy Socket', id='appliance/energysocket/3c39e7aabbcc', product_name='Energy Socket', product_type='HWE-SKT', serial='3c39e7aabbcc', api_version=, firmware_version='2.11'), measurement=Measurement(wifi_ssid='My Wi-Fi', wifi_strength=100, energy_import_kwh=10830.511, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=2948.827, energy_export_t1_kwh=2948.827, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=123.0, power_l1_w=123.0, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None), state=None, system=System(wifi_strength_pct=100, wifi_ssid='My Wi-Fi', wifi_rssi_db=None, cloud_enabled=None, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None), batteries=None) +# --- diff --git a/tests/v1/__snapshots__/test_v1_device.ambr b/tests/v1/__snapshots__/test_v1_device.ambr new file mode 100644 index 00000000..bbb5d556 --- /dev/null +++ b/tests/v1/__snapshots__/test_v1_device.ambr @@ -0,0 +1,22 @@ +# serializer version: 1 +# name: test_device[HWE-KWH1-fixtures3] + Device(model_name='Wi-Fi kWh Meter 1-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter', product_type='HWE-KWH1', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- +# name: test_device[HWE-KWH3-fixtures4] + Device(model_name='Wi-Fi kWh Meter 3-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter 3-phase', product_type='HWE-KWH3', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- +# name: test_device[HWE-P1-fixtures0] + Device(model_name='Wi-Fi P1 Meter', id='appliance/p1dongle/3c39e7aabbcc', product_name='P1 Meter', product_type='HWE-P1', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- +# name: test_device[HWE-SKT-fixtures1] + Device(model_name='Wi-Fi Energy Socket', id='appliance/energysocket/3c39e7aabbcc', product_name='Energy Socket', product_type='HWE-SKT', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- +# name: test_device[HWE-WTR-fixtures2] + Device(model_name='Wi-Fi Watermeter', id='appliance/watermeter/3c39e7aabbcc', product_name='Water Meter', product_type='HWE-WTR', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- +# name: test_device[SDM230-wifi-fixtures5] + Device(model_name='Wi-Fi kWh Meter 1-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter', product_type='SDM230-wifi', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- +# name: test_device[SDM630-wifi-fixtures6] + Device(model_name='Wi-Fi kWh Meter 3-phase', id='appliance/energymeter/3c39e7aabbcc', product_name='kWh Meter 3-phase', product_type='SDM630-wifi', serial='3c39e7aabbcc', api_version=, firmware_version='2.11') +# --- diff --git a/tests/v1/__snapshots__/test_v1_measurement.ambr b/tests/v1/__snapshots__/test_v1_measurement.ambr new file mode 100644 index 00000000..f6455543 --- /dev/null +++ b/tests/v1/__snapshots__/test_v1_measurement.ambr @@ -0,0 +1,19 @@ +# serializer version: 1 +# name: test_measurement[HWE-KWH1-fixtures1] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=123.456, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=78.91, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=123.0, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=230.0, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=1.5, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=345.0, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=67.0, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=0.95, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=50.0, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-KWH3-fixtures2] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=123.456, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=78.91, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=123.0, power_l1_w=50.0, power_l2_w=40.0, power_l3_w=-30.0, voltage_v=None, voltage_l1_v=230.0, voltage_l2_v=230.0, voltage_l3_v=230.0, current_a=1.5, current_l1_a=-0.5, current_l2_a=0.8, current_l3_a=1.2, apparent_power_va=345.0, apparent_power_l1_va=115.0, apparent_power_l2_va=120.0, apparent_power_l3_va=110.0, reactive_power_var=67.0, reactive_power_l1_var=-20.0, reactive_power_l2_var=30.0, reactive_power_l3_var=57.0, power_factor=None, power_factor_l1=0.95, power_factor_l2=0.9, power_factor_l3=0.85, frequency_hz=50.0, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=2948.827, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=1285.951, energy_export_t2_kwh=2876.51, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-678.0, power_l1_w=-676.0, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=datetime.datetime(2024, 6, 28, 14, 12, 34), protocol_version=50, meter_model='ISKRA 2M550T-101', unique_id='Never Gonna Give You Up', tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0].1 + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=13779.338, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=2948.827, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=0.0, energy_export_t1_kwh=0.0, energy_export_t2_kwh=0.0, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-543.0, power_l1_w=-676.0, power_l2_w=133.0, power_l3_w=0.0, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=6.0, current_l1_a=-4.0, current_l2_a=2.0, current_l3_a=0.0, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=datetime.datetime(2024, 6, 28, 14, 12, 34), protocol_version=50, meter_model='ISKRA 2M550T-101', unique_id='Never Gonna Let You Down', tariff=2, voltage_sag_l1_count=1, voltage_sag_l2_count=1, voltage_sag_l3_count=0, voltage_swell_l1_count=0, voltage_swell_l2_count=0, voltage_swell_l3_count=0, any_power_fail_count=4, long_power_fail_count=5, average_power_15m_w=123.0, monthly_power_peak_w=1111.0, monthly_power_peak_timestamp=datetime.datetime(2024, 6, 4, 10, 11, 22), external_devices={'gas_meter_Never gonna run around': ExternalDevice(unique_id='Never gonna run around', type=, value=2569.646, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'water_meter_and desert you': ExternalDevice(unique_id='and desert you', type=, value=123.456, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 5))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0].2 + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=None, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices={'gas_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=111.111, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'heat_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=222.222, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'warm_water_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=333.333, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'water_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=444.444, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'inlet_heat_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=555.555, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'None_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=None, value=555.555, unit=',3', timestamp=datetime.datetime(2024, 6, 28, 14, 0))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0].3 + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=None, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices={'None_Never gonna run around': ExternalDevice(unique_id='Never gonna run around', type=None, value=555.555, unit=',3', timestamp=datetime.datetime(2024, 6, 28, 14, 0))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- diff --git a/tests/v1/__snapshots__/test_v1_state.ambr b/tests/v1/__snapshots__/test_v1_state.ambr new file mode 100644 index 00000000..bfaa68d6 --- /dev/null +++ b/tests/v1/__snapshots__/test_v1_state.ambr @@ -0,0 +1,13 @@ +# serializer version: 1 +# name: test_state[HWE-SKT-fixtures0] + State(power_on=False, switch_lock=False, brightness=255) +# --- +# name: test_state[HWE-SKT-fixtures0].1 + State(power_on=False, switch_lock=None, brightness=None) +# --- +# name: test_state[HWE-SKT-fixtures0].2 + State(power_on=None, switch_lock=False, brightness=None) +# --- +# name: test_state[HWE-SKT-fixtures0].3 + State(power_on=None, switch_lock=None, brightness=255) +# --- diff --git a/tests/v1/__snapshots__/test_v1_system.ambr b/tests/v1/__snapshots__/test_v1_system.ambr new file mode 100644 index 00000000..0a57ac59 --- /dev/null +++ b/tests/v1/__snapshots__/test_v1_system.ambr @@ -0,0 +1,62 @@ +# serializer version: 1 +# name: test_system[HWE-KWH1-fixtures3] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system[HWE-KWH3-fixtures4] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system[HWE-P1-fixtures0] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system[HWE-SKT-fixtures1] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system[HWE-WTR-fixtures2] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system[SDM230-wifi-fixtures5] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system[SDM630-wifi-fixtures6] + System(wifi_strength_pct=None, wifi_ssid=None, wifi_rssi_db=None, cloud_enabled=True, uptime_s=None, status_led_brightness_pct=None, api_v1_enabled=None) +# --- +# name: test_system_update[None-100-None] + dict({ + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[None-100-True] + dict({ + 'api_v1_enabled': True, + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[None-None-True] + dict({ + 'api_v1_enabled': True, + }) +# --- +# name: test_system_update[True-100-None] + dict({ + 'cloud_enabled': True, + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[True-100-True] + dict({ + 'api_v1_enabled': True, + 'cloud_enabled': True, + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[True-None-None] + dict({ + 'cloud_enabled': True, + }) +# --- +# name: test_system_update[True-None-True] + dict({ + 'api_v1_enabled': True, + 'cloud_enabled': True, + }) +# --- diff --git a/tests/v1/fixtures/HWE-KWH1/measurement.json b/tests/v1/fixtures/HWE-KWH1/measurement.json new file mode 100644 index 00000000..12a0b749 --- /dev/null +++ b/tests/v1/fixtures/HWE-KWH1/measurement.json @@ -0,0 +1,13 @@ +{ + "energy_import_kwh": 123.456, + "energy_export_kwh": 78.910, + "power_w": 123, + "voltage_v": 230, + "current_a": 1.5, + "apparent_current_a": 1.6, + "reactive_current_a": 0.5, + "apparent_power_va": 345, + "reactive_power_var": 67, + "power_factor": 0.95, + "frequency_hz": 50 +} diff --git a/tests/v1/fixtures/HWE-KWH3/measurement.json b/tests/v1/fixtures/HWE-KWH3/measurement.json new file mode 100644 index 00000000..e5795c19 --- /dev/null +++ b/tests/v1/fixtures/HWE-KWH3/measurement.json @@ -0,0 +1,35 @@ +{ + "energy_import_kwh": 123.456, + "energy_export_kwh": 78.910, + "power_w": 123, + "power_l1_w": 50, + "power_l2_w": 40, + "power_l3_w": -30, + "voltage_l1_v": 230, + "voltage_l2_v": 230, + "voltage_l3_v": 230, + "current_a": 1.5, + "current_l1_a": -0.5, + "current_l2_a": 0.8, + "current_l3_a": 1.2, + "apparent_current_a": 1.6, + "apparent_current_l1_a": 0.6, + "apparent_current_l2_a": 0.9, + "apparent_current_l3_a": 1.3, + "reactive_current_a": 0.5, + "reactive_current_l1_a": -0.2, + "reactive_current_l2_a": 0.3, + "reactive_current_l3_a": 0.4, + "apparent_power_va": 345, + "apparent_power_l1_va": 115, + "apparent_power_l2_va": 120, + "apparent_power_l3_va": 110, + "reactive_power_var": 67, + "reactive_power_l1_var": -20, + "reactive_power_l2_var": 30, + "reactive_power_l3_var": 57, + "power_factor_l1": 0.95, + "power_factor_l2": 0.90, + "power_factor_l3": 0.85, + "frequency_hz": 50 +} diff --git a/tests/v1/fixtures/HWE-P1/measurement_1_phase_no_gas.json b/tests/v1/fixtures/HWE-P1/measurement_1_phase_no_gas.json new file mode 100644 index 00000000..2b285999 --- /dev/null +++ b/tests/v1/fixtures/HWE-P1/measurement_1_phase_no_gas.json @@ -0,0 +1,12 @@ +{ + "protocol_version": 50, + "meter_model": "ISKRA 2M550T-101", + "unique_id": "4E6576657220476F6E6E61204769766520596F75205570", + "timestamp": "2024-06-28T14:12:34", + "energy_import_t1_kwh": 10830.511, + "energy_import_t2_kwh": 2948.827, + "energy_export_t1_kwh": 1285.951, + "energy_export_t2_kwh": 2876.51, + "power_w": -678, + "power_l1_w": -676 + } diff --git a/tests/v1/fixtures/HWE-P1/measurement_3_phase_with_gas_with_watermeter.json b/tests/v1/fixtures/HWE-P1/measurement_3_phase_with_gas_with_watermeter.json new file mode 100644 index 00000000..394a6f85 --- /dev/null +++ b/tests/v1/fixtures/HWE-P1/measurement_3_phase_with_gas_with_watermeter.json @@ -0,0 +1,48 @@ +{ + "protocol_version": 50, + "meter_model": "ISKRA 2M550T-101", + "unique_id": "4E6576657220476F6E6E61204C657420596F7520446F776E", + "timestamp": "2024-06-28T14:12:34", + "tariff": 2, + "energy_import_kwh": 13779.338, + "energy_import_t1_kwh": 10830.511, + "energy_import_t2_kwh": 2948.827, + "energy_export_kwh": 0, + "energy_export_t1_kwh": 0, + "energy_export_t2_kwh": 0, + "power_w": -543, + "power_l1_w": -676, + "power_l2_w": 133, + "power_l3_w": 0, + "current_a": 6, + "current_l1_a": -4, + "current_l2_a": 2, + "current_l3_a": 0, + "voltage_sag_l1_count": 1, + "voltage_sag_l2_count": 1, + "voltage_sag_l3_count": 0, + "voltage_swell_l1_count": 0, + "voltage_swell_l2_count": 0, + "voltage_swell_l3_count": 0, + "any_power_fail_count": 4, + "long_power_fail_count": 5, + "average_power_15m_w": 123.000, + "monthly_power_peak_w": 1111.000, + "monthly_power_peak_timestamp": "2024-06-04T10:11:22", + "external": [ + { + "unique_id": "4E6576657220676F6E6E612072756E2061726F756E64", + "type": "gas_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 2569.646, + "unit": "m3" + }, + { + "unique_id": "616E642064657365727420796F75", + "type": "water_meter", + "timestamp": "2024-06-28T14:05:00", + "value": 123.456, + "unit": "m3" + } + ] + } diff --git a/tests/v1/fixtures/HWE-P1/measurement_invalid_ean.json b/tests/v1/fixtures/HWE-P1/measurement_invalid_ean.json new file mode 100644 index 00000000..3a634a7b --- /dev/null +++ b/tests/v1/fixtures/HWE-P1/measurement_invalid_ean.json @@ -0,0 +1,59 @@ +{ + "unique_id": "00000000000000000000000000000000", + "external": [ + { + "unique_id": "00000000000000000000000000000000", + "type": "gas_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 111.111, + "unit": "m3" + }, + { + "unique_id": "00000000000000000000000000000000", + "type": "heat_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 222.222, + "unit": "m3" + }, + { + "unique_id": "00000000000000000000000000000000", + "type": "warm_water_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 333.333, + "unit": "m3" + }, + { + "unique_id": "00000000000000000000000000000000", + "type": "water_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 444.444, + "unit": "m3" + }, + { + "unique_id": "00000000000000000000000000000000", + "type": "inlet_heat_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": "m3" + }, + { + "type": "00000000000000000000000000000000", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": "should_not_be_included_because_of_missing_id" + }, + { + "unique_id": "00000000000000000000000000000000", + "type": "catfish", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": ",3" + }, + { + "unique_id": "00000000000000000000000000000000", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": ",3" + } + ] +} diff --git a/tests/v1/fixtures/HWE-P1/measurement_invalid_external.json b/tests/v1/fixtures/HWE-P1/measurement_invalid_external.json new file mode 100644 index 00000000..046d5416 --- /dev/null +++ b/tests/v1/fixtures/HWE-P1/measurement_invalid_external.json @@ -0,0 +1,23 @@ +{ + "external": [ + { + "type": "gas_meter", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": "should_not_be_included_because_of_missing_id" + }, + { + "unique_id": "4E6576657220676F6E6E612072756E2061726F756E64", + "type": "catfish", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": ",3" + }, + { + "unique_id": "4E6576657220676F6E6E612072756E2061726F756E64", + "timestamp": "2024-06-28T14:00:00", + "value": 555.555, + "unit": ",3" + } + ] +} diff --git a/tests/v1/test_v1_combined_models.py b/tests/v1/test_v1_combined_models.py new file mode 100644 index 00000000..a24cce58 --- /dev/null +++ b/tests/v1/test_v1_combined_models.py @@ -0,0 +1,54 @@ +"""Test for CombinedModels model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import CombinedModels, Device, Measurement, State + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model"), + [ + "HWE-P1", + "HWE-SKT", + "HWE-WTR", + "HWE-KWH1", + "HWE-KWH3", + "SDM230-wifi", + "SDM630-wifi", + ], +) +async def test_combined_model(model: str, snapshot: SnapshotAssertion): + """Test combined model.""" + device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) + measurement = Measurement.from_dict(json.loads(load_fixtures(f"{model}/data.json"))) + combined = CombinedModels( + device=device, measurement=measurement, state=None, system=None + ) + assert snapshot == combined + + +async def test_combined_remaps_legacy_wifi_ssid_to_system(snapshot: SnapshotAssertion): + """Test CombinedModels model remaps wifi_ssid to system.""" + device = Device.from_dict(json.loads(load_fixtures("HWE-SKT/device.json"))) + measurement = Measurement.from_dict(json.loads(load_fixtures("HWE-SKT/data.json"))) + combined = CombinedModels( + device=device, measurement=measurement, state=None, system=None + ) + assert combined.system.wifi_ssid == measurement.wifi_ssid + assert snapshot == combined + + +async def test_combined_remaps_legacy_brightness_to_system(snapshot: SnapshotAssertion): + """Test CombinedModels model remaps wifi_ssid to system.""" + device = Device.from_dict(json.loads(load_fixtures("HWE-SKT/device.json"))) + state = State.from_dict(json.loads(load_fixtures("HWE-SKT/state_all.json"))) + combined = CombinedModels(device=device, measurement=None, state=state, system=None) + assert combined.system.status_led_brightness_pct == state.brightness / 2.55 + assert snapshot == combined diff --git a/tests/v1/test_v1_device.py b/tests/v1/test_v1_device.py new file mode 100644 index 00000000..c8059a4c --- /dev/null +++ b/tests/v1/test_v1_device.py @@ -0,0 +1,70 @@ +"""Test for Device model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import Device + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ("HWE-P1", ["device"]), + ("HWE-SKT", ["device"]), + ("HWE-WTR", ["device"]), + ("HWE-KWH1", ["device"]), + ("HWE-KWH3", ["device"]), + ("SDM230-wifi", ["device"]), + ("SDM630-wifi", ["device"]), + ], +) +async def test_device(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test Device model.""" + for fixture in fixtures: + data = Device.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) + assert data + assert snapshot == data + + +# pylint: disable=too-many-arguments,too-many-positional-arguments +@pytest.mark.parametrize( + ( + "model", + "supports_state", + "supports_identify", + "supports_cloud_enable", + "supports_reboot", + "supports_telegram", + ), + [ + ("HWE-P1", False, True, True, False, True), + ("HWE-SKT", True, True, True, False, False), + ("HWE-WTR", False, True, True, False, False), + ("HWE-KWH1", False, False, True, False, False), + ("HWE-KWH3", False, False, True, False, False), + ("SDM230-wifi", False, False, True, False, False), + ("SDM630-wifi", False, False, True, False, False), + ], +) +async def test_device_support_functions( + model: str, + supports_state: bool, + supports_identify: bool, + supports_cloud_enable: bool, + supports_reboot: bool, + supports_telegram: bool, +): + """Test Device model support functions.""" + device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) + assert device + assert device.supports_state() == supports_state + assert device.supports_identify() == supports_identify + assert device.supports_cloud_enable() == supports_cloud_enable + assert device.supports_reboot() == supports_reboot + assert device.supports_telegram() == supports_telegram diff --git a/tests/v1/test_v1_measurement.py b/tests/v1/test_v1_measurement.py new file mode 100644 index 00000000..5604b2ec --- /dev/null +++ b/tests/v1/test_v1_measurement.py @@ -0,0 +1,45 @@ +"""Test for Measurement model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import Measurement + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ( + "HWE-P1", + [ + "measurement_1_phase_no_gas", + "measurement_3_phase_with_gas_with_watermeter", + "measurement_invalid_ean", + "measurement_invalid_external", + ], + ), + ("HWE-KWH1", ["measurement"]), + ("HWE-KWH3", ["measurement"]), + ], +) +async def test_measurement(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test Measurement model.""" + for fixture in fixtures: + data = Measurement.from_dict( + json.loads(load_fixtures(f"{model}/{fixture}.json")) + ) + assert data + assert snapshot == data + + +async def test_measurement_ignores_invalid_tariff(): + """Test Measurement model ignores invalid tariff.""" + measurement = Measurement.from_dict({"tariff": 5432}) + assert measurement + assert measurement.tariff is None diff --git a/tests/v1/test_v1_state.py b/tests/v1/test_v1_state.py new file mode 100644 index 00000000..70803218 --- /dev/null +++ b/tests/v1/test_v1_state.py @@ -0,0 +1,29 @@ +"""Test for State model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import State + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ( + "HWE-SKT", + ["state_all", "state_power_on", "state_switch_lock", "state_brightness"], + ), + ], +) +async def test_state(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test State model.""" + for fixture in fixtures: + data = State.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) + assert data + assert snapshot == data diff --git a/tests/v1/test_v1_system.py b/tests/v1/test_v1_system.py new file mode 100644 index 00000000..6d7d33b8 --- /dev/null +++ b/tests/v1/test_v1_system.py @@ -0,0 +1,69 @@ +"""Test for System model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import System, SystemUpdate + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("cloud_enabled", "status_led_brightness_pct", "api_v1_enabled"), + [ + (True, None, None), + (None, 100, None), + (None, None, True), + (True, 100, None), + (True, None, True), + (None, 100, True), + (True, 100, True), + ], +) +async def test_system_update( + cloud_enabled: bool, + status_led_brightness_pct: int, + api_v1_enabled: bool, + snapshot: SnapshotAssertion, +): + """Test System update.""" + data = SystemUpdate( + cloud_enabled=cloud_enabled, + status_led_brightness_pct=status_led_brightness_pct, + api_v1_enabled=api_v1_enabled, + ) + assert snapshot == data.to_dict() + + +async def test_system_update_raises_when_none_set(): + """Test systemUpdate raises when all values are None.""" + update = SystemUpdate( + cloud_enabled=None, status_led_brightness_pct=None, api_v1_enabled=None + ) + + with pytest.raises(ValueError): + update.to_dict() + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ("HWE-P1", ["system"]), + ("HWE-SKT", ["system"]), + ("HWE-WTR", ["system"]), + ("HWE-KWH1", ["system"]), + ("HWE-KWH3", ["system"]), + ("SDM230-wifi", ["system"]), + ("SDM630-wifi", ["system"]), + ], +) +async def test_system(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test System model.""" + for fixture in fixtures: + data = System.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) + assert data + assert snapshot == data diff --git a/tests/v2/__snapshots__/test_v2_batteries.ambr b/tests/v2/__snapshots__/test_v2_batteries.ambr new file mode 100644 index 00000000..262d3d4f --- /dev/null +++ b/tests/v2/__snapshots__/test_v2_batteries.ambr @@ -0,0 +1,25 @@ +# serializer version: 1 +# name: test_batteries[HWE-KWH1-fixtures1] + Batteries(mode=, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0) +# --- +# name: test_batteries[HWE-KWH3-fixtures2] + Batteries(mode=, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0) +# --- +# name: test_batteries[HWE-P1-fixtures0] + Batteries(mode=, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0) +# --- +# name: test_batteries_update[standby] + dict({ + 'mode': 'standby', + }) +# --- +# name: test_batteries_update[to_full] + dict({ + 'mode': 'to_full', + }) +# --- +# name: test_batteries_update[zero] + dict({ + 'mode': 'zero', + }) +# --- diff --git a/tests/v2/__snapshots__/test_v2_device.ambr b/tests/v2/__snapshots__/test_v2_device.ambr new file mode 100644 index 00000000..3fff9cd8 --- /dev/null +++ b/tests/v2/__snapshots__/test_v2_device.ambr @@ -0,0 +1,13 @@ +# serializer version: 1 +# name: test_device[HWE-BAT-fixtures3] + Device(model_name='Plug-In Battery', id='appliance/battery/5c2fafaabbcc', product_name='Plug-in Battery', product_type='HWE-BAT', serial='5c2fafaabbcc', api_version=, firmware_version='6.00') +# --- +# name: test_device[HWE-KWH1-fixtures1] + Device(model_name='Wi-Fi kWh Meter 1-phase', id='appliance/energymeter/5c2fafaabbcc', product_name='kWh Meter 1-Phase', product_type='HWE-KWH1', serial='5c2fafaabbcc', api_version=, firmware_version='6.00') +# --- +# name: test_device[HWE-KWH3-fixtures2] + Device(model_name='Wi-Fi kWh Meter 3-phase', id='appliance/energymeter/5c2fafaabbcc', product_name='kWh Meter 3-Phase', product_type='HWE-KWH3', serial='5c2fafaabbcc', api_version=, firmware_version='6.00') +# --- +# name: test_device[HWE-P1-fixtures0] + Device(model_name='Wi-Fi P1 Meter', id='appliance/p1dongle/5c2fafaabbcc', product_name='P1 Meter', product_type='HWE-P1', serial='5c2fafaabbcc', api_version=, firmware_version='6.00') +# --- diff --git a/tests/v2/__snapshots__/test_v2_measurement.ambr b/tests/v2/__snapshots__/test_v2_measurement.ambr new file mode 100644 index 00000000..dd65c56d --- /dev/null +++ b/tests/v2/__snapshots__/test_v2_measurement.ambr @@ -0,0 +1,22 @@ +# serializer version: 1 +# name: test_measurement[HWE-BAT-fixtures3] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=123.456, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=321.654, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=1234.0, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=230.123, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=5.678, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=50.123, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=123, state_of_charge_pct=50.123) +# --- +# name: test_measurement[HWE-KWH1-fixtures1] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=123.456, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=78.91, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=123.0, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=230.0, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=1.5, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=345.0, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=67.0, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=0.95, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=50.0, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-KWH3-fixtures2] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=123.456, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=78.91, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=123.0, power_l1_w=50.0, power_l2_w=40.0, power_l3_w=-30.0, voltage_v=None, voltage_l1_v=230.0, voltage_l2_v=230.0, voltage_l3_v=230.0, current_a=1.5, current_l1_a=-0.5, current_l2_a=0.8, current_l3_a=1.2, apparent_power_va=345.0, apparent_power_l1_va=115.0, apparent_power_l2_va=120.0, apparent_power_l3_va=110.0, reactive_power_var=67.0, reactive_power_l1_var=-20.0, reactive_power_l2_var=30.0, reactive_power_l3_var=57.0, power_factor=None, power_factor_l1=0.95, power_factor_l2=0.9, power_factor_l3=0.85, frequency_hz=50.0, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0] + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=2948.827, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=1285.951, energy_export_t2_kwh=2876.51, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-678.0, power_l1_w=-676.0, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=datetime.datetime(2024, 6, 28, 14, 12, 34), protocol_version=50, meter_model='ISKRA 2M550T-101', unique_id='Never Gonna Give You Up', tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices=None, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0].1 + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=13779.338, energy_import_t1_kwh=10830.511, energy_import_t2_kwh=2948.827, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=0.0, energy_export_t1_kwh=0.0, energy_export_t2_kwh=0.0, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=-543.0, power_l1_w=-676.0, power_l2_w=133.0, power_l3_w=0.0, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=6.0, current_l1_a=-4.0, current_l2_a=2.0, current_l3_a=0.0, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=datetime.datetime(2024, 6, 28, 14, 12, 34), protocol_version=50, meter_model='ISKRA 2M550T-101', unique_id='Never Gonna Let You Down', tariff=2, voltage_sag_l1_count=1, voltage_sag_l2_count=1, voltage_sag_l3_count=0, voltage_swell_l1_count=0, voltage_swell_l2_count=0, voltage_swell_l3_count=0, any_power_fail_count=4, long_power_fail_count=5, average_power_15m_w=123.0, monthly_power_peak_w=1111.0, monthly_power_peak_timestamp=datetime.datetime(2024, 6, 4, 10, 11, 22), external_devices={'gas_meter_Never gonna run around': ExternalDevice(unique_id='Never gonna run around', type=, value=2569.646, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'water_meter_and desert you': ExternalDevice(unique_id='and desert you', type=, value=123.456, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 5))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0].2 + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=None, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices={'gas_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=111.111, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'heat_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=222.222, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'warm_water_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=333.333, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'water_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=444.444, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'inlet_heat_meter_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=, value=555.555, unit='m3', timestamp=datetime.datetime(2024, 6, 28, 14, 0)), 'None_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': ExternalDevice(unique_id='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', type=None, value=555.555, unit=',3', timestamp=datetime.datetime(2024, 6, 28, 14, 0))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- +# name: test_measurement[HWE-P1-fixtures0].3 + Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=None, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices={'None_Never gonna run around': ExternalDevice(unique_id='Never gonna run around', type=None, value=555.555, unit=',3', timestamp=datetime.datetime(2024, 6, 28, 14, 0))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) +# --- diff --git a/tests/v2/__snapshots__/test_v2_models.ambr b/tests/v2/__snapshots__/test_v2_models.ambr index eaf7a7ff..dcf6b211 100644 --- a/tests/v2/__snapshots__/test_v2_models.ambr +++ b/tests/v2/__snapshots__/test_v2_models.ambr @@ -1,28 +1,4 @@ # serializer version: 1 -# name: test_batteries[HWE-KWH1-fixtures1] - Batteries(mode=, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0) -# --- -# name: test_batteries[HWE-KWH3-fixtures2] - Batteries(mode=, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0) -# --- -# name: test_batteries[HWE-P1-fixtures0] - Batteries(mode=, power_w=-404.0, target_power_w=-400.0, max_consumption_w=1600.0, max_production_w=800.0) -# --- -# name: test_batteries_update[standby] - dict({ - 'mode': 'standby', - }) -# --- -# name: test_batteries_update[to_full] - dict({ - 'mode': 'to_full', - }) -# --- -# name: test_batteries_update[zero] - dict({ - 'mode': 'zero', - }) -# --- # name: test_device[HWE-BAT-fixtures3] Device(model_name='Plug-In Battery', id='appliance/battery/5c2fafaabbcc', product_name='Plug-in Battery', product_type='HWE-BAT', serial='5c2fafaabbcc', api_version=, firmware_version='6.00') # --- @@ -56,55 +32,3 @@ # name: test_measurement[HWE-P1-fixtures0].3 Measurement(wifi_ssid=None, wifi_strength=None, energy_import_kwh=None, energy_import_t1_kwh=None, energy_import_t2_kwh=None, energy_import_t3_kwh=None, energy_import_t4_kwh=None, energy_export_kwh=None, energy_export_t1_kwh=None, energy_export_t2_kwh=None, energy_export_t3_kwh=None, energy_export_t4_kwh=None, power_w=None, power_l1_w=None, power_l2_w=None, power_l3_w=None, voltage_v=None, voltage_l1_v=None, voltage_l2_v=None, voltage_l3_v=None, current_a=None, current_l1_a=None, current_l2_a=None, current_l3_a=None, apparent_power_va=None, apparent_power_l1_va=None, apparent_power_l2_va=None, apparent_power_l3_va=None, reactive_power_var=None, reactive_power_l1_var=None, reactive_power_l2_var=None, reactive_power_l3_var=None, power_factor=None, power_factor_l1=None, power_factor_l2=None, power_factor_l3=None, frequency_hz=None, timestamp=None, protocol_version=None, meter_model=None, unique_id=None, tariff=None, voltage_sag_l1_count=None, voltage_sag_l2_count=None, voltage_sag_l3_count=None, voltage_swell_l1_count=None, voltage_swell_l2_count=None, voltage_swell_l3_count=None, any_power_fail_count=None, long_power_fail_count=None, average_power_15m_w=None, monthly_power_peak_w=None, monthly_power_peak_timestamp=None, external_devices={'None_Never gonna run around': ExternalDevice(unique_id='Never gonna run around', type=None, value=555.555, unit=',3', timestamp=datetime.datetime(2024, 6, 28, 14, 0))}, active_liter_lpm=None, total_liter_m3=None, cycles=None, state_of_charge_pct=None) # --- -# name: test_system[HWE-BAT-fixtures3] - System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=None) -# --- -# name: test_system[HWE-KWH1-fixtures1] - System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=None) -# --- -# name: test_system[HWE-KWH3-fixtures2] - System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=None) -# --- -# name: test_system[HWE-P1-fixtures0] - System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=True) -# --- -# name: test_system_update[None-100-None] - dict({ - 'status_led_brightness_pct': 100, - }) -# --- -# name: test_system_update[None-100-True] - dict({ - 'api_v1_enabled': True, - 'status_led_brightness_pct': 100, - }) -# --- -# name: test_system_update[None-None-True] - dict({ - 'api_v1_enabled': True, - }) -# --- -# name: test_system_update[True-100-None] - dict({ - 'cloud_enabled': True, - 'status_led_brightness_pct': 100, - }) -# --- -# name: test_system_update[True-100-True] - dict({ - 'api_v1_enabled': True, - 'cloud_enabled': True, - 'status_led_brightness_pct': 100, - }) -# --- -# name: test_system_update[True-None-None] - dict({ - 'cloud_enabled': True, - }) -# --- -# name: test_system_update[True-None-True] - dict({ - 'api_v1_enabled': True, - 'cloud_enabled': True, - }) -# --- diff --git a/tests/v2/__snapshots__/test_v2_system.ambr b/tests/v2/__snapshots__/test_v2_system.ambr new file mode 100644 index 00000000..f86360c2 --- /dev/null +++ b/tests/v2/__snapshots__/test_v2_system.ambr @@ -0,0 +1,53 @@ +# serializer version: 1 +# name: test_system[HWE-BAT-fixtures3] + System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=None) +# --- +# name: test_system[HWE-KWH1-fixtures1] + System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=None) +# --- +# name: test_system[HWE-KWH3-fixtures2] + System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=None) +# --- +# name: test_system[HWE-P1-fixtures0] + System(wifi_strength_pct=46, wifi_ssid='My Wi-Fi', wifi_rssi_db=-77, cloud_enabled=False, uptime_s=356, status_led_brightness_pct=100, api_v1_enabled=True) +# --- +# name: test_system_update[None-100-None] + dict({ + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[None-100-True] + dict({ + 'api_v1_enabled': True, + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[None-None-True] + dict({ + 'api_v1_enabled': True, + }) +# --- +# name: test_system_update[True-100-None] + dict({ + 'cloud_enabled': True, + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[True-100-True] + dict({ + 'api_v1_enabled': True, + 'cloud_enabled': True, + 'status_led_brightness_pct': 100, + }) +# --- +# name: test_system_update[True-None-None] + dict({ + 'cloud_enabled': True, + }) +# --- +# name: test_system_update[True-None-True] + dict({ + 'api_v1_enabled': True, + 'cloud_enabled': True, + }) +# --- diff --git a/tests/v2/test_v2_batteries.py b/tests/v2/test_v2_batteries.py new file mode 100644 index 00000000..972de59d --- /dev/null +++ b/tests/v2/test_v2_batteries.py @@ -0,0 +1,47 @@ +"""Test for Batteries model and BatteriesUpdate.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import Batteries, BatteriesUpdate + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ("HWE-P1", ["batteries"]), + ("HWE-KWH1", ["batteries"]), + ("HWE-KWH3", ["batteries"]), + ], +) +async def test_batteries(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test Batteries model.""" + for fixture in fixtures: + data = Batteries.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) + assert data + assert snapshot == data + + +@pytest.mark.parametrize( + ("mode"), + [ + Batteries.Mode.ZERO, + Batteries.Mode.TO_FULL, + Batteries.Mode.STANDBY, + ], +) +async def test_batteries_update( + mode: Batteries.Mode, + snapshot: SnapshotAssertion, +): + """Test Batteries update.""" + data = BatteriesUpdate( + mode=mode, + ) + assert snapshot == data.to_dict() diff --git a/tests/v2/test_v2_device.py b/tests/v2/test_v2_device.py new file mode 100644 index 00000000..8c4cd7f2 --- /dev/null +++ b/tests/v2/test_v2_device.py @@ -0,0 +1,64 @@ +"""Test for Device model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import Device + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ("HWE-P1", ["device"]), + ("HWE-KWH1", ["device"]), + ("HWE-KWH3", ["device"]), + ("HWE-BAT", ["device"]), + ], +) +async def test_device(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test Device model.""" + for fixture in fixtures: + data = Device.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) + assert data + assert snapshot == data + + +# pylint: disable=too-many-arguments,too-many-positional-arguments +@pytest.mark.parametrize( + ( + "model", + "supports_state", + "supports_identify", + "supports_cloud_enable", + "supports_reboot", + "supports_telegram", + ), + [ + ("HWE-P1", False, True, True, True, True), + ("HWE-KWH1", False, False, True, True, False), + ("HWE-KWH3", False, False, True, True, False), + ("HWE-BAT", False, True, False, False, False), + ], +) +async def test_device_support_functions( + model: str, + supports_state: bool, + supports_identify: bool, + supports_cloud_enable: bool, + supports_reboot: bool, + supports_telegram: bool, +): + """Test Device model support functions.""" + device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) + assert device + assert device.supports_state() == supports_state + assert device.supports_identify() == supports_identify + assert device.supports_cloud_enable() == supports_cloud_enable + assert device.supports_reboot() == supports_reboot + assert device.supports_telegram() == supports_telegram diff --git a/tests/v2/test_v2_measurement.py b/tests/v2/test_v2_measurement.py new file mode 100644 index 00000000..8a967031 --- /dev/null +++ b/tests/v2/test_v2_measurement.py @@ -0,0 +1,46 @@ +"""Test for Measurement model.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import Measurement + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ( + "HWE-P1", + [ + "measurement_1_phase_no_gas", + "measurement_3_phase_with_gas_with_watermeter", + "measurement_invalid_ean", + "measurement_invalid_external", + ], + ), + ("HWE-KWH1", ["measurement"]), + ("HWE-KWH3", ["measurement"]), + ("HWE-BAT", ["measurement"]), + ], +) +async def test_measurement(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test Measurement model.""" + for fixture in fixtures: + data = Measurement.from_dict( + json.loads(load_fixtures(f"{model}/{fixture}.json")) + ) + assert data + assert snapshot == data + + +async def test_measurement_ignores_invalid_tariff(): + """Test Measurement model ignores invalid tariff.""" + measurement = Measurement.from_dict({"tariff": 5432}) + assert measurement + assert measurement.tariff is None diff --git a/tests/v2/test_v2_models.py b/tests/v2/test_v2_models.py index fd9539b0..2ad720db 100644 --- a/tests/v2/test_v2_models.py +++ b/tests/v2/test_v2_models.py @@ -6,12 +6,8 @@ from syrupy.assertion import SnapshotAssertion from homewizard_energy.models import ( - Batteries, - BatteriesUpdate, Device, Measurement, - System, - SystemUpdate, ) from . import load_fixtures @@ -84,188 +80,4 @@ async def test_measurement_ignores_invalid_tariff(): """Test Measurement model ignores invalid tariff.""" measurement = Measurement.from_dict({"tariff": 5432}) - assert measurement assert measurement.tariff is None - - -@pytest.mark.parametrize( - ("model", "fixtures"), - [ - ("HWE-P1", ["system"]), - ("HWE-KWH1", ["system"]), - ("HWE-KWH3", ["system"]), - ("HWE-BAT", ["system"]), - ], -) -async def test_system(model: str, fixtures: str, snapshot: SnapshotAssertion): - """Test System model.""" - for fixture in fixtures: - data = System.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) - assert data - - assert snapshot == data - - -@pytest.mark.parametrize( - ("cloud_enabled", "status_led_brightness_pct", "api_v1_enabled"), - [ - (True, None, None), - (None, 100, None), - (None, None, True), - (True, 100, None), - (True, None, True), - (None, 100, True), - (True, 100, True), - ], -) -async def test_system_update( - cloud_enabled: bool, - status_led_brightness_pct: int, - api_v1_enabled: bool, - snapshot: SnapshotAssertion, -): - """Test System update.""" - data = SystemUpdate( - cloud_enabled=cloud_enabled, - status_led_brightness_pct=status_led_brightness_pct, - api_v1_enabled=api_v1_enabled, - ) - assert snapshot == data.to_dict() - - -async def test_system_update_raises_when_none_set(): - """Test systemUpdate raises when all values are None.""" - update = SystemUpdate( - cloud_enabled=None, status_led_brightness_pct=None, api_v1_enabled=None - ) - - with pytest.raises(ValueError): - update.to_dict() - - -@pytest.mark.parametrize( - ("model", "fixtures"), - [ - ("HWE-P1", ["batteries"]), - ("HWE-KWH1", ["batteries"]), - ("HWE-KWH3", ["batteries"]), - ], -) -async def test_batteries(model: str, fixtures: str, snapshot: SnapshotAssertion): - """Test Batteries model.""" - for fixture in fixtures: - data = Batteries.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) - assert data - - assert snapshot == data - - -@pytest.mark.parametrize( - ("mode"), - [ - Batteries.Mode.ZERO, - Batteries.Mode.TO_FULL, - Batteries.Mode.STANDBY, - ], -) -async def test_batteries_update( - mode: Batteries.Mode, - snapshot: SnapshotAssertion, -): - """Test System update.""" - data = BatteriesUpdate( - mode=mode, - ) - assert snapshot == data.to_dict() - - -@pytest.mark.parametrize( - ("model", "supports_state"), - [ - ("HWE-P1", False), - ("HWE-KWH1", False), - ("HWE-KWH3", False), - ("HWE-BAT", False), - ], -) -async def test_device_supports_state(model: str, supports_state: bool): - """Test Device model supports_state function.""" - device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) - assert device.supports_state() == supports_state - - -@pytest.mark.parametrize( - ("model", "supports_identify"), - [ - ("HWE-P1", True), - ("HWE-KWH1", False), - ("HWE-KWH3", False), - ("HWE-BAT", True), - ], -) -async def test_device_supports_identify(model: str, supports_identify: bool): - """Test Device model supports_identify function.""" - device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) - assert device.supports_identify() == supports_identify - - -@pytest.mark.parametrize( - ("model", "supports_cloud_enable"), - [ - ("HWE-P1", True), - ("HWE-KWH1", True), - ("HWE-KWH3", True), - ("HWE-BAT", False), - ], -) -async def test_device_supports_cloud_enable(model: str, supports_cloud_enable: bool): - """Test Device model supports_cloud_enable function.""" - device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) - assert device.supports_cloud_enable() == supports_cloud_enable - - -@pytest.mark.parametrize( - ("model", "supports_reboot"), - [ - ("HWE-P1", True), - ("HWE-KWH1", True), - ("HWE-KWH3", True), - ("HWE-BAT", False), - ], -) -async def test_device_supports_reboot(model: str, supports_reboot: bool): - """Test Device model supports_reboot function.""" - device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) - assert device.supports_reboot() == supports_reboot - - -@pytest.mark.parametrize( - ("model", "supports_telegram"), - [ - ("HWE-P1", True), - ("HWE-KWH1", False), - ("HWE-KWH3", False), - ("HWE-BAT", False), - ], -) -async def test_device_supports_telegram(model: str, supports_telegram: bool): - """Test Device model supports_telegram function.""" - device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) - assert device.supports_telegram() == supports_telegram - - -@pytest.mark.parametrize( - ("model", "supports_led_brightness"), - [ - ("HWE-P1", True), - ("HWE-KWH1", False), - ("HWE-KWH3", False), - ("HWE-BAT", True), - ], -) -async def test_device_supports_led_brightness( - model: str, supports_led_brightness: bool -): - """Test Device model supports_led_brightness function.""" - device = Device.from_dict(json.loads(load_fixtures(f"{model}/device.json"))) - assert device.supports_led_brightness() == supports_led_brightness diff --git a/tests/v2/test_v2_system.py b/tests/v2/test_v2_system.py new file mode 100644 index 00000000..111bcc46 --- /dev/null +++ b/tests/v2/test_v2_system.py @@ -0,0 +1,65 @@ +"""Test for System model and SystemUpdate.""" + +import json + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homewizard_energy.models import System, SystemUpdate + +from . import load_fixtures + +pytestmark = [pytest.mark.asyncio] + + +@pytest.mark.parametrize( + ("model", "fixtures"), + [ + ("HWE-P1", ["system"]), + ("HWE-KWH1", ["system"]), + ("HWE-KWH3", ["system"]), + ("HWE-BAT", ["system"]), + ], +) +async def test_system(model: str, fixtures: str, snapshot: SnapshotAssertion): + """Test System model.""" + for fixture in fixtures: + data = System.from_dict(json.loads(load_fixtures(f"{model}/{fixture}.json"))) + assert data + assert snapshot == data + + +@pytest.mark.parametrize( + ("cloud_enabled", "status_led_brightness_pct", "api_v1_enabled"), + [ + (True, None, None), + (None, 100, None), + (None, None, True), + (True, 100, None), + (True, None, True), + (None, 100, True), + (True, 100, True), + ], +) +async def test_system_update( + cloud_enabled: bool, + status_led_brightness_pct: int, + api_v1_enabled: bool, + snapshot: SnapshotAssertion, +): + """Test System update.""" + data = SystemUpdate( + cloud_enabled=cloud_enabled, + status_led_brightness_pct=status_led_brightness_pct, + api_v1_enabled=api_v1_enabled, + ) + assert snapshot == data.to_dict() + + +async def test_system_update_raises_when_none_set(): + """Test systemUpdate raises when all values are None.""" + update = SystemUpdate( + cloud_enabled=None, status_led_brightness_pct=None, api_v1_enabled=None + ) + with pytest.raises(ValueError): + update.to_dict()