Elektriska Imp postlåda anmälningar (3 / 3 steg)
Steg 3: Steg 3: koden
Som vi har sett alla mekaniska frågor ;-) Låt oss dyka in i programvaran.
För att testa det lite mer, har jag lagt en tempsensor (tmp36) för att övervaka temperaturen varje 15 min och rapportera det på en levande graf med hjälp av Xively.
I några få ord är enheten i viloläge hela tiden, varje 15 min det vaknar upp, skickar temperatur till Xively, skickar ett email och går för att sova igen.
Om jag har mail, vaknar det upp på grund av externa avbrottet (pin 1 bara!), skickar mig ett mail och ett SMS.
En led är det bara för debug syfte.
I alla meddelanden jag fått från det har jag också lagt Batteriövervakning.
Source Code:
Agent:
TempBug exempel Agent koden < br >
/ * GLOBALS och konstanter---* /
CONST XIVELY_API_KEY = "blablabla";
CONST XIVELY_FEED_ID = "blablabla";
CONST XIVELYCHANNEL = "temperatur".
Xively <-{}; Detta gör en "namespace
/ * KLASS OCH GLOBALA FUNKTIONSDEFINITIONER---*
/ Xively "bibliotek". Se < en href = "https://github.com/electricimp/reference/tree/master/webservices/xively" rel = "nofollow" > https://github.com/electricimp/reference/tree/mas...</a>
klass Xively.Client {
ApiKey = null;
utlösare = [];
constructor(apiKey) {
Detta. ApiKey = apiKey;
}
/*****************************************
* metod: sätta
* IN:
* flöde: en XivelyFeed vi driver till
* ApiKey: Din Xively API-nyckel
* UT:
* HttpResponse föremål från Xively
* 200 och ingen kropp är framgång
*****************************************/
funktion Put(feed) {
lokala url = "https://api.xively.com/v2/feeds/" + foder. FeedID + ".json";
lokala headers = {"X-ApiKey": ApiKey, "Content-Type": "application/json", "User-Agent": "Xively-Imp-Lib/1.0"};
lokala begäran = http.put (url, headers, foder. ToJson());
återvända request.sendsync();
}
/*****************************************
* metod: få
* IN:
* flöde: en XivelyFeed vi fulling från
* ApiKey: Din Xively API-nyckel
* UT:
* En uppdaterad XivelyFeed objekt på framgång
* null på fel
*****************************************/
funktion Get(feed) {
lokala url = "https://api.xively.com/v2/feeds/" + foder. FeedID + ".json";
lokala headers = {"X-ApiKey": ApiKey, "User-Agent": "xively-Imp-Lib/1.0"};
lokala begäran = http.get (url, headers);
lokala svar = request.sendsync();
om (response.statuscode! = 200) {
Server.log ("fel vid sändning av meddelande:" + response.body);
returnera null;
}
lokal kanal = http.jsondecode(response.body);
för (lokala jag = 0; jag < channel.datastreams.len(); i ++)
{
för (lokala j = 0; j < foder. Channels.len(); j ++)
{
om (channel.datastreams[i].id == foder. Channels[j].ID)
{
foder. Kanaler [j] .current_value = channel.datastreams[i].current_value;
bryta;
}
}
}
returnera foder.
}
}
klass Xively.Feed {
FeedID = null;
Kanaler = null;
konstruktören (feedID, kanaler)
{
Detta. FeedID = feedID;
Detta. Kanaler = kanaler;
}
funktion GetFeedID() {return FeedID;}
funktion ToJson()
{
lokala json = "{\"datastreams\ ": [";
för (lokala jag = 0; jag < detta. Channels.len(); i ++)
{
JSON += detta. Kanaler [i]. ToJson();
om (jag < detta. Channels.len() - 1) json += ",";
}
JSON += "]}";
returnera json;
}
}
klass Xively.Channel {
ID = null;
Current_value = null;
constructor(_id)
{
This.ID = _id;
}
funktion Set(value) {
This.Current_value = värde;
}
funktionen get () {
återvända this.current_value;
}
funktion ToJson() {
återgå http.jsonencode ({id = this.id, current_value = this.current_value});
}
}
funktion postToXively(data,id) {
xivelyChannel <-Xively.Channel(XIVELYCHANNEL+id);
xivelyChannel.Set(data);
xivelyFeed <-Xively.Feed (XIVELY_FEED_ID, [xivelyChannel]);
lokala resp = xivelyClient.Put(xivelyFeed);
Server.log ("postat till Xively:"+ data +", fick följande kod:"+ resp.statuscode+", msg:" + resp.body);
}
/ * REGISTRERA ENHETEN CALLBACKS---* /
Device.on ("data", function(datapoint) {
postToXively (datapoint.temp, datapoint.id);
});
/ * REGISTRERA HTTP-HANTERAREN---*
Den här agenten behöver inte en HTTP-hanteraren
/ * RUNTIME BÖRJAR HÄR---* /
Server.log ("TempBug Agent körs");
initiera vår Xively kund
xivelyClient <-Xively.Client(XIVELY_API_KEY);
xivelyChannel <-Xively.Channel("temperature");
funktion mailgun (ämne, meddelande)
{
lokala from = "brevlåda
lokal till = "titi
lokala apikey = "nyckel-blablbabla";
lokala domän = "blablabla.mailgun.org";
lokala begäran = http.post ("https://api:" + apikey + "+ domän +" / meddelanden", {" Content-Type ":" application/x-www-formuläret-urlencoded "},"from ="+ från +" & till = "+ till +" & betvingar = "+ ämne +" & text = "+ meddelande);
lokala svar = request.sendsync();
Server.log ("Mailgun svar:" + response.body);
}
funktionen sendEmail (spänning, tmp)
{
mailgun ("Elektriska Imp", "övervakning \nTension Batterie"+ spänning +"Température" + tmp);
http.get ("https://smsapi.free-mobile.fr/sendmsg?user=blablabla & pass = blablabla & msg = Vous % 20Avez % 20Du % 20Courrier! %0 D", {}) .sendsync();
}
funktion sendSMS (spänning, temp)
{
mailgun ("Elektriska Imp", "Courrier Reçu! ;-) \n");
http.get ("https://smsapi.free-mobile.fr/sendmsg?user=blablabla & pass = blablabla & msg = Y' en % 20Du % 20Courrier! %0 D "+" Batt = "+ spänning +" V T = "+ temp +"° C", {}) .sendsync();
}
Device.on ("SMS", sendSMS);
Device.on ("post", function(datapoint2) {
sendEmail (datapoint2.voltage, datapoint2.tmp);
});
Device.on ("SMS", function(listeInfo) {
sendSMS (listeInfo.voltage, listeInfo.tmp);
});
Enhet:
Alias GPIO pin som "knappen" < br > knappen <-hardware.pin1;
ledde <-hardware.pin9;
LED.configure(DIGITAL_OUT);
LED2 <-hardware.pin8;
LED2.configure(DIGITAL_OUT);
tmp36 <-hardware.pin7;
tmp36.configure(ANALOG_IN);
doorStatus <-hardware.pin2;
doorStatus.configure(DIGITAL_IN_PULLDOWN);
global variabel att spåra aktuella status LED stift
etat < - 0;
inställd initialvärde LED stift (0 = av, 1 = på)
LED.write(etat);
funktion boucle()
{
lokala Vout = tmp36.read();
lokala tmp = ((3.3*Vout/65535)-0.5)*100;
lokala spänning = hardware.voltage();
lokala datapoint2 = {
"spänning": spänning,
"tmp": tmp
}
agent.send("mail",datapoint2);
lokalt id = hardware.getdeviceid();
lokala datapoint = {
"id": id,
"temp": tmp
}
agent.send("data",Datapoint);
lokala rssi = imp.rssi();
agent.send ("post", rssi);
lokal i.
för (jag = 0; jag < 10; i ++)
{
LED.write(0); Ange nytt värde för LED stift
IMP.Sleep(0.05);
LED.write(1); Ange nytt värde för LED stift
IMP.Sleep(0.05);
Knappen är släppt
Server.log("release");
}
IMP.deepsleepfor(10);
Server.log("press");
IMP.deepsleepfor(900);
}
funktion buttonPress()
{
IMP.ONIDLE (agent.send("SMS","toto"))
lokala Vin = hardware.voltage();
}
lokala onlyOne = 0;
funktionen Main () {
lokala statedoorStatus = doorStatus.read();
om (statedoorStatus == 0)
{
Boucle();
} annat {
om (onlyOne == 0)
{
lokala Vout = tmp36.read();
lokala tmp = ((3.3*Vout/65535)-0.5)*100;
lokala spänning = hardware.voltage();
lokala listeInfo = {
"spänning": spänning,
"tmp": tmp
}
agent.send("SMS",listeInfo);
onlyOne = 1;
}
lokal i.
för (jag = 0; jag < 10; i ++)
{
LED.write(0); Ange nytt värde för LED stift
IMP.Sleep(0.1);
LED.write(1); Ange nytt värde för LED stift
IMP.Sleep(0.1);
}
}
IMP.wakeup (0,001, huvudsakliga);
}
Button.configure(DIGITAL_IN_WAKEUP,buttonPress);
Main ();