oleolsonfablab
Published © GPL3+

Smart Smokes

Alexa-enabled smoke, flame alarm with emergency lighting.

IntermediateFull instructions provided8 hours3,340
Smart Smokes

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×2
Arduino UNO
Arduino UNO
×1
Temperature Sensor
Temperature Sensor
×2
4Pcs NRF24L01+ Wireless Module with Voltage Regulating Breakout Adapter
×3
IR Flame Sensor Module Detector Smartsense For Temperature Detecting Compatible With Arduino by Atomic Market
×2
SUKRAGRAHA Smoke Detector Board Module MQ-2 for Arduino Genuino System
×2
Active Piezo Buzzer Module - SunFounder DC 3.3-5V Low Level Trigger Magnetic Beep Alarm Sensor Module Electronic for Arduino and Raspberry Pi
×2
40mm x 60mm prototyping board
×2
Jumper wires (generic)
Jumper wires (generic)
×1
Electronix Express- Hook up Wire Kit (Solid Wire Kit) 22 Gage (25 Feet)
×1
Solder Wire Sn63 Pb37 with Rosin Core for Electrical Soldering 50g (0.8 mm) by TAMINGTON
×1
Adafruit 12 RGB LED Neopixel Rin
×1
Male and Female Header 1x40 2.54mm 40 Pin Straight Single Row headers PCB Through Hole 40 pin header for breadboards, arduino projects, shields and connectors by Tinker Express (20 Pcs 10m/10f)
×1
Eowpower 210Pcs M2.5 304 Stainless Steel Hex Socket Head Cap Screws Nuts Assortment Kit
×1
drill bit (roughly 5/64 or 2mm)
×1

Software apps and online services

Alexa Skills Kit
Amazon Alexa Alexa Skills Kit

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
3D Printer (generic)
3D Printer (generic)
Electric Drill

Story

Read more

Custom parts and enclosures

Smoke Top STL

This is the mounting plate for all the sensors.

Smoke Body

This is the body of the alarm.

Smoke Base

This is the Base of the alarm.

Schematics

Base Station Schematic

This is how you wire the nRF24L01 radio to the Arduino Uno to create the base station for the smart smokes.

Smart Smokes Schematics

This is the breadboard diagram of the smart smoke alarms.

Code

SerialChooser.py

Python
This is the Python 3/Flask-Ask program that you use to connect your Raspberry Pi to the base station and Alexa to the Raspberry Pi.
import tkinter as tk
import tkinter.ttk as ttk
import serial.tools.list_ports
import serial as Cheerios
import time


import logging
import os

from flask import Flask
from flask_ask import Ask, request, session, question, statement, convert_errors

app = Flask(__name__)
ask = Ask(app, "/")

logging.getLogger('flask_ask').setLevel(logging.DEBUG)

# --- functions ---

@ask.intent('EmergencyLightsOn')
def emergencyLightsOn():
    ser.flushInput()
    msg=40
    msgst=str(msg).encode()
    print(msgst)
    ser.write(msgst)
    return statement("Emergency lights on.")

@ask.intent('EmergencyLightsOff')
def emeregencyLightsOff():
    ser.flushInput()
    msg=50
    msgst=str(msg).encode()
    ser.write(msgst)
    return statement("Emergency lights off.")
@ask.intent('SilenceAlarm',convert={'node' : int} )
def silenceAlarm(node):
    ser.flushInput()
    msg=30 + node
    msgst=str(msg).encode()
    ser.write(msgst)
    return statement("Node {} has been silenced".format(node))

@ask.intent('GetStatus')
def getStatus():
    ser.flushInput()
    speech_text=""
    counter=0
    nodeAlarmList=[[False, False], [False, False], [False, False], [False, False]]  #(smoke, flame)
                   
    for i in range(0, 10):    #collect a sample from the smokes and store in list
        status=ser.readline().strip()
        status=status.decode('ascii')
        
        if status:
            nodeNumber=int(status[3])
            if status[:3]=='777':   #reporting smoke/gas
                nodeAlarmList[nodeNumber][0]=True
            if status[:3]=='888':   #reporting flame
                nodeAlarmList[nodeNumber][1]=True
    for t in nodeAlarmList:
        
        if (t[0] and t[1]):
            speech_text += " Node" + str(counter) + " is reporting a flame and smoke or dangerous gases,"
        elif t[0]:
            speech_text += " Node" + str(counter) + " is reporting smoke or dangerous gases."
        elif t[1]:
            speech_text += " Node" + str(counter) + " is reporting a flame."
        counter=counter+1
    if (speech_text):
        return statement(speech_text)
    else:
        speech_text = "No alarms reported"
        return statement(speech_text)
    

@ask.intent('TestBuzzer', convert={'node' : int})
def testBuzz(node):
    ser.flushInput()
    if node is None:
        return question("Please repeat your request and make sure you  specify a node.")
    msg=20 + node
    msgst=str(msg).encode()
    ser.write(msgst)
    return statement("Buzzer Test Done on node {}".format(node))

@ask.intent('Hello')
def hello_world():
    speech_text = 'Hello, welcome to Smart Smokes'
    return statement(speech_text)

@ask.intent('GetTemp', convert={'node' : int})
def getTemp(node):
    ser.flushInput()
    msg= 10 + node
    msgst=str(msg).encode()
    ser.write(msgst)
    time.sleep(2)
    temp=ser.readline().strip()
    if temp:
        speech_text= "The temperature on node {} is ".format(node) + str(temp.decode('ascii')) + "Degrees farenheit"
        return statement(speech_text)

@ask.launch
def launch():
    speech_text = 'Hello, Welcome to Smart Smokes'
    return statement(speech_text)


def serial_ports():
    portVar1=serial.tools.list_ports.comports()
    MenuList = []
    for x in range(len(portVar1)):
        MenuList.append(portVar1[x].device)
    return MenuList
    

def on_select_port(event=None):
     portVar = PortSelect.get()
     global ser
     ser=serial.Serial(portVar, timeout=.5) 
     

def on_start_flask_ask(event=None):
     if __name__ == '__main__':
        if 'ASK_VERIFY_REQUESTS' in os.environ:
            verify = str(os.environ.get('ASK_VERIFY_REQUESTS', '')).lower()
            if verify == 'false':
                app.config['ASK_VERIFY_REQUESTS'] = False
        app.run()
        
    

# --- main ---

root = tk.Tk()
root.title("Smart Smokes")
           
mainframe = ttk.Frame(root, padding='1i')
mainframe.grid(column=5, row=5)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

StartFlask = ttk.Button(mainframe, text= "Start Flask", command=on_start_flask_ask)
StartFlask.grid(column=2, row=2)
           
PortSelect = ttk.Combobox(mainframe, values=serial_ports())
PortSelect.grid(column=2, row=1)

PortSelect.bind('<<ComboboxSelected>>', on_select_port)


                    
root.mainloop()
           

                

SmartSmokesBase

Arduino
Upload this Arduino Sketch to the Base Station.
//Radio Setup

#include <SPI.h> //Call SPI library so you can communicate with the nRF24L01+
#include <nRF24L01.h> //nRF2401 libarary found at https://github.com/tmrh20/RF24/
#include <RF24.h> //nRF2401 libarary found at https://github.com/tmrh20/RF24/

const int pinCE = 7; //This pin is used to set the nRF24 to standby (0) or active mode (1)
const int pinCSN = 8; //This pin is used to tell the nRF24 whether the SPI communication is a command or message to send out
RF24 radio(pinCE, pinCSN); // Declare object from nRF24 library (Create your wireless SPI)

//Create up to 6 pipe addresses P0 - P5;  the "LL" is for LongLong type
const uint64_t rAddress[] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL, 0xB3B4B5B60FLL, 0xB3B4B5B605LL };

byte daNumber = 0; //The number that the transmitters are trying to guess
char receivedChar;
boolean newData = false;
void setup()   
{
  
  Serial.begin(9600);  //start serial to communication
  
  
  radio.begin();  //Start the nRF24 module

  radio.setPALevel(RF24_PA_LOW);  // "short range setting" - increase if you want more range AND have a good power supply
  radio.setChannel(108);          // the higher channels tend to be more "open"

  // Open up to six pipes for PRX to receive data
  radio.openReadingPipe(0,rAddress[0]);
  radio.openReadingPipe(1,rAddress[1]);
  radio.openReadingPipe(2,rAddress[2]);
  radio.openReadingPipe(3,rAddress[3]);
  radio.openReadingPipe(4,rAddress[4]);
  radio.openReadingPipe(5,rAddress[5]);
  
  radio.startListening();                 // Start listening for messages
}

void loop()  
{   
   byte pipeNum = 0; //variable to hold which reading pipe sent data
    int16_t msg; //used to store payload from transmit module


 //This part of the program listens for incoming alerts from the Smart SMokes Tx
    while(radio.available(&pipeNum)){ //Check if received data
     radio.read( &msg, sizeof(msg) ); //read one byte of data and store it in gotByte variable
     
     
     switch (msg)
    {
      case 1:
        Serial.print(777); //cue for fire alarm
        Serial.println(pipeNum + 1); //print which pipe or transmitter this is from

        break;
      case 2:
        Serial.print(888); //cue for flame alarm
        Serial.println(pipeNum + 1); //print which pipe or transmitter this is from
        break;
    }
                        }  

//This part of the code listens for a serial command.  If one is available it sends to smokes and waits for appropriate response
int outMsg;


  if (Serial.available() >0 ){

      outMsg = Serial.parseInt();
      //Serial.println(outMsg);
      int Buzz=2; 
      int Temp=1;
      int Silence=3;
      int Lights=4;
      int LightsOff=5;
      
      switch(outMsg){

        case 11:     //Get Temp from node 1
          radio.stopListening();
          radio.openWritingPipe(rAddress[0]);
          radio.write(&Temp, sizeof(Temp));

          Serial.println(recieveTemp());  // send temp value back to python
      
          break;
          
        case 12:    // Get temp from node 2
          radio.stopListening();
          radio.openWritingPipe(rAddress[1]);
          radio.write(&Temp, sizeof(Temp));

          Serial.println(recieveTemp());  // send temp value back to python
      
          break;
        
        case 13:    //Get temp from node 3
           radio.stopListening();
          radio.openWritingPipe(rAddress[2]);
          radio.write(&Temp, sizeof(Temp));

          Serial.println(recieveTemp());  // send temp value back to python
      
          break;
        
        case 21:  //test buzzer on node 1
            
            radio.stopListening();
            radio.openWritingPipe(rAddress[0]);
            radio.write(&Buzz, sizeof(Buzz));
            radio.startListening();
            break; 
            
        case 22:  //test buzzer on node 2
            
            radio.stopListening();
            radio.openWritingPipe(rAddress[1]);
            radio.write(&Buzz, sizeof(Buzz));
            radio.startListening();
            break;
            
        case 23:  //test buzzer on node 3
            
            radio.stopListening();
            radio.openWritingPipe(rAddress[2]);
            radio.write(&Buzz, sizeof(Buzz));
            radio.startListening();
            break;
            
         case 31: //silence alarm on Node 1
            radio.stopListening();
            radio.openWritingPipe(rAddress[0]);
            radio.write(&Silence, sizeof(Silence));
            radio.startListening();
            break;
            
         case 32: //silence alarm on Node 2
            radio.stopListening();
            radio.openWritingPipe(rAddress[1]);
            radio.write(&Silence, sizeof(Silence));
            radio.startListening();
            break;
            
         case 33: //silence alarm on Node 3
            radio.stopListening();
            radio.openWritingPipe(rAddress[2]);
            radio.write(&Silence, sizeof(Silence));
            radio.startListening();
            break;  
            
         case 40:  //turn on emergency lights
            radio.stopListening();
            radio.openWritingPipe(rAddress[0]);
            radio.write(&Lights, sizeof(Lights));
            radio.openWritingPipe(rAddress[1]);
            radio.write(&Lights, sizeof(Lights));
            radio.openWritingPipe(rAddress[2]);
            radio.write(&Lights, sizeof(Lights));
            radio.startListening();
            break;
         
         case 50:  //turn off emergency lights
            radio.stopListening();
            radio.openWritingPipe(rAddress[0]);
            radio.write(&LightsOff, sizeof(LightsOff));
            radio.openWritingPipe(rAddress[1]);
            radio.write(&LightsOff, sizeof(LightsOff));
            radio.openWritingPipe(rAddress[2]);
            radio.write(&LightsOff, sizeof(LightsOff));
            radio.startListening();
            break;
            
         default:

            Serial.println(999);   //error code
           }
          
      }
      

  }



          
int recieveTemp(){
    int temp;
    unsigned long started_waiting_at = millis();
    bool timeout = false;
    radio.startListening();
    started_waiting_at = millis();
    timeout = false;
    while ( ! radio.available() && ! timeout ){
      if (millis() - started_waiting_at > 5000 ){
          timeout = true;}}
            // Describe the results
             if ( timeout )
                 {
                     temp=0;
                 }
               else
                  {
                    radio.read( &temp, sizeof(temp) );
                  }
     return temp;
}

void recvOneChar() {
 if (Serial.available() > 0) {
 receivedChar = Serial.read();
 newData = true;
 }
}

void showNewData() {
 if (newData == true) {
 Serial.print("This just in ... ");
 Serial.println(receivedChar);
 newData = false;
 }
}

SmartSmokesTx

Arduino
This is the Arduino sketch you upload to each of the smokes. Don't forget to edit the "WHICH_NODE" parameter to correspond to your smoke.
//Each Smart Smoke Uses the same code below.  Just change the WHich_Node to a unique number between 1 and 6


#include <elapsedMillis.h>  //use for timer on alarm silencing feature

elapsedMillis sinceSilence;


//Set up the NRF24**************************

  #include <SPI.h>
  #include <RF24_config.h>
  #include <printf.h>
  #include <nRF24L01.h>
  #include <RF24.h>

  const int pinCE = 7; //This pin is used to set the nRF24 to standby (0) or active mode (1)
  const int pinCSN = 8; //This pin is used to tell the nRF24 whether the SPI communication is a command or message to send out
  
  RF24 radio(pinCE, pinCSN); // Create your nRF24 object or wireless SPI connection

  #define WHICH_NODE 1     // must be a number from 1 - 6 identifying the PTX node

  const uint64_t wAddress[] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL, 0xB3B4B5B60FLL, 0xB3B4B5B605LL};
  const uint64_t PTXpipe = wAddress[ WHICH_NODE - 1 ];   // Pulls the address from the above array for this node's pipe
  byte counter = 1; //used to count the packets sent
  bool done = false; //used to know when to stop sending packets



//Sensor Pin Variables
  int tempsensorPin = A0; //the analog pin the TMP36's Vout (sense) pin is connected to
                        //the resolution is 10 mV / degree centigrade with a
                        //500 mV offset to allow for negative temperatures
 
  int buzzer = 2;//the pin of the active buzzer

  int gasPin = A1; //smoke alarm pin

  int flamePin = 5;

  boolean silenceAlarm = false;
  boolean emergencyLightsOn=false;
  
//setup flame sensor


//setup Neopixel 12 on pin 6
  #include <Adafruit_NeoPixel.h>
  #define NeoPIN            6
  #define NUMPIXELS      16
  Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, NeoPIN, NEO_GRB + NEO_KHZ800);


//setup Alarm variables


boolean warmedUp=false;


void setup()
{
  
  //Radio Initialize
  
  radio.begin();            //Start the nRF24 module
  radio.setPALevel(RF24_PA_HIGH);  // "short range setting" - increase if you want more range AND have a good power supply
  radio.setChannel(108);          // the higher channels tend to be more "open"
  radio.openReadingPipe(0,PTXpipe);  //open reading or receive pipe
  radio.stopListening(); //go into transmit mode



  //Initialize Serial 
  
  Serial.begin(9600);  //Start the serial connection with the computer
     
                      //to view the result open the serial monitor 
                      
  //INitialize Sensors
                       
  pinMode(buzzer,OUTPUT);//initialize the buzzer pin as an output
  digitalWrite(buzzer,HIGH);  //High is silent on the buzzer
  pinMode(gasPin, INPUT);//Smoke alarm Initialze
  pinMode(flamePin, INPUT); //Flame alarm initialize
   strip.begin(); // This initializes the NeoPixel library.
   strip.show();

   
}
 
void loop(){

if (warmedUp){//This won't let the loop start until the heating element is up temp, which is judged by the analog read.




if (emergencyLightsOn){
   colorWipe(strip.Color(127, 127, 127), 50); // White;
     strip.show();
}
else {
  colorWipe(strip.Color(0, 0, 0), 50); // lights off
  strip.show();
}


if (silenceAlarm and (sinceSilence > 60000)) {//allows alexa to silence the alarm for 60 seconds even if an alarm is being detected
  silenceAlarm = false;
}

//request from base station section
radio.startListening();  //wait for a request from the base station
if (radio.available()){  //if a request is available call handleRequest() function
   handleRequest();}
   
//alarm detecting section

if ((smokeAlarm() or flameAlarm())){  //if the Tx detects any alarm AND the alrm is not silenced, start buzzing, send signal to base and turn on red lights
  if (!silenceAlarm){//condtion the buzzer on the alarm NOT being silenced
    makeBuzz();}
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  sendAlarm();
}
else{
  silenceBuzz();
  if (!emergencyLightsOn){colorWipe(strip.Color(0, 0, 0), 50); // lights off
  strip.show();}
  else {
     colorWipe(strip.Color(127, 127, 127), 50); // White;
     strip.show();
  }

}
}
else {
  warmupSmoke();

  makeBuzz();  
  warmedUp=true;}
  
}
   








void sendAlarm(){
  int msg;
  radio.stopListening(); //go into transmit mode
  radio.openWritingPipe(PTXpipe); //open writing or transmit pipe 

  if (smokeAlarm()){
    msg = 1;
    radio.write( &msg, sizeof(msg));

   }

  if(flameAlarm()){
    msg = 2;
    radio.write( &msg, sizeof(msg));
  }
    

}

void handleRequest(){
    int request;
    
    while (radio.available()) {                          // While there is data ready
        radio.read(&request, sizeof(request) );             // Get the payload
      }
        int temp;

     switch (request)
      { 
        case 1:                                           //1 is a temperature request
         temp = (int) getTemp();
          Serial.println(temp);
          radio.stopListening(); //go into transmit mode
          radio.openWritingPipe(PTXpipe);   //open writing or transmit pipe 
          radio.write(&temp, sizeof(temp));
          break;
        
        case 2:                                           //2 is a buzzer test
          for (int i=0; i <=20000; i++){
          makeBuzz();}
          break;

        case 3:
  
          silenceAlarm=true;
          sinceSilence=0;
          silenceBuzz();
          break;
          
        case 4:
          emergencyLightsOn=true;
          Serial.println(emergencyLightsOn);
          break;
          
        case 5:
          
           emergencyLightsOn=false;
            Serial.println(emergencyLightsOn);
           break;
          

      }
          
   
  }

  


void warmupSmoke(){

  while (smokeAlarm()){
      theaterChase(strip.Color(0, 0, 127), 50); // Blue
  }
}

  
float getTemp()
{
   //getting the voltage reading from the temperature sensor
 int reading = analogRead(tempsensorPin);  

 
 // converting that reading to voltage, for 3.3v arduino use 3.3
 float voltage = reading * 4.27;
 voltage /= 1024.0; 
 

 
 // now print out the temperature
 float temperatureC = (voltage - 0.5) * 100 ;  //converting from 10 mv per degree wit 500 mV offset
                                               //to degrees ((voltage - 500mV) times 100)
 //Serial.print(temperatureC); Serial.println(" degrees C");
 
 // now convert to Fahrenheit
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 //Serial.print(temperatureF); Serial.println(" degrees F");
 
 return temperatureF;
 
}

void makeBuzz()
{

digitalWrite(buzzer,LOW);

}

void silenceBuzz(){

  digitalWrite(buzzer, HIGH);
}
  
boolean smokeAlarm()
{
 if (analogRead(gasPin)> 250){
  return true;
}
else {
  return false;
}
}

//NeoPixelFunctions

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

boolean flameAlarm()
{
  int Flame = digitalRead(flamePin);

  if (Flame==LOW){
    return true;
  }
  else{
    return false;
  }
  
  
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

void fullWhite() {
  
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
  }

Interaction Model

JSON
Drag and drop this file into the Alexa Skill as described in the tutorial.
{
  "languageModel": {
    "intents": [
      {
        "name": "AMAZON.CancelIntent",
        "samples": []
      },
      {
        "name": "AMAZON.HelpIntent",
        "samples": []
      },
      {
        "name": "AMAZON.StopIntent",
        "samples": []
      },
      {
        "name": "EmergencyLightsOff",
        "samples": [
          "turn off emergency light",
          "turn off the light",
          "shut off the emergency lighting",
          "turn off the lights",
          "shut off the light",
          "turn off the emergency light",
          "shut off the emergency light"
        ],
        "slots": []
      },
      {
        "name": "EmergencyLightsOn",
        "samples": [
          "turn on the lights",
          "turn on the emergency lights",
          "turn on all the lights"
        ],
        "slots": []
      },
      {
        "name": "GetStatus",
        "samples": [
          "which alarm is going off",
          "which alarm is that",
          "what is the status of the alarms",
          "what is the status",
          "which alarm is buzzing",
          "what alarm is buzzing",
          "are there any alarms buzzing",
          "are there any alarm",
          "is there any flames",
          "is there any smoke",
          "are any alarms going off",
          "tell me what is happening",
          "tell me what's happening"
        ],
        "slots": []
      },
      {
        "name": "GetTemp",
        "samples": [
          "what's the temperature on node {node}",
          "what is the temperature on node {node}",
          "give me the temperature on node {node}",
          "how is the temperature on node {node}",
          "tell me the temperature on  node {node}",
          "read the temperature on node {node}",
          "for the temperature on node {node}",
          "for the temperature on alarm {node}",
          "what's the temperature on alarm {node}",
          "what is the temperature on alarm {node}",
          "give me the temperature on alarm {node}"
        ],
        "slots": [
          {
            "name": "node",
            "type": "AMAZON.NUMBER"
          }
        ]
      },
      {
        "name": "Hello",
        "samples": [
          "Hello",
          "Hey",
          "Tell smart smokes I said hello",
          "tell smart smokes hello"
        ],
        "slots": []
      },
      {
        "name": "SilenceAlarm",
        "samples": [
          "Silence node {node}",
          "Stop the alarm on node {node}",
          "tell node {node} to be quiet",
          "tell alarm {node} that I'm just cooking",
          "silence alarm {node}",
          "stop alarm {node}"
        ],
        "slots": [
          {
            "name": "node",
            "type": "AMAZON.NUMBER"
          }
        ]
      },
      {
        "name": "TestBuzzer",
        "samples": [
          "test the buzzer on {node}",
          "buzz {node}",
          "try the buzzer on {node}",
          "test {node} alarm",
          "try the alarm on {node}",
          "test the buzzer on alarm {node}",
          "try the buzzer on alarm {node}"
        ],
        "slots": [
          {
            "name": "node",
            "type": "AMAZON.NUMBER"
          }
        ]
      }
    ],
    "invocationName": "smart smokes"
  }
}

Credits

oleolsonfablab

oleolsonfablab

1 project • 0 followers

Comments