Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add Frient EMIZB-151 HAN P1 Electricity Meter Sensor #8129

Merged
merged 4 commits into from
Oct 20, 2024
Merged

add Frient EMIZB-151 HAN P1 Electricity Meter Sensor #8129

merged 4 commits into from
Oct 20, 2024

Conversation

MarkusPalm
Copy link
Contributor

@MarkusPalm MarkusPalm commented Oct 13, 2024

@MarkusPalm MarkusPalm marked this pull request as ready for review October 13, 2024 21:01
@MarkusPalm MarkusPalm marked this pull request as draft October 13, 2024 21:09
@MarkusPalm MarkusPalm marked this pull request as ready for review October 13, 2024 21:35
vendor: 'Frient',
description: 'HAN P1 power-meter sensor',
extend: [electricityMeter()],
configure: async (device) => {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it also work without the configure? (make sure to factory reset the device after removing)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without the configure both the reporting and bind fail. Adding the configure was the only way I found to make it behave properly. electricityMeter({threePhase: true}) makes reporting and bind fail.

Is some other parameter required?

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you provide the debug log of this failing?

See this on how to enable debug logging.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My mistake, it seems like configure isn't required and it will report and bind properly. Something else must have failed when I was testing earlier

electricityMeter({threePhase: true}) does still fail. It creates a very weird result.

The state reports correctly except for energy
Screenshot 2024-10-14 at 22 29 47

But reporting and bind don't look correct, without seMetering is missing from bind and all reporting configuration is missing
Screenshot 2024-10-14 at 22 29 38

Screenshot 2024-10-14 at 22 29 30

Debug entry

[2024-10-14 22:06:34] info: z2m: Configuring '0x0015bc001b10135c'
[2024-10-14 22:06:34] debug: zh:controller:endpoint: ZCL command 0x0015bc001b10135c/2 haElectricalMeasurement.read(["acPowerDivisor","acPowerMultiplier"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"reservedBits":0,"writeUndiv":false})
[2024-10-14 22:06:34] debug: zh:controller:endpoint: Request Queue (0x0015bc001b10135c/2): send request
[2024-10-14 22:06:34] debug: zh:ezsp: sendZclFrameToEndpointInternal 0x0015bc001b10135c:17439/2 (0,0,1), timeout=10000
[2024-10-14 22:06:34] info: z2m:mqtt: MQTT publish: topic 'homeassistant/sensor/0x0015bc001b10135c/power/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state","value_template":"{{ value_json.state }}"}],"device":{"identifiers":["zigbee2mqtt_0x0015bc001b10135c"],"manufacturer":"Frient","model":"HAN P1 power-meter sensor (EMIZB-151)","name":"0x0015bc001b10135c","via_device":"zigbee2mqtt_bridge_0xe0798dfffef441e0"},"device_class":"power","enabled_by_default":true,"entity_category":"diagnostic","object_id":"0x0015bc001b10135c_power","origin":{"name":"Zigbee2MQTT","sw":"1.40.2","url":"https://www.zigbee2mqtt.io"},"state_class":"measurement","state_topic":"zigbee2mqtt/0x0015bc001b10135c","unique_id":"0x0015bc001b10135c_power_zigbee2mqtt","unit_of_measurement":"W","value_template":"{{ value_json.power }}"}'
[2024-10-14 22:06:34] debug: zh:ezsp:ezsp: ==> sendUnicast: {"type":0,"indexOrDestination":17439,"apsFrame":{"profileId":260,"sequence":21,"clusterId":2820,"sourceEndpoint":1,"destinationEndpoint":2,"groupId":0,"options":256},"messageTag":22,"message":{"type":"Buffer","data":[16,14,0,5,6,4,6]}}
[2024-10-14 22:06:34] debug: zh:ezsp:ezsp: ==> {"cls":"sendUnicast","id":52,"isRequest":true,"type":0,"indexOrDestination":17439,"apsFrame":{"profileId":260,"sequence":21,"clusterId":2820,"sourceEndpoint":1,"destinationEndpoint":2,"groupId":0,"options":256},"messageTag":22,"message":{"type":"Buffer","data":[16,14,0,5,6,4,6]}}
[2024-10-14 22:06:34] debug: zh:ezsp:uart: --> DATA (5,6,0): 4500013400001f440401040b010200010000151607100e0005060406
[2024-10-14 22:06:34] debug: zh:ezsp:uart: --> [560721a9602a15ad1d904b21a15490499d4e27befbc97785fdc3658dfa7d33c57e]
[2024-10-14 22:06:34] debug: zh:ezsp:uart: -?- waiting (6)
[2024-10-14 22:06:34] info: z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"definition":{"description":"HAN P1 power-meter sensor","exposes":[{"access":5,"category":"diagnostic","description":"Instantaneous measured power","label":"Power","name":"power","property":"power","type":"numeric","unit":"W"},{"access":5,"category":"diagnostic","description":"Measured electrical potential value","label":"Voltage","name":"voltage","property":"voltage","type":"numeric","unit":"V"},{"access":5,"category":"diagnostic","description":"Instantaneous measured electrical current","label":"Current","name":"current","property":"current","type":"numeric","unit":"A"},{"access":5,"description":"Sum of consumed energy","label":"Energy","name":"energy","property":"energy","type":"numeric","unit":"kWh"},{"access":5,"category":"diagnostic","description":"Instantaneous measured power on phase B","label":"Power phase b","name":"power_phase_b","property":"power_phase_b","type":"numeric","unit":"W"},{"access":5,"category":"diagnostic","description":"Instantaneous measured power on phase C","label":"Power phase c","name":"power_phase_c","property":"power_phase_c","type":"numeric","unit":"W"},{"access":5,"description":"Measured electrical potential value on phase B","label":"Voltage phase B","name":"voltage_phase_b","property":"voltage_phase_b","type":"numeric","unit":"V"},{"access":5,"description":"Measured electrical potential value on phase C","label":"Voltage phase C","name":"voltage_phase_c","property":"voltage_phase_c","type":"numeric","unit":"V"},{"access":5,"description":"Instantaneous measured electrical current on phase B","label":"Current phase B","name":"current_phase_b","property":"current_phase_b","type":"numeric","unit":"A"},{"access":5,"description":"Instantaneous measured electrical current on phase C","label":"Current phase C","name":"current_phase_c","property":"current_phase_c","type":"numeric","unit":"A"},{"access":1,"category":"diagnostic","description":"Link quality (signal strength)","label":"Linkquality","name":"linkquality","property":"linkquality","type":"numeric","unit":"lqi","value_max":255,"value_min":0}],"model":"EMIZB-151","options":[{"access":2,"description":"Calibrates the power value (percentual offset), takes into effect on next report of device.","label":"Power calibration","name":"power_calibration","property":"power_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for power, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Power precision","name":"power_precision","property":"power_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the voltage value (percentual offset), takes into effect on next report of device.","label":"Voltage calibration","name":"voltage_calibration","property":"voltage_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for voltage, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Voltage precision","name":"voltage_precision","property":"voltage_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the current value (percentual offset), takes into effect on next report of device.","label":"Current calibration","name":"current_calibration","property":"current_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for current, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Current precision","name":"current_precision","property":"current_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the energy value (percentual offset), takes into effect on next report of device.","label":"Energy calibration","name":"energy_calibration","property":"energy_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for energy, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Energy precision","name":"energy_precision","property":"energy_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the power_phase_b value (percentual offset), takes into effect on next report of device.","label":"Power phase b calibration","name":"power_phase_b_calibration","property":"power_phase_b_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for power_phase_b, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Power phase b precision","name":"power_phase_b_precision","property":"power_phase_b_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the power_phase_c value (percentual offset), takes into effect on next report of device.","label":"Power phase c calibration","name":"power_phase_c_calibration","property":"power_phase_c_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for power_phase_c, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Power phase c precision","name":"power_phase_c_precision","property":"power_phase_c_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the voltage_phase_b value (percentual offset), takes into effect on next report of device.","label":"Voltage phase b calibration","name":"voltage_phase_b_calibration","property":"voltage_phase_b_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for voltage_phase_b, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Voltage phase b precision","name":"voltage_phase_b_precision","property":"voltage_phase_b_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the voltage_phase_c value (percentual offset), takes into effect on next report of device.","label":"Voltage phase c calibration","name":"voltage_phase_c_calibration","property":"voltage_phase_c_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for voltage_phase_c, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Voltage phase c precision","name":"voltage_phase_c_precision","property":"voltage_phase_c_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the current_phase_b value (percentual offset), takes into effect on next report of device.","label":"Current phase b calibration","name":"current_phase_b_calibration","property":"current_phase_b_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for current_phase_b, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Current phase b precision","name":"current_phase_b_precision","property":"current_phase_b_precision","type":"numeric","value_max":3,"value_min":0},{"access":2,"description":"Calibrates the current_phase_c value (percentual offset), takes into effect on next report of device.","label":"Current phase c calibration","name":"current_phase_c_calibration","property":"current_phase_c_calibration","type":"numeric"},{"access":2,"description":"Number of digits after decimal point for current_phase_c, takes into effect on next report of device. This option can only decrease the precision, not increase it.","label":"Current phase c precision","name":"current_phase_c_precision","property":"current_phase_c_precision","type":"numeric","value_max":3,"value_min":0}],"supports_ota":false,"vendor":"Frient"},"friendly_name":"0x0015bc001b10135c","ieee_address":"0x0015bc001b10135c","status":"successful","supported":true},"type":"device_interview"}'
[2024-10-14 22:06:34] info: z2m:mqtt: MQTT publish: topic 'homeassistant/sensor/0x0015bc001b10135c/voltage/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state","value_template":"{{ value_json.state }}"}],"device":{"identifiers":["zigbee2mqtt_0x0015bc001b10135c"],"manufacturer":"Frient","model":"HAN P1 power-meter sensor (EMIZB-151)","name":"0x0015bc001b10135c","via_device":"zigbee2mqtt_bridge_0xe0798dfffef441e0"},"device_class":"voltage","enabled_by_default":false,"entity_category":"diagnostic","object_id":"0x0015bc001b10135c_voltage","origin":{"name":"Zigbee2MQTT","sw":"1.40.2","url":"https://www.zigbee2mqtt.io"},"state_class":"measurement","state_topic":"zigbee2mqtt/0x0015bc001b10135c","unique_id":"0x0015bc001b10135c_voltage_zigbee2mqtt","unit_of_measurement":"V","value_template":"{{ value_json.voltage }}"}'

Database Entry

{"id":20,"type":"EndDevice","ieeeAddr":"0x0015bc001b10135c","nwkAddr":17439,"manufId":4117,"manufName":"frient A/S","powerSource":"DC Source","modelId":"EMIZB-151","epList":[1,2],"endpoints":{"1":{"profId":49353,"epId":1,"devId":1,"inClusterList":[5,6],"outClusterList":[],"clusters":{},"binds":[],"configuredReportings":[],"meta":{}},"2":{"profId":260,"epId":2,"devId":83,"inClusterList":[0,1,3,32,1794,1796,2817,2820,2821],"outClusterList":[3,10,25],"clusters":{"genBasic":{"attributes":{"modelId":"EMIZB-151","manufacturerName":"frient A/S","powerSource":4,"zclVersion":7,"dateCode":"2023-12-21 11:13"}},"genPollCtrl":{"attributes":{"checkinInterval":14400}},"haElectricalMeasurement":{"attributes":{"acPowerDivisor":1,"acPowerMultiplier":1,"acCurrentDivisor":10,"acCurrentMultiplier":1,"acVoltageDivisor":10,"acVoltageMultiplier":1}}},"binds":[{"cluster":32,"type":"endpoint","deviceIeeeAddress":"0xe0798dfffef441e0","endpointID":1},{"cluster":2820,"type":"endpoint","deviceIeeeAddress":"0xe0798dfffef441e0","endpointID":1}],"configuredReportings":[],"meta":{}}},"dateCode":"2023-12-21 11:13","zclVersion":7,"interviewCompleted":true,"meta":{},"lastSeen":1728936395746,"checkinInterval":3600}

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you provide the complete debug log from starting the configure until it fails/succeeds (it's only partial now)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The log entry from start to end is very long so I'm uploading the whole file instead.

log.log

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It fails to send the request:

[2024-10-14 22:06:35] debug: 	zh:controller:endpoint: Request Queue (0x0015bc001b10135c/2): queue request (transaction failed) (Error: sendZclFrameToEndpointInternal error)
[2024-10-14 22:06:35] debug: 	zh:controller:requestqueue: Request Queue (0x0015bc001b10135c/2): Sending when active. Expires: 1728939995873

So that's why the binds are missing, this is likely due to a hickup in your network. I also suggest to start using the improved ember driver and try again. (info)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After switching to the ember driver the issue still persists, but now we get a proper error messages.

[2024-10-19 16:29:58] debug: zh:controller:requestqueue: Request Queue (0x0015bc001b10135c/2): send failed, expires in 3289.283 seconds (~x~> [ZCL to=0x0015bc001b10135c:141 apsFrame={"profileId":260,"clusterId":2820,"sourceEndpoint":1,"destinationEndpoint":2,"options":4416,"groupId":0,"sequence":0}] Failed to send request with status=MESSAGE_TOO_LONG.)

Here's the complete log file
log.log

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 5c1f2d5

Changes will be available in the dev branch in a few hours from now.

@MarkusPalm
Copy link
Contributor Author

Thanks, I can confirm that the fix is working and everything is now reporting correctly

@Koenkk Koenkk merged commit f066285 into Koenkk:master Oct 20, 2024
2 checks passed
@Koenkk
Copy link
Owner

Koenkk commented Oct 20, 2024

Thanks!

@MarkusPalm MarkusPalm deleted the frient-EMIZB-151 branch October 21, 2024 10:19
@johanrax
Copy link

johanrax commented Nov 6, 2024

Do you know if the meter also sends produced energy? It should measure it according to Frients support.

@MarkusPalm
Copy link
Contributor Author

@johanrax I can read "currentSummReceived" on my p1 sensor. So it seems like that would be the case.

@MarkusPalm
Copy link
Contributor Author

MarkusPalm commented Nov 6, 2024

You can try this converter.

const {deviceEndpoints, electricityMeter} = require('zigbee-herdsman-converters/lib/modernExtend');

// No other imports are necessary.

const definition = {
    zigbeeModel: ['EMIZB-151'],
    model: 'EMIZB-151',
    vendor: 'Frient',
    description: 'HAN P1 power-meter sensor',
    extend: [electricityMeter({threePhase: true, producedEnergy: true})],
};

module.exports = definition;

@johanrax
Copy link

johanrax commented Nov 6, 2024

Thanks! It is reported now.

@Dragunovam
Copy link

Dragunovam commented Jan 9, 2025

Hi, I'm having issues with the latest merged commits for this device. It used to report power correctly with the 0x0400 InstantaneousDemand, but now it seems to behave in a weird way. In the logs you will notice that - without fault - it will push two messages when asked to report every second. The first message gives the correct power reading, the second message right after gives a much lower power value. The pattern here seems to be that in the second payload the actual power is the sum of the power and power_phase_c. This is a big problem for me because I can't even calculate the area underneath the power graph, the "correct" power reading are peaks with a duration of 0, since they represent a point in time, not a period.

EDIT I have measured each phase with an oscilloscope and compared it with the data from the power meter.
The three phases are 400V, shifted by 120 degrees giving roughly 230 volts between phases and neuter. This system performs dynamic load balancing by shifting how much amperage each phase pushes into the house.
The current data pulled from HA shows following data:

  • power
  • power_phase_b
  • power_phase_c

The first argument power is in fact power_phase_a. This is the same for every other data point in the documentation of the EMIZB-151. Unfortunately this is not correctly documented. Somehow the power argument seems push both the power_phase_a data and the InstantaneousDemand.
The current implementation has power, voltage and current exposed in the zigbee2mqtt fronted as if they are the accumulated data for all phases, they are not. They represent power, voltage and current for phase_a
The official documentation by develco has failed to correctly tag this in the metering cluster.

I will investigate the code for solutions.

EDIT2: I was able to find the cause of the problem. In modernExtend.ts the cluster set to 'both' in the arguments of the function electricityMeter will trigger two values for power, one set by haElectricalMeasurement and one set by seMetering. I am refactoring a large part of code, including the converters to get this working. The most simple way to solve this is by renaming power in an haElectricalMeasurement context to power_phase_a and power in a seMetering context to simply power. This makes sense because power represents the sum of all phase powers.

image

From the logs I will give the first example:
"power":1527
right after we get a message with this reading:
power":219,"power_phase_b":0,"power_phase_c":1308

Message 2 (219 + 1308) = (1527) message 1

info 2025-01-09 23:27:39z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Power meter', payload '{"current":0.92,"current_phase_b":0.02,"current_phase_c":5.73,"energy":6560.59,"linkquality":252,"power":1527,"power_phase_b":0,"power_phase_c":1301,"voltage":231.3,"voltage_phase_b":231.4,"voltage_phase_c":229.5}'
info 2025-01-09 23:27:39z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Power meter', payload '{"current":1.04,"current_phase_b":0.02,"current_phase_c":5.74,"energy":6560.59,"linkquality":252,"power":219,"power_phase_b":0,"power_phase_c":1308,"voltage":232.1,"voltage_phase_b":231.9,"voltage_phase_c":230}'

info 2025-01-09 23:27:44z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Power meter', payload '{"current":1.04,"current_phase_b":0.02,"current_phase_c":5.74,"energy":6560.59,"linkquality":252,"power":1532,"power_phase_b":0,"power_phase_c":1308,"voltage":232.1,"voltage_phase_b":231.9,"voltage_phase_c":230}'
info 2025-01-09 23:27:45z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Power meter', payload '{"current":1.07,"current_phase_b":0.02,"current_phase_c":5.73,"energy":6560.59,"linkquality":252,"power":228,"power_phase_b":0,"power_phase_c":1304,"voltage":231.6,"voltage_phase_b":231.4,"voltage_phase_c":229.7}'


info 2025-01-09 23:27:54z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Power meter', payload '{"current":1.07,"current_phase_b":0.02,"current_phase_c":5.73,"energy":6560.6,"linkquality":252,"power":1496,"power_phase_b":0,"power_phase_c":1304,"voltage":231.6,"voltage_phase_b":231.4,"voltage_phase_c":229.7}'
info 2025-01-09 23:27:55z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/Power meter', payload '{"current":0.92,"current_phase_b":0.02,"current_phase_c":5.74,"energy":6560.6,"linkquality":252,"power":193,"power_phase_b":0,"power_phase_c":1303,"voltage":231.6,"voltage_phase_b":231.3,"voltage_phase_c":229.4}'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[New device support]: Develco EMI 2 - P1 - EMIZB-151
4 participants