A Proof of Concept of integration of Arduino as a item/parameter viewer for openHAB home automation

The design criteria of the module was

  1. Cheap stand alone viewer
  2. Built on arduino nano
  3. Accessible via lan/wan ethernet

Early version on acryl plastic
2014-09-09 21.15.18

Arduino Program

    1: /*
    2: openHAB viewer
    3:
    4: 2014-07-31  Initial verion
    5:
    6: /Martin Pålsson
    7: */
    8: #include <SPI.h>
    9: #include <Ethernet.h> //<Ethernet.h>
   10: //#include <UIPEthernet.h> //<Ethernet.h>
   11: #include <LiquidCrystal.h>
   12:
   13: int secRun = 0;
   14:
   15: EthernetClient client;
   16:
   17: //Define MAC adress and server IP
   18: byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
   19: char serverName[] = "192.168.1.4";
   20:
   21: //Define LCD
   22: LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
   23:
   24: void setup()
   25: {
   26:   Serial.begin(115200);
   27:  
   28:   //Initiate and Ethernet
   29:   if(Ethernet.begin(mac) == 0) { // start ethernet using mac & IP address
   30:     while(true)   // no point in carrying on, so stay in endless loop:
   31:       ;
   32:   }
   33:   delay(1000); // give the Ethernet shield a second to initialize
   34:   Serial.print("IP Address: ");
   35:   Serial.println(Ethernet.localIP());
   36:
   37:   // set up the LCD's number of columns and rows:
   38:   lcd.begin(16, 2);
   39:   lcd.print("openHAB viewer");
   40: }
   41:
   42: ///////////////
   43: // Main loop //
   44: ///////////////
   45: void loop()
   46: {
   47:   long indoor = getParameter("HA_INDOOR_TEMPERATURE");
   48:   long outdoor = getParameter("HA_OUTDOOR_TEMPERATURE");
   49:   long outdoorgarage = getParameter("HA_GARAGE_TEMPERATURE_GARAGE");
   50:   long ourdoorstorage = getParameter("HA_GARAGE_TEMPERATURE_STORAGE");
   51:   long ourdoorbicycle = getParameter("HA_GARAGE_TEMPERATURE_BICYCLE");
   52:
   53:   printLcdTxtVal(0, 0, "Utetemp  ", outdoor);
   54:  
   55:   for(int i=0; i<70; i++){
   56:     printLcdTxtVal(0, 1, "Innetemp ", indoor);
   57:     delay(1500);
   58:     printLcdTxtVal(0, 1, "Garage   ", outdoorgarage);
   59:     delay(1500);
   60:     printLcdTxtVal(0, 1, "Forrad   ", ourdoorstorage);
   61:     delay(1500);
   62:     printLcdTxtVal(0, 1, "Cykelfor ", ourdoorbicycle);
   63:     delay(1500);
   64:   }
   65: }
   66:
   67: void printLcdTxtVal(int col, int row, String text, long value){
   68:   lcd.setCursor(col, row);
   69:   lcd.print("                ");
   70:   lcd.setCursor(col, row);
   71:   lcd.print(text);
   72:   lcd.print(value);
   73:   lcd.print((char)223);
   74: }
   75:
   76: void printLcdValVal(int col, int row, long val1, long val2){
   77:   lcd.setCursor(col, row);
   78:   lcd.print("                ");
   79:   lcd.setCursor(col, row);
   80:   lcd.print(val1);
   81:   lcd.print((char)223);
   82:   lcd.print("/");
   83:   lcd.print(val2);
   84:   lcd.print((char)223);
   85: }
   86:
   87:
   88:
   89: //////////////////////////////////////////////////////////////////////////////////////////////////////////
   90: //////////////////////////////////////////////////////////////////////////////////////////////////////////
   91:
   92: //Init Ethernet
   93: void initEthernet(){
   94:
   95: }
   96:
   97: //Get data (long) from webserver
   98: // Format: http://192.168.1.4:8080/rest/items/HA_GARAGE_TEMPERATURE_STORAGE
   99:
  100: long getParameter(String parameter){
  101:   Serial.print("getParameter: ");
  102:   Serial.print(parameter);
  103:   Serial.print(" = ");  
  104:   long result = 0;
  105:   delay(500); //<------------------------- Test with delay
  106:   if (client.connect(serverName, 8080)>0) {
  107:     client.print("GET /rest/items/");
  108:     client.print(parameter);
  109:     client.println(" HTTP/1.0");  
  110:     client.println("User-Agent: Arduino/Ethernet Shield");
  111:     client.println("Connection: close");
  112:     client.println("");
  113:   }
  114:     delay(200);
  115:   if (client.connected()) {
  116:     if(client.find("<state>")){
  117:       result = client.parseInt();
  118:     }
  119:     client.stop();
  120:     delay(500);
  121:     Serial.println(result);
  122:     return result;
  123:   }
  124: }