gw.request - how is it done?
-
Hejda,
I'm trying to get my power meter sensor running. The final piece that is missing is the
feature to get the last known value from domoticz. In theory it should be something like:gw.begin(incomingMessage, NODE_ID, true);
gw.present(CHILD_ID, V_VAR1);And after that I should be able to retrieve the value by using:
gw.request(CHILD_ID, V_VAR1);
I'd have to provide the routine for incoming of course:
void incomingMessage(const MyMessage &message){}
But this routine is never ever entered.
Now, has anyone here a code example for me which successfully requests a variable
from the domoticz server?
I have of course tried the examples from MySensors but without success.I'm using Domoticz 2.3488 beta on a RaspberryPi and MySensors 1.5.
So far I had just hard coded the value for the energy meter counter at the time of startup into my
firmware and hoped I would never have to reboot.
But today I had a power failure and I'm back to my problem again. And I'd reeeeeaally like to get this
solvedThanks for any help!
Christoph
-
Can't help much when we don't see the Domoticz/GW/Node logs.
Does the req-message reach Domoticz? Is it issuing an answer?
-
@hek said:
Can't help much when we don't see the Domoticz/GW/Node logs.
Does the req-message reach Domoticz? Is it issuing an answer?
Where do I have to look for those logs? All I'm aware of is the log tab in
the setup page of my Domoticz server homepage. But I don't get any
details there, just which sensor sent anything at all:
2015-10-29 20:41:52.312 Hardware Monitor: Fetching data (System sensors)
2015-10-29 20:42:04.279 (Pyramid) Temp (Temp_Dach_Fien)
2015-10-29 20:42:06.155 (Pyramid) Temp (TempTest_03)
2015-10-29 20:42:06.173 (Pyramid) Temp (BattVoltage)and so on.
So, where are thos logs You mentioned?
Oh, and I had another power failure today. It was my wife's flat iron
Thanks,
Christoph
-
Hook up the sensor to Arduino IDE and look in serial monitor.
-
Okay. Did that already, of course.
Let's start from something known. I've used the demo code for
the EnergyMeterPulseSensor Example. All I changed is the Node_ID
(to 123). Did this in:gw.begin(incomingMessage, NODE_ID, false);
And I am sending a demo value to V_VAR1:
gw.send(pcMsg.set(123456));
This does get sent obviously. In the Domoticz.db file I can find that value
in the "MySensorsVar" table. After having sent the value I remove this line.And this is what I get (b.t.w.: how do I decipher those messages? This is
not the format that is used in the MySensors SerialProtocol document):send: 123-123-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5
send: 123-123-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
sensor started, id=123, parent=0, distance=1
send: 123-123-0-0 s=255,c=3,t=11,pt=0,l=12,sg=0,st=ok:Energy Meter
send: 123-123-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0
send: 123-123-0-0 s=0,c=0,t=13,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
read: 12-13-0 s=0,c=1,t=1,pt=7,l=5,sg=0:46.6
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:
send: 123-123-0-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok:and so on.
Some of this I understand (I think). What about the lonesome "read" line?
As I already wrote: it doesn't look like the routine...void incomingMessage(const MyMessage &message)
... is ever entered.
What else can I tell You?
Christoph
-
Ok, guess you have to ask someone over at Domoticz forum if it even supports REQ/VARx.
-
Okay, will do.
But apart from that: really nobody here with Domoticz who successfully worked with
"request"? Can't believe that...Thanks,
Christoph
-
Hi,
this is my workaround for my problem:
Ive added a 1F goldcap capacitor as an emergency power supply.
If my powersupply voltage drops a routine is called which stores
the current counter value via gw.setState() and then enters an
endless loop. And an LED is switched on to empty the capacitor.
Next time the sensor boots up, first thing it'll do is to retrieve the
old value for the pulsecount from the EEPROM.With this I can use the setstate function in case it's necessary
but I don't have to write to the EEPROM continuously which
wouldn't work for long (100k write cycle limit).It's probably not failsafe. For example: what happens if there
are multiple reboots because the brownout watchdog "barks"
and the final power cut happens while the EEPROM is written to?But for now it seems to work. Dah!
Christoph
-
Interesting workaround!
Could you please share your sketch?
-
I have made a sketch requesting VVAR1 from Domoticz. It didnt work with the stable version but better with the beta.
But as i wrote in this post im still having issues with getting the request back: http://forum.mysensors.org/topic/2116/hard-to-grab-time-and-value-sent-from-controllerThe sketch is in the link, but its a rain gauge.
-
@Mediacj sure. It's not cleaned up. And a hack of various sources.
I guess You won't mind
EnergyMeterPulseSensorGrace.inoThe fun stuff happens in the void graceful() routine.
First of all You'll have to run this line once to set Your startup value:
pulseCount = ((1912810 * PULSE_FACTOR / 10) + 5) / 10; graceful();After that You can comment this out and hopefully won't ever need it again
With the next booting of the sensor the value will be read from the EEPROM:pulseCount = 0;
pulseCount += gw.loadState(GRACE + 3); // get highest byte
pulseCount *= 256;
pulseCount += gw.loadState(GRACE + 2);
pulseCount *= 256;
(and so on).If the pre-voltage-regulator voltage drops the gold cap will still hold enough power
to save the current value to the EEPROM.Still. I'd much prefer the software solution ...
Christoph
-
@sundberg84 I'll have a look at that.
I've just tried the TimeAwareSensor example mentioned and it doesn't work.
But I DO get some reads, as far as I could see I got them from those
sensors that are repeater enabled.
But NEVER anything from "GW". WHat's it's address anyway?Christoph
-
You guessed it:
pulseCount = ((1912810 * PULSE_FACTOR / 10) + 5) / 10; graceful();
You don't use the number 1912810 of course: that's just my kWh at the time I started, MULTIPLYED BY 100!Christoph
-
Thanks for sharing!!
Yes it would be better to have a stable software solution but your solution is good also and even safer when there is a power failure!
-
Gizmocuz has a working sketch example
I have successfully used it.