Achronite / mqtt-energenie-ener314rt

MQTT interface for Energenie ENER314-RT add-on board for the Raspberry Pi, designed for use by Home Assistant.
MIT License
13 stars 5 forks source link

Possible overwriting of commands eTRVs #67

Open genestealer opened 7 months ago

genestealer commented 7 months ago

I'm aware that it is very easy to inadvertently overwrite commands for eTRVs.

Such as sending a maintenance command, then sending a temperature change command before the eTRV "wakes+up/checks in", in which case the maintenance command will be discarded in lue of the later temperature change command. As there is no command stacking that I'm aware of.

My question is, where in the code and when is the interval set for querying the voltage? I want to understand how it's done so that I can make sure I avoid sending my weekly calibrate commands the same time of day as the voltage command. Looking to potentially modify it, so that if a user requested command has been received and is pending transmission, then the battery query command will not be processed.

Achronite commented 7 months ago

From what I remember, the voltage is auto-reported by the eTRV without requesting, but it doesn't do it very often.

As regards regular 'maintenance' commands, I've recently built some code along these lines for the thermostat for issue https://github.com/Achronite/mqtt-energenie-ener314rt/issues/56 (as it doesn't report ANYTHING unless asked). So can you let me know what you think is useful, I could add something for the eTRV that wouldn't interfere with any of your commands.

Other approaches you could use (purely in HA) are to add a condition to your automation to check if 'retries' is 0 before sending another command, or just allow 50 mins (10x5) between issuing your maintenance commands.

Achronite commented 6 months ago

I was having a think about this night, in relation to a query I have outstanding with energenie for the thermostat. I seems the way that energenie handle this (for the thermostat at least) is they stack commands within one message, ie (a rare capture from the MiHome gateway):

Jan 08 21:01:23 :@openThings_receive(): hdr: {"deviceId":XXXXX,"mfrId":4,"productId":18,"timestamp":1704747683
Jan 08 21:01:23 :openThings_receive(): rec:0 {"name":"TARGET_TEMP","id":203(command),"datatype":2,"str":"","int":264,"float":16.500000}
Jan 08 21:01:23 :openThings_receive(): rec:1 {"name":"TARGET_TEMP","id":203(command),"datatype":2,"str":"","int":224,"float":14.000000}

In the above example, the last temperature record (14) 'won'.

I'm wondering if a similar approach might work for the eTRV? @genestealer do you have any thoughts on this?

genestealer commented 6 months ago

I could fire up the MiHome gateway and try sending some eTRV commands to see if they also stack? Ah, but do you think they would be picked up by mqtt-energenie-ener314rt?

My worry is a command, such as "Valve Auto" or "Valve Closed" would be overwritten by a temperature set command, sent shortly after, leaving the valve closed.

Achronite commented 6 months ago

I could fire up the MiHome gateway and try sending some eTRV commands to see if they also stack?\nAh, but do you think they would be picked up

The code currently in develop on this and energenie-ener314rt has radio filtering disabled so it is more likely to see the gateway commands. The topics appear in Mqtt with '_' added to the beginning and are set to retained.

It does miss some messages though, as the gateway and my code have to respond really quickly to hit the Rx window of the thermostat. Persistence is required to catch them, good luck!

genestealer commented 6 months ago

How interesting, they have a setting to Request voltage at a set time, as if it's not reported back periodically? image

genestealer commented 6 months ago

I could fire up the MiHome gateway and try sending some eTRV commands to see if they also stack?\nAh, but do you think they would be picked up

The code currently in develop on this and energenie-ener314rt has radio filtering disabled so it is more likely to see the gateway commands. The topics appear in Mqtt with '_' added to the beginning and are set to retained.

It does miss some messages though, as the gateway and my code have to respond really quickly to hit the Rx window of the thermostat. Persistence is required to catch them, good luck!

Do you mean develop "https://github.com/Achronite/mqtt-energenie-ener314rt/tree/develop", I'm running this and cannot see any topics with _, when commanding a switch on/off from https://mihome4u.co.uk/devices

Achronite commented 6 months ago

I mean you will need the develop branch of mqtt-energenie-ener314rt and the underlying dependency too, energenie-ener314rt.

Achronite commented 6 months ago

@genestealer Did you get a chance to look at the command stacking in the same message?

genestealer commented 5 months ago

@Achronite I will have a look at this, this afternoon :)

genestealer commented 5 months ago

I mean you will need the develop branch of mqtt-energenie-ener314rt and the underlying dependency too, energenie-ener314rt.

@Achronite I'm struggling to figure out how. I don't know where the dependencies (I.E. energenie-ener314rt) are meant to be/where npm install normally puts them?

  1. I stop the service sudo systemctl stop mqtt-energenie-ener314rt
  2. I remove the contents of /home/pi/mqtt-energenie-ener314rt and replace it with the files from the develop branch of mqtt-energenie-ener314rt
  3. I try to install node's dependencies from within /home/pi/mqtt-energenie-ener314rt: by running npm install, which returns an error (npm ERR! notarget No matching version found for energenie-ener314rt@0.7.1.) as "energenie-ener314rt": "0.7.1" does not "exist" yet. So I try to edit the mqtt-energenie-ener314rt package.json to set "energenie-ener314rt": "0.6.0" which then installs, but I cannot see where energenie-ener314rt rev 6 is actually installed, in order to replace it with the develop branch.
Achronite commented 5 months ago

I'm struggling to figure out how. I don't know where the dependencies (I.E. energenie-ener314rt) are meant to be/where npm install normally puts them?

I've just written a guide for how to do this for you here: https://github.com/Achronite/mqtt-energenie-ener314rt/wiki#using-the-develop-branch

Achronite commented 5 months ago

@genestealer There were a couple of steps missed in my hastily written instructions that I have fixed.

Also, I realised I re-enabled the node address filtering (for release) in energenie-ener314rt, this change has been reverted for now to try and catch the gateway commands

genestealer commented 5 months ago

@Achronite Thank you I will give this a go :)

genestealer commented 5 months ago

Followed the steps to the letter and it's giving me the error: ../C/achronite/leds.c:12:10: fatal error: gpiod.h: No such file or directory 12 | #include <gpiod.h> // sudo apt-get install gpiod libgpiod-dev

image

image

genestealer commented 5 months ago

@Achronite Ah, I see your comment in the code file: C/achronite/leds.c I was missing this library, I did not know I needed to install. #include <gpiod.h> // sudo apt-get install gpiod libgpiod-dev

Achronite commented 5 months ago

@Achronite Ah, I see your comment in the code file: C/achronite/leds.c I was missing this library, I did not know I needed to install. #include <gpiod.h> // sudo apt-get install gpiod libgpiod-dev

Yeah. WiringPi is deprecated and does not work with the pi5. so i've switched to gpiod. I better check my installation instructions have been updated.

genestealer commented 5 months ago

I was having a think about this night, in relation to a query I have outstanding with energenie for the thermostat. I seems the way that energenie handle this (for the thermostat at least) is they stack commands within one message, ie (a rare capture from the MiHome gateway):

Jan 08 21:01:23 :@openThings_receive(): hdr: {"deviceId":XXXXX,"mfrId":4,"productId":18,"timestamp":1704747683
Jan 08 21:01:23 :openThings_receive(): rec:0 {"name":"TARGET_TEMP","id":203(command),"datatype":2,"str":"","int":264,"float":16.500000}
Jan 08 21:01:23 :openThings_receive(): rec:1 {"name":"TARGET_TEMP","id":203(command),"datatype":2,"str":"","int":224,"float":14.000000}

In the above example, the last temperature record (14) 'won'.

I'm wondering if a similar approach might work for the eTRV? @genestealer do you have any thoughts on this?

@Achronite I have the develop code all up and running and will see what I can capture between the stock gateway and an eTRV

Achronite commented 5 months ago

To check you are capturing commands you should be able to see retained '_' entries in MQTT before a parameter name, e.g. energenie/3/XXX/_TARGET_TEMP. But you will need 'verbose' logging on to capture the timing, i.e. stacking.

genestealer commented 5 months ago

@Achronite

I have it all setup, 'verbose' logging enabled, etc.

I got a new eTRV (ID 3449) and joined it to the Energenie mihome gateway. I also saw it come up in Home Assistant/MQTT.

Example of setting the target temperature to 28 degrees via the Energenie mihome webpage, to which I can hear/see the eTRV respond to; Strange I cannot see "28" or a command "244" anywhere in the logs, but the eTRV started to move after the command was set on the webpage.

image

@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707333693,"TEMPERATURE":21.8,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707333693,\"TEMPERATURE\":21.8,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707333693,"TEMPERATURE":21.8,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707333693
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 21.8
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)

Setting the target temperature to a few sets points, finally on 26 and then to 15, to see if any command queuing happens:

Captured log, however the value did not close, so I assume the 15 degrees was not set at this time.

@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707334283,"TEMPERATURE":21.8,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707334283,\"TEMPERATURE\":21.8,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707334283,"TEMPERATURE":21.8,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707334283
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 21.8
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)

Waited another 5 mins. Did not see no movement of the valve.

@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707334574,"TEMPERATURE":22.2,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707334574,\"TEMPERATURE\":22.2,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707334574,"TEMPERATURE":22.2,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707334574
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 22.2
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)

Set the target to 14 and waited another 5 mins. Finally the valve moved.

@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707334864,"TEMPERATURE":22.1,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707334864,\"TEMPERATURE\":22.1,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707334864,"TEMPERATURE":22.1,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707334864
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 22.1
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)
@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707333985,"TEMPERATURE":21.8,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707333985,\"TEMPERATURE\":21.8,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707333985,"TEMPERATURE":21.8,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707333985
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 21.8
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)

Few examples of the output logs:.

Don't seem to be able to see the commands in the logs when sending temperature set commands via the Energenie mihome gateway website.

@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707331935,"TEMPERATURE":21.9,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707329814,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707331935,\"TEMPERATURE\":21.9,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707329814,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707331935,"TEMPERATURE":21.9,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707329814,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707331935
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 21.9
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707329814
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)
@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707331638,"TEMPERATURE":22.0,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707329814,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707331638,\"TEMPERATURE\":22.0,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707329814,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707331638,"TEMPERATURE":22,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707329814,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707331638
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 22
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707329814
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)
Achronite commented 5 months ago

Looks like it has not managed to catch any gateway 'commands' yet. The timing is really tight; it has to try and capture 2 messages within ~20ms of each other. You should see a smaller set of parameters come back.

I would try recommend switching one of you MIHO005's to see if it captures those first, it'll look something like this:

mqtt-ener314rt http monitor received: {"deviceId":1881,"mfrId":4,"productId":2,"timestamp":1707335511,"_SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/1881/last_seen/state: 1707335511
mqtt-ener314rt verb < energenie/2/1881/_SWITCH_STATE/state: 1 (retained)

with the '_' in the name.

Once you mange that, it is just a case of retrying with the TRV...

genestealer commented 5 months ago

@Achronite

Switching a MIHO005 on and off fast, I can see the following, which does include the "_SWITCH_STATE" and I note a "openThings_cache_send".

image

@openThings_receive(): Returning: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337093,"REAL_POWER":186,"REACTIVE_POWER":-1,"VOLTAGE":247,"FREQUENCY":49.648438}
mqtt-energenie verb energenie received="{\"deviceId\":1215,\"mfrId\":4,\"productId\":1,\"timestamp\":1707337093,\"REAL_POWER\":186,\"REACTIVE_POWER\":-1,\"VOLTAGE\":247,\"FREQUENCY\":49.648438}"
mqtt-ener314rt http monitor received: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337093,"REAL_POWER":186,"REACTIVE_POWER":-1,"VOLTAGE":247,"FREQUENCY":49.648438,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/1/1215/last_seen/state: 1707337093
mqtt-ener314rt verb < energenie/1/1215/REAL_POWER/state: 186
mqtt-ener314rt verb < energenie/1/1215/REACTIVE_POWER/state: -1
mqtt-ener314rt verb < energenie/1/1215/VOLTAGE/state: 247
mqtt-ener314rt verb < energenie/1/1215/FREQUENCY/state: 49.648438
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337093,"_SWITCH_STATE":0}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337093,\"_SWITCH_STATE\":0}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337093,"_SWITCH_STATE":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337093
mqtt-ener314rt verb < energenie/2/5623/_SWITCH_STATE/state: 0 (retained)
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337094,"_SWITCH_STATE":0}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337094,\"_SWITCH_STATE\":0}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337094,"_SWITCH_STATE":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337094
mqtt-ener314rt verb < energenie/2/5623/_SWITCH_STATE/state: 0 (retained)
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337094,"REAL_POWER":2,"REACTIVE_POWER":0,"VOLTAGE":249,"FREQUENCY":49.800781,"SWITCH_STATE":0}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337094,\"REAL_POWER\":2,\"REACTIVE_POWER\":0,\"VOLTAGE\":249,\"FREQUENCY\":49.800781,\"SWITCH_STATE\":0}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337094,"REAL_POWER":2,"REACTIVE_POWER":0,"VOLTAGE":249,"FREQUENCY":49.800781,"SWITCH_STATE":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337094
mqtt-ener314rt verb < energenie/2/5623/REAL_POWER/state: 2
mqtt-ener314rt verb < energenie/2/5623/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/VOLTAGE/state: 249
mqtt-ener314rt verb < energenie/2/5623/FREQUENCY/state: 49.800781
mqtt-ener314rt verb < energenie/2/5623/switch/state: OFF
@openThings_receive(): Returning: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337098,"REAL_POWER":2,"REACTIVE_POWER":0,"VOLTAGE":249,"FREQUENCY":49.898438,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":6187,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337098,\"REAL_POWER\":2,\"REACTIVE_POWER\":0,\"VOLTAGE\":249,\"FREQUENCY\":49.898438,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337098,"REAL_POWER":2,"REACTIVE_POWER":0,"VOLTAGE":249,"FREQUENCY":49.898438,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/6187/last_seen/state: 1707337098
mqtt-ener314rt verb < energenie/2/6187/REAL_POWER/state: 2
mqtt-ener314rt verb < energenie/2/6187/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/VOLTAGE/state: 249
mqtt-ener314rt verb < energenie/2/6187/FREQUENCY/state: 49.898438
mqtt-ener314rt verb < energenie/2/6187/switch/state: ON
@openThings_receive(): Returning: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337103,"REAL_POWER":186,"REACTIVE_POWER":-1,"VOLTAGE":247,"FREQUENCY":49.648438}
mqtt-energenie verb energenie received="{\"deviceId\":1215,\"mfrId\":4,\"productId\":1,\"timestamp\":1707337103,\"REAL_POWER\":186,\"REACTIVE_POWER\":-1,\"VOLTAGE\":247,\"FREQUENCY\":49.648438}"
mqtt-ener314rt http monitor received: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337103,"REAL_POWER":186,"REACTIVE_POWER":-1,"VOLTAGE":247,"FREQUENCY":49.648438,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/1/1215/last_seen/state: 1707337103
mqtt-ener314rt verb < energenie/1/1215/REAL_POWER/state: 186
mqtt-ener314rt verb < energenie/1/1215/REACTIVE_POWER/state: -1
mqtt-ener314rt verb < energenie/1/1215/VOLTAGE/state: 247
mqtt-ener314rt verb < energenie/1/1215/FREQUENCY/state: 49.648438
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337104,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":248,"FREQUENCY":49.800781,"SWITCH_STATE":0}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337104,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":248,\"FREQUENCY\":49.800781,\"SWITCH_STATE\":0}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337104,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":248,"FREQUENCY":49.800781,"SWITCH_STATE":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337104
mqtt-ener314rt verb < energenie/2/5623/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/VOLTAGE/state: 248
mqtt-ener314rt verb < energenie/2/5623/FREQUENCY/state: 49.800781
mqtt-ener314rt verb < energenie/2/5623/switch/state: OFF
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337107,"_SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337107,\"_SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337107,"_SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337107
mqtt-ener314rt verb < energenie/2/5623/_SWITCH_STATE/state: 1 (retained)
@openThings_receive(): Returning: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337108,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":249,"FREQUENCY":49.898438,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":6187,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337108,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":249,\"FREQUENCY\":49.898438,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337108,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":249,"FREQUENCY":49.898438,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/6187/last_seen/state: 1707337108
mqtt-ener314rt verb < energenie/2/6187/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/VOLTAGE/state: 249
mqtt-ener314rt verb < energenie/2/6187/FREQUENCY/state: 49.898438
mqtt-ener314rt verb < energenie/2/6187/switch/state: ON
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337109,"_SWITCH_STATE":0}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337109,\"_SWITCH_STATE\":0}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337109,"_SWITCH_STATE":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337109
mqtt-ener314rt verb < energenie/2/5623/_SWITCH_STATE/state: 0 (retained)
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337109,"SWITCH_STATE":0}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337109,\"SWITCH_STATE\":0}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337109,"SWITCH_STATE":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337109
mqtt-ener314rt verb < energenie/2/5623/switch/state: OFF
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337111,"_SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337111,\"_SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337111,"_SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337111
mqtt-ener314rt verb < energenie/2/5623/_SWITCH_STATE/state: 1 (retained)
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337113,"_SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337113,\"_SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337113,"_SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337113
mqtt-ener314rt verb < energenie/2/5623/_SWITCH_STATE/state: 1 (retained)
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337114,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":248,"FREQUENCY":49.851562,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337114,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":248,\"FREQUENCY\":49.851562,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337114,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":248,"FREQUENCY":49.851562,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337114
mqtt-ener314rt verb < energenie/2/5623/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/VOLTAGE/state: 248
mqtt-ener314rt verb < energenie/2/5623/FREQUENCY/state: 49.851562
mqtt-ener314rt verb < energenie/2/5623/switch/state: ON
@openThings_receive(): Returning: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337118,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":247,"FREQUENCY":49.949219,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":6187,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337118,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":247,\"FREQUENCY\":49.949219,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337118,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":247,"FREQUENCY":49.949219,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/6187/last_seen/state: 1707337118
mqtt-ener314rt verb < energenie/2/6187/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/VOLTAGE/state: 247
mqtt-ener314rt verb < energenie/2/6187/FREQUENCY/state: 49.949219
mqtt-ener314rt verb < energenie/2/6187/switch/state: ON
@radio_send_payload(): 1 tx payloads
openThings_cache_send(): sent cached cmd 244:20 for device 5251
openThings_cache_send(): g_CachedCmds=1, g_PreCachedCmds=1, deviceId=5251, retries=3
eTRV_update()
openThings_receive(): Returning: {"deviceId":5251,"mfrId":4,"productId":3,"timestamp":1707337120,"TEMPERATURE":19.5,"command":244,"retries":3,"TARGET_TEMP":20.0}
mqtt-energenie verb energenie received="{\"deviceId\":5251,\"mfrId\":4,\"productId\":3,\"timestamp\":1707337120,\"TEMPERATURE\":19.5,\"command\":244,\"retries\":3,\"TARGET_TEMP\":20.0}"
mqtt-ener314rt http monitor received: {"deviceId":5251,"mfrId":4,"productId":3,"timestamp":1707337120,"TEMPERATURE":19.5,"command":244,"retries":3,"TARGET_TEMP":20,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/5251/last_seen/state: 1707337120
mqtt-ener314rt verb < energenie/3/5251/TEMPERATURE/state: 19.5
mqtt-ener314rt verb < energenie/3/5251/retries/state: 3
mqtt-ener314rt verb < energenie/3/5251/TARGET_TEMP/state: 20 (retained)
@openThings_receive(): Returning: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337123,"REAL_POWER":190,"REACTIVE_POWER":-1,"VOLTAGE":244,"FREQUENCY":49.648438}
mqtt-energenie verb energenie received="{\"deviceId\":1215,\"mfrId\":4,\"productId\":1,\"timestamp\":1707337123,\"REAL_POWER\":190,\"REACTIVE_POWER\":-1,\"VOLTAGE\":244,\"FREQUENCY\":49.648438}"
mqtt-ener314rt http monitor received: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337123,"REAL_POWER":190,"REACTIVE_POWER":-1,"VOLTAGE":244,"FREQUENCY":49.648438,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/1/1215/last_seen/state: 1707337123
mqtt-ener314rt verb < energenie/1/1215/REAL_POWER/state: 190
mqtt-ener314rt verb < energenie/1/1215/REACTIVE_POWER/state: -1
mqtt-ener314rt verb < energenie/1/1215/VOLTAGE/state: 244
mqtt-ener314rt verb < energenie/1/1215/FREQUENCY/state: 49.648438
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337124,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":245,"FREQUENCY":49.800781,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337124,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":245,\"FREQUENCY\":49.800781,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337124,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":245,"FREQUENCY":49.800781,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337124
mqtt-ener314rt verb < energenie/2/5623/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/VOLTAGE/state: 245
mqtt-ener314rt verb < energenie/2/5623/FREQUENCY/state: 49.800781
mqtt-ener314rt verb < energenie/2/5623/switch/state: ON
@eTRV_update()
openThings_receive(): Returning: {"deviceId":3233,"mfrId":4,"productId":3,"timestamp":1707337125,"TEMPERATURE":19.0,"command":0,"retries":0}
mqtt-energenie verb energenie received="{\"deviceId\":3233,\"mfrId\":4,\"productId\":3,\"timestamp\":1707337125,\"TEMPERATURE\":19.0,\"command\":0,\"retries\":0}"
mqtt-ener314rt http monitor received: {"deviceId":3233,"mfrId":4,"productId":3,"timestamp":1707337125,"TEMPERATURE":19,"command":0,"retries":0,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3233/last_seen/state: 1707337125
mqtt-ener314rt verb < energenie/3/3233/TEMPERATURE/state: 19
mqtt-ener314rt verb < energenie/3/3233/command/state: None
mqtt-ener314rt verb < energenie/3/3233/retries/state: 0
mqtt-ener314rt verb < energenie/3/3233/Maintenance/state: None
@openThings_receive(): Non-OT message, openThings_decode() returned 0
@openThings_receive(): Returning: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337128,"REAL_POWER":2,"REACTIVE_POWER":0,"VOLTAGE":245,"FREQUENCY":49.898438,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":6187,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337128,\"REAL_POWER\":2,\"REACTIVE_POWER\":0,\"VOLTAGE\":245,\"FREQUENCY\":49.898438,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337128,"REAL_POWER":2,"REACTIVE_POWER":0,"VOLTAGE":245,"FREQUENCY":49.898438,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/6187/last_seen/state: 1707337128
mqtt-ener314rt verb < energenie/2/6187/REAL_POWER/state: 2
mqtt-ener314rt verb < energenie/2/6187/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/VOLTAGE/state: 245
mqtt-ener314rt verb < energenie/2/6187/FREQUENCY/state: 49.898438
mqtt-ener314rt verb < energenie/2/6187/switch/state: ON
@openThings_receive(): Returning: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337132,"REAL_POWER":185,"REACTIVE_POWER":-1,"VOLTAGE":243,"FREQUENCY":49.648438}
mqtt-energenie verb energenie received="{\"deviceId\":1215,\"mfrId\":4,\"productId\":1,\"timestamp\":1707337132,\"REAL_POWER\":185,\"REACTIVE_POWER\":-1,\"VOLTAGE\":243,\"FREQUENCY\":49.648438}"
mqtt-ener314rt http monitor received: {"deviceId":1215,"mfrId":4,"productId":1,"timestamp":1707337132,"REAL_POWER":185,"REACTIVE_POWER":-1,"VOLTAGE":243,"FREQUENCY":49.648438,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/1/1215/last_seen/state: 1707337132
mqtt-ener314rt verb < energenie/1/1215/REAL_POWER/state: 185
mqtt-ener314rt verb < energenie/1/1215/REACTIVE_POWER/state: -1
mqtt-ener314rt verb < energenie/1/1215/VOLTAGE/state: 243
mqtt-ener314rt verb < energenie/1/1215/FREQUENCY/state: 49.648438
@openThings_receive(): Returning: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337134,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":244,"FREQUENCY":49.750000,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":5623,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337134,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":244,\"FREQUENCY\":49.750000,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":5623,"mfrId":4,"productId":2,"timestamp":1707337134,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":244,"FREQUENCY":49.75,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/5623/last_seen/state: 1707337134
mqtt-ener314rt verb < energenie/2/5623/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/5623/VOLTAGE/state: 244
mqtt-ener314rt verb < energenie/2/5623/FREQUENCY/state: 49.75
mqtt-ener314rt verb < energenie/2/5623/switch/state: ON
@openThings_receive(): Returning: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337138,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":245,"FREQUENCY":49.898438,"SWITCH_STATE":1}
mqtt-energenie verb energenie received="{\"deviceId\":6187,\"mfrId\":4,\"productId\":2,\"timestamp\":1707337138,\"REAL_POWER\":0,\"REACTIVE_POWER\":0,\"VOLTAGE\":245,\"FREQUENCY\":49.898438,\"SWITCH_STATE\":1}"
mqtt-ener314rt http monitor received: {"deviceId":6187,"mfrId":4,"productId":2,"timestamp":1707337138,"REAL_POWER":0,"REACTIVE_POWER":0,"VOLTAGE":245,"FREQUENCY":49.898438,"SWITCH_STATE":1,"cmd":"monitor"}
mqtt-ener314rt verb < energenie/2/6187/last_seen/state: 1707337138
mqtt-ener314rt verb < energenie/2/6187/REAL_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/REACTIVE_POWER/state: 0
mqtt-ener314rt verb < energenie/2/6187/VOLTAGE/state: 245
mqtt-ener314rt verb < energenie/2/6187/FREQUENCY/state: 49.898438
mqtt-ener314rt verb < energenie/2/6187/switch/state: ON

I think I may have captured it:

image

@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707336985,"TEMPERATURE":21.7,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707336985,\"TEMPERATURE\":21.7,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707336985,"TEMPERATURE":21.7,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707336985
mqtt-ener314rt verb < energenie/3/3449/TEMPERATURE/state: 21.7
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)
@eTRV_update()
openThings_receive(): Returning: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707336985,"_TEMPERATURE":6912,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":""}
mqtt-energenie verb energenie received="{\"deviceId\":3449,\"mfrId\":4,\"productId\":3,\"timestamp\":1707336985,\"_TEMPERATURE\":6912,\"command\":0,\"retries\":0,\"VOLTAGE\":3.06,\"VOLTAGE_TS\":1707333099,\"EXERCISE_VALVE\":\"success\",\"VALVE_TS\":1707327693,\"DIAGNOSTICS\":512,\"DIAGNOSTICS_TS\":1707327693,\"LOW_POWER_MODE\":false,\"ERRORS\":false,\"ERROR_TEXT\":\"\"}"
mqtt-ener314rt http monitor received: {"deviceId":3449,"mfrId":4,"productId":3,"timestamp":1707336985,"_TEMPERATURE":6912,"command":0,"retries":0,"VOLTAGE":3.06,"VOLTAGE_TS":1707333099,"EXERCISE_VALVE":"success","VALVE_TS":1707327693,"DIAGNOSTICS":512,"DIAGNOSTICS_TS":1707327693,"LOW_POWER_MODE":false,"ERRORS":false,"ERROR_TEXT":"","cmd":"monitor"}
mqtt-ener314rt verb < energenie/3/3449/last_seen/state: 1707336985
mqtt-ener314rt verb < energenie/3/3449/_TEMPERATURE/state: 6912 (retained)
mqtt-ener314rt verb < energenie/3/3449/command/state: None
mqtt-ener314rt verb < energenie/3/3449/retries/state: 0
mqtt-ener314rt verb < energenie/3/3449/Maintenance/state: None
mqtt-ener314rt verb < energenie/3/3449/battery/state: 95 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE/state: 3.06 (retained)
mqtt-ener314rt verb < energenie/3/3449/VOLTAGE_TS/state: 1707333099
mqtt-ener314rt verb < energenie/3/3449/EXERCISE_VALVE/state: success
mqtt-ener314rt verb < energenie/3/3449/VALVE_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS/state: 512
mqtt-ener314rt verb < energenie/3/3449/DIAGNOSTICS_TS/state: 1707327693
mqtt-ener314rt verb < energenie/3/3449/LOW_POWER_MODE/state: OFF (retained)
mqtt-ener314rt verb < energenie/3/3449/ERRORS/state: OFF
mqtt-ener314rt verb < energenie/3/3449/ERROR_TEXT/state:  (retained)
genestealer commented 5 months ago

@Achronite

So I have not no luck with catching the gateway commands, and their web interface is so bland it makes me think they have not thought about it. Instead relying on sending the maintenance "Exercise valve" and "Request voltage" commands at times of the day that are unlikely to coincide with a "Set Temperature" command (which would overwrite the maintenance command). I think this may be a dead-end.

Sooo, I was thinking, could we put some FIFO command stacking/queuing logic in?

I understand this may mean all the commands could take an age to send (due to the 10 retries for each command with 5+ mins or more between each one). But we do that the "cancel command" command to stop the queue if it's getting out of hand. Could even have priority system, so "Set Temperature" commands always take priority over other commands?

What do you think?

image

Achronite commented 5 months ago

I've bought a MiHome Gateway off eBay, so hopefully I'll be able to check this myself if I muster up the courage to plug it in! 😝

Achronite commented 4 months ago

I've written a sniffer for packets for the MiHome gateway, testing so far has revealed that for the eTRV multiple commands are not sent within the same message; it seems to queue them on the gateway as you suggest....

Waiting for 20 messages...
Decoding 20 messages...
6:3:3989:0 TEMPERATURE "id:"116(status),"datatype":1,"str":"","int":5376,"float":21.000000}
7:3:3989:0 UNKNOWN_0xa3 "id:"163(command),"datatype":1,"str":"","int":0,"float":21.000000}
Waiting for 20 messages...
Decoding 20 messages...
Waiting for 20 messages...
Decoding 20 messages...
0:3:3989:0 TEMPERATURE "id:"116(status),"datatype":1,"str":"","int":5376,"float":21.000000}
1:3:3989:0 BATTERY_LEVEL "id:"226(command),"datatype":1,"str":"","int":0,"float":21.000000}
3:3:3989:0 VOLTAGE "id:"118(status),"datatype":2,"str":"","int":783,"float":3.058594}
5:3:3989:0 DIAGNOSTICS "id:"38(status),"datatype":1,"str":"","int":512,"float":512.000000}
Waiting for 20 messages...

The 'commands' that seem to be accessible via the web and/or the app seem to be a subset to what is available in my code. I can't seem to find a way of:

  1. Changing the reporting period.
  2. Setting valve to 'always on'
  3. Setting valve to 'always off'
  4. Requesting diagnostics
  5. 'Identifying' valve
  6. Setting low power mode on/off

@genestealer Do you know any differently, am I missing some 'detailed settings' page?

genestealer commented 3 months ago

Hi @Achronite. Good to hear your research collaborates my findings.

Those are the only commands I am aware off. It's very limited and there is no way to fully open/close the value. I assume you tried the "request voltage" from the myhome webpage, which can only be commanded via a schedule.

Achronite commented 3 months ago

How about I address this by building an auto-command function into 'energenie-ener314rt' for the lesser used functions? This will work in a similar way to the auto-commands introduced for the thermostat to get the temperature.

So something like this in pseudo-code:

When a message is received from eTRV do
   If there is a command currently cached then
      send the cached message to eTRV
      decrement retries
      processMessage()
  else
      processMessage()
      If the elapsed time since last 'voltage' command has passed a threshold (1 hour?) then
          Set cached command to REQUEST_VOLTAGE and retries to something like 2
      else if the elapsed time since last 'exercise valve' command has passed a threshold (1 week?) then
          Set cached command to EXERCISE_VALVE and retries to 1
      endif
   endif
enddo

If a command is received from home assistant / other then
   replace the cached command with new one
endif

ProcessMessage() {
   if the message contains a VOLTAGE report then
      set last_voltage_ts to time()
   if the message contains a DIAGNOSTICS report containing the result of an EXERCISE_VALVE then
      set last_exercise_valve_ts to time()
}

@genestealer Are there any other commands that should be done in this way?

genestealer commented 3 months ago

Hi @Achronite

I would not like the code run EXERCISE_VALVE all by it's self, I have an automation to run this, at a very specific day and time, so as not to interfere with the normal running of things and avoiding all the house valves closing at the same time.

REQUEST_VOLTAGE only really needs to run once a day. I normally run my via automation at 3am.

I'm not sure about the pseudo-code, sorry.

I simplified it to just: Cached system of commands, if a new command comes in, queue them, but use a priority system to move the commands around in the queue, assigning different priorities. Sending a cancel command will clear the queue. E.G. Setting the valve state (open,closed, auto) will always be prioritized over setting the temperature setpoint.

Achronite commented 3 months ago

@genestealer I do agree that queuing would be the best solution, and I know it's something you keep coming back to; but it means a massive rewrite for me.

The code is currently optimised to reply to the eTRVs as quick as possible to hit their small receive window. It's design builds and encrypts the command messages ahead of time, when they are received (via MQTT). By the time it gets to sending a message to an eTRV, it does not know what it is sending.

If i get a few days to work on a full solution, It will probably be queue based; but whatever I do I need to preserve the optimisation; otherwise it won't work at all. What I'm proposing now is just an easier solution for me to implement.


EXERCISE VALVE: I have an automation to run this, at a very specific day and time, so as not to interfere with the normal running of things and avoiding all the house valves closing at the same time.

OK: I'll leave this out; and you'll have to deal with any potential overwrites by schedule.

REQUEST_VOLTAGE only really needs to run once a day. I normally run my via automation at 3am.

OK; I'll keep it to every this to every 12 hours, so at least you can remove your calls for this. The pseudocode basically says that it will only queue it if there is are NO outstanding commands; therefore it would never overwrite commands sent from HA.