Integration Request - Eyedro Solar-Ready Home WiFi Energy Monitor (EYEFI-2)

I voted and am posting so it can get more notice. I use the aeotech gen 1 but it’s so inaccurate, so it’s either go to gen 2 or eyedro which they are similar in price.

Voted, thanks OP for starting this. And I live in the same town as where it’s made :-), but no affiliation other than that.

Attached is a Node-Red flow that I used for a few minutes before my Eydro fail again. This is my second unit and they are really crappy. You will need to change the address and the Timestamp request in seconds. I am switching to Shelly EM3 which I just got yesterday.
Good luck with Eyedro

[{“id”:“a97a7f8.e7da98”,“type”:“tab”,“label”:“Eyedro”,“disabled”:false,“info”:""},{“id”:“c98ff2fc.e1fb7”,“type”:“http request”,“z”:“a97a7f8.e7da98”,“name”:"",“method”:“GET”,“ret”:“txt”,“paytoqs”:“ignore”,“url”:“http://10.0.3.113:8080/getdata",“tls”:"",“persist”:false,“proxy”:"",“authType”:"",“x”:90,“y”:40,“wires”:[[“3227a94e.1580f6”]]},{“id”:“3227a94e.1580f6”,“type”:“json”,“z”:“a97a7f8.e7da98”,“name”:"",“property”:“payload”,“action”:"",“pretty”:false,“x”:250,“y”:40,“wires”:[[“414c0399.24de2c”]],“info”:“payload.data[0][0]”},{“id”:“414c0399.24de2c”,“type”:“split”,“z”:“a97a7f8.e7da98”,“name”:"",“splt”:"\n",“spltType”:“str”,“arraySplt”:1,“arraySpltType”:“len”,“stream”:false,“addname”:"",“x”:250,“y”:300,“wires”:[[“2718e0b.701282”,“b4893977.24bcb8”,“233d00c1.17518”,“c188f42d.c25a68”,“dd2fe5b5.2c7368”,“d35beb2e.907118”,“5755a6b2.ec0898”,“24fdd142.c2bfbe”,“b2e2f975.d761d8”,“58def24c.0ed7dc”,“5b259799.8e5bd8”,“7054f9fe.1e8b98”]]},{“id”:“2718e0b.701282”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“PF1”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“PF1”},{“property”:“device_class”,“value”:“sesor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:""}],“state”:“payload[0][0]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off””,“outputPayloadType”:“jsonata”,“x”:450,“y”:20,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“b4893977.24bcb8”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“V1”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“V1”},{“property”:“device_class”,“value”:“sesor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“V”}],“state”:“payload[0][1]/100”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:80,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“233d00c1.17518”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“C1”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“C1”},{“property”:“device_class”,“value”:“sesor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“A”}],“state”:“payload[0][2]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:140,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“c188f42d.c25a68”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“P1”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“P1”},{“property”:“device_class”,“value”:“sesor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“kW”}],“state”:“payload[0][3]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:200,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“dd2fe5b5.2c7368”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“PF2”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“PF2”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:""}],“state”:“payload[1][0]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:260,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“d35beb2e.907118”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“V2”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“V2”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“V”}],“state”:“payload[1][1]/100”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:320,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“5755a6b2.ec0898”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“C2”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“C2”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“A”}],“state”:“payload[1][2]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:380,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“24fdd142.c2bfbe”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“P2”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“P2”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“kW”}],“state”:“payload[1][3]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:440,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“b2e2f975.d761d8”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“PF3”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“PF3”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:""}],“state”:“payload[2][0]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:500,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“58def24c.0ed7dc”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“C3”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“C3”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“A”}],“state”:“payload[2][2]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:620,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“5b259799.8e5bd8”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“P3”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“P3”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“kW”}],“state”:“payload[2][3]/1000”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:680,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“39f45e7f.e6bee2”,“type”:“inject”,“z”:“a97a7f8.e7da98”,“name”:"",“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:80,“y”:160,“wires”:[[“c98ff2fc.e1fb7”]]},{“id”:“7054f9fe.1e8b98”,“type”:“ha-entity”,“z”:“a97a7f8.e7da98”,“name”:“V3”,“server”:“bc748184.63e6e”,“version”:1,“debugenabled”:false,“outputs”:1,“entityType”:“sensor”,“config”:[{“property”:“name”,“value”:“V3”},{“property”:“device_class”,“value”:“sensor”},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:“V”}],“state”:“payload[2][1]/100”,“stateType”:“jsonata”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:false,“outputPayload”:"$entity().state ? “on”: “off”",“outputPayloadType”:“jsonata”,“x”:450,“y”:560,“wires”:[[]],“info”:“states(‘sensor.PF1’)\npayload[0][0]”},{“id”:“bc748184.63e6e”,“type”:“server”,“name”:“Home Assistant”,“legacy”:false,“addon”:true,“rejectUnauthorizedCerts”:true,“ha_boolean”:“y|yes|true|on|home|open”,“connectionDelay”:true,“cacheJson”:true}]

1 Like

And here is the flow:

and after it updates every 300 sec.

The Sense energy monitor and associated Integration really work well for me. Haven’t tried EyeDro.

with the new energy monitoring you would think this would get priority

Hi Albert, I tried to import this flow without success. I get syntax error "JSON Parse error: Unrecognized token ‘“’ ". Any help is highly appreciated!

Did you edit the http request so it has your eyedro IP address? Like this: http://10.0.3.113:8080/getdata.
Also I created the flow several firmware updates ago. I do not use the Eyedro any more as the data is of by 40% in some case. Shelly EM3 is much better

Thanks, Albert for sharing your NodeRed flow. I had a similar issue and I did update the IP address. Ultimately, I’m still hoping someone who has some coding knowledge would pick this up and create an integration. I watched a few YouTube videos and was able to add some commands to my config.yaml to gather data from the EyeDro. Unfortunately, (due to my lack of coding knowledge) I had to create a statement that caused Home Assistant to poll the EyeDro for voltage, amps, watts and power factor all at once. This caused the EyeDro to crash and stop responding to future calls. The power monitoring still worked, just not the API portion. There is a way to nest or group these commands so that Home Assistant can poll one time and gather all the data - but I couldn’t figure out how to do it. I emailed EyeDro about a year ago and requested that their developers create an integration and they seemed interested, but nothing ever happened. It is a shame because they seem to have a good product. I’m sure many others would be interested if they would add the integration. Maybe Lexx could pay them a personal visit since he lives in the same town!

I have this working as a REST sensor, I had to rip the values out of a string, since they are not JSON.

Remaining Issue:
HA won’t allow state_class: on a template sensor so I am stuck now, not able to utilize the built in energy functionality.

Its polled so not 100% accurate with the integral tool. I’m keeping an eye on it for a while.

I’ve also gotten it working using a RESTful sensor; I didn’t have to use any template sensors once I fiddled around with the JSON attributes path and value templates a bunch (fwiw, HA’s logging of this is pretty annoyingly bad :sweat_smile:).

Also worth mentioning: I was extremely impressed with Eyedro’s support; I had a bunch of pre-sales questions they were quick to answer (e.g.: note that the non-wifi version doesn’t have the local API), and they even swapped out the stock 200A CT clamps for 100A ones for me (to give me better accuracy as I only have 100A hydro service anyway).

You can apparently add the Integration - Riemann sum integral via GUI, but I chose to do it in the YAML (see the sensor: block below). Although I just got it working now and as a result don’t have enough data for the HA Energy charts to display, the total energy sensor does show up in the HA Energy sensor list, huzza!

sensor:
  - platform: integration
    source: sensor.eyedro_total_power
    name: "Eyedro total energy"
    unique_id: eyedro_total_energy
    round: 2

rest:
  - resource: http://[your eyedro's IP or hostname]:8080/getdata
    scan_interval: 10
    sensor:
      - name: "Eyedro total power"
        unique_id: eyedro_total_power
        json_attributes_path: "$.response"
        value_template: "{{ (value_json['data'][0][3] + value_json['data'][1][3])/1000 }}"
        unit_of_measurement: "kW"
        device_class: power
        state_class: measurement
      - name: "Eyedro total current"
        unique_id: eyedro_total_current
        json_attributes_path: "$.response"
        value_template: "{{ (value_json['data'][0][2] + value_json['data'][1][2])/1000 }}"
        unit_of_measurement: "A"
        device_class: current
        state_class: measurement
      - name: "Eyedro average voltage"
        unique_id: eyedro_average_voltage
        json_attributes_path: "$.response"
        value_template: "{{ (value_json['data'][0][1] + value_json['data'][1][1])/200 }}" #reported in tens of milivolts, but we want the average, so /2 /100 = /200
        unit_of_measurement: "V"
        device_class: voltage
        state_class: measurement
      - name: "Eyedro average power factor"
        unique_id: eyedro_average_pf
        json_attributes_path: "$.response"
        value_template: "{{ (value_json['data'][0][0] + value_json['data'][1][0])/20 }}" #reported in tenths of a percent, but we want the average, so /2 /10 = /20
        unit_of_measurement: "%"
        device_class: power_factor
        state_class: measurement

Edit: for those of us in Ontario, there is a HACS integration for the Ontario Energy Board that can give you your ToU rates for use in the HA Energy dashboard.

Edit 2: fixed YAML typo, value_json['data'][0][1]value_json['data'][1][0] and /200 to /20 for the power factor value template.

Edit 3: fixed typo in Eydro total energyEyedro total energy. Now entity searches don’t drive you crazy :sweat_smile:

3 Likes

Thank you very much @_k_w , this REST sensor works perfectly for me. Great work!

Hello, I have two eyedro’s in my house and am unable to make this REST coding work for both devices, it does work for only one at a time. If I repeat the code for the second device, I get duplicate key errors. I am new at this, could someone help me resolve this issue?

Thank you

When you duplicate the code, are you adding a “2” or something at the end of the name and unique ID in the 2nd set of code?

Thank you this helped!

Hi Mark J, we’ve had many customers asking about Home Assistant support and I see from this thread that you are local. We are willing to help optimize the Home Assistant integration but since none of our engineers currently use Home Assistant a call would be helpful with someone that understand HA. Please reach out to us at Eyedro Support ([email protected]) if you’re interested.
Thanks,
– Eyedro Support

4 Likes

Any update on this?

1 Like

Another UPvote here, pretty please :pray:

Here’s a screenshot of the UI on their website. It would be soooo amazing to trigger automations off this.

Quick example of how crucial this data can be. I monitor my energy on my well water pump. Its crucial I get notified of irregular power usage. If there is, that means there’s a leak somewhere, or the pump is failing. Pretty vital details when you’re on a shared private well with several other neighbors. Many thanks to the HA gods for your attention here. :kissing_heart:

1 Like

_k_w: Any chance you could provide your updated RESTful sensor YAML (assuming you’re still using Eyedro with HA)? HA has changed enough that what you wrote back in '22 no longer works with HA v2024.8.3