First of all, without you guys @ScruffR @rickkas7 I would not be much of anywhere with my pellet grill smoker control program! Thank you for your help!
Here’s my solution based on your help!
in variables I declare:
const char *PUBLISH_PARAMETERS = "ParametersWrite";
const char *INITIAL_PARAMS_WRITE = "InitialParamsWrite";
const char *READ_PARAMETERS = "KEYParametersRead";
In Setup I declare subscribe and publish…
Particle.subscribe("hook-response/InitialParamsWrite", getKeyHandler, MY_DEVICES);
Particle.publish("spark/device/name", NULL, 60, PRIVATE);
Particle.subscribe("hook-response/KEYParametersRead", getDataHandler, MY_DEVICES);
Since there is no web request: PATCH, I had to first do an IntialParamsWrite to firebase with POST and I grab the firebase key in a webhook response:
{"name":"-M99sRhDVc6yyjc0eNAf"}
then I parse the response in my getkeyHandler to populate my key and postKey variables:
void getKeyHandler(const char *event, const char *data) {
JsonParserStatic<32, 60> keyParser;
keyParser.clear();
keyParser.addString(data);
if (!keyParser.parse()) {Log.warn("parsing of the Key web-hook response failed - failed to parse the params key\r\n"); return;}
String newKey;
if (!keyParser.getOuterValueByKey("name", newKey)) {Log.warn("failed to get the key from the webhook params \r\n"); return;}
strcpy(key, newKey);
}
Then when I WriteParameters, I use PUT and inject the controller{{n}} name and key{{k}} in the url string to basically overlay with my body parameters when they change so this single control record is updated from the photon and from my client Xamarin iOS/Android app.
{
"event": "ParametersWrite",
"url": "https://someappname.firebaseio.com/ControllerData/{{n}}/Parameters/{{k}}.json",
"requestType": "PUT",
"noDefaults": true,
"rejectUnauthorized": false,
"query": {
"auth": "someauthkeyblahblahblahWUbt3oVnfbB"
},
"body": "{\"ndex\":{{ndex}},\"Cyc\":{{Cyc}},\"PB\":{{PB}},\"PMode\":{{PMode}},\"PTog\":{{PTog}},\"Td\":{{Td}},\"Ti\":{{Ti}},\"fan\":{{fan}},\"ign\":{{ign}},\"aug\":{{aug}},\"pgm\":{{pgm}},\"mode\":\"{{mode}}\",\"target\":{{target}},\"u\":{{u}} }"
}
then when my ReadParameters web-hook fires I get the response with the nameless key.
{"-M99sRhDVc6yyjc0eNAf": "Cyc":60,"PB":60,"PMode":2,"PTog":0,"Td":45,"Ti":180,"aug":false,"fan":true,"ign":true,"key":"Pellet_Pirate_1","mode":"Start","ndex":1,"pgm":false,"target":200,"u":0.25}}
and I parse this with getDataHandler, using the key I got from my initial write:
void getDataHandler(const char *event, const char *data) {
JsonParserStatic<768, 60> parser1;
parser1.clear();
parser1.addString(data);
if (!parser1.parse()) {Log.warn("%s %.3f getDataHandler: Parameters read failed to parse\r\n", Time.timeStr().c_str(), getTimeWithMillis()); return;}
newCycle = parser1.getReference().key(key).key("Cyc").valueInt();
newPB = parser1.getReference().key(key).key("PB").valueInt();
newPMode = parser1.getReference().key(key).key("PMode").valueInt();
newPToggle = parser1.getReference().key(key).key("PTog").valueDouble();
newTd = parser1.getReference().key(key).key("Td").valueInt();
newTi = parser1.getReference().key(key).key("Ti").valueInt();
newaug = parser1.getReference().key(key).key("aug").valueBool();
newfan = parser1.getReference().key(key).key("fan").valueBool();
newign = parser1.getReference().key(key).key("ign").valueBool();
String strValue;
strValue = parser1.getReference().key(key).key("mode").valueString();
strcpy(newmode, strValue);
newpgm = parser1.getReference().key(key).key("pgm").valueBool();
newtarget = parser1.getReference().key(key).key("target").valueInt();
newu = parser1.getReference().key(key).key("u").valueInt();
}
now just fine tuning the code… thanks again for the help! i hope this helps someone else with their integrations! Carpe Diem!