www.homeseer.com    
 

Go Back   HomeSeer Message Board > Analog & Digital IO Device Plug-ins > Analog & Digital IO Discussion > Arduino Plugin (3P)

Arduino Plugin (3P) Discussions related to the Arduion plugin for HS3 by enigmatheatre

Reply
 
Thread Tools Display Modes
  #1  
Old December 8th, 2017, 09:46 PM
csmith's Avatar
csmith csmith is offline
Seer Plus
 
Join Date: Mar 2002
Location: Waukesha, WI
Posts: 103
NodeMcu - Servo and OneWire?

Just bought the plugin and loving it! But, I really need to use wireless.

Are there plans to add servo and One Wire support for NodeMcu?

If not, has anybody managed to get NodeMcu working with some version of these?
Reply With Quote
  #2  
Old December 9th, 2017, 09:40 AM
bdraper's Avatar
bdraper bdraper is offline
Seer Master
 
Join Date: Feb 2005
Location: White House, TN
Posts: 1,150
I have a NodeMCU working with OneWire.

I bought two to test with, one on the board and the other one to use in the field. We are using one now to monitor my gas water heater. This unit has 4 OneWire temperature sensors hanging off the NodeMCU. One temp sensor for each water line (hot and cold), the other two sensors monitor temperature from the top and bottom of the unit. The unit also has a LED on it that I flash off an on so it is a visual indication that it working. I have not had any issue with the unit since it was deployed for testing. The unit uses the plugin API to function. If you are interested, I could provide some screenshots and the Arduino code.
__________________
Billy
Reply With Quote
  #3  
Old December 9th, 2017, 07:08 PM
csmith's Avatar
csmith csmith is offline
Seer Plus
 
Join Date: Mar 2002
Location: Waukesha, WI
Posts: 103
Quote:
Originally Posted by bdraper View Post
I have a NodeMCU working with OneWire.

I bought two to test with, one on the board and the other one to use in the field. We are using one now to monitor my gas water heater. This unit has 4 OneWire temperature sensors hanging off the NodeMCU. One temp sensor for each water line (hot and cold), the other two sensors monitor temperature from the top and bottom of the unit. The unit also has a LED on it that I flash off an on so it is a visual indication that it working. I have not had any issue with the unit since it was deployed for testing. The unit uses the plugin API to function. If you are interested, I could provide some screenshots and the Arduino code.
I'd really appreciate it if you could post the code and screenshots. It would give ne a good leg-up on the project. Thanks!
Reply With Quote
  #4  
Old December 9th, 2017, 08:53 PM
bdraper's Avatar
bdraper bdraper is offline
Seer Master
 
Join Date: Feb 2005
Location: White House, TN
Posts: 1,150
Sure no problem, let me know if you have any questions.

This is a screenshot of the devices.
Name:  arduino2.jpg
Views: 195
Size:  33.5 KB

This is a screenshot of the plugin setup.

Name:  arduino1.JPG
Views: 195
Size:  71.5 KB


This is the sketch, I changed the SSI, password field and removed the IP addresses.

Code:
/*************************************************************
 *Arduino to Homeseer 3 Plugin API written by Enigma Theatre.*
 * V1.0.0.140                                                *
 *                                                           *
 *************************************************************/
int FromHS[50];                                              
boolean IsConnected = false;                                 
//************************************************************


//**************Declare your variables here******************* 

#include <OneWire.h>
#include <DallasTemperature.h>

/********************************************************************/
// Data wire is plugged into a pin on the Arduino
#define v_one_wire_bus_5 5    // NodeMCU D1 the number of the pin
#define v_one_wire_bus_2 2    // NodeMCU D4 the number of the pin
#define v_one_wire_bus_14 14  // NodeMCU D5 the number of the pin
#define v_one_wire_bus_12 12  // NodeMCU D6 the number of the pin

/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices  
// (not just Maxim/Dallas temperature ICs) 
OneWire oneWire_5(v_one_wire_bus_5);
OneWire oneWire_2(v_one_wire_bus_2);
OneWire oneWire_14(v_one_wire_bus_14);
OneWire oneWire_12(v_one_wire_bus_12);

/********************************************************************/
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature v_sensors_5(&oneWire_5);
DallasTemperature v_sensors_2(&oneWire_2);
DallasTemperature v_sensors_14(&oneWire_14);
DallasTemperature v_sensors_12(&oneWire_12);

float v_current_fahrenheit_5 = 0;
float v_current_fahrenheit_2 = 0;
float v_current_fahrenheit_14 = 0;
float v_current_fahrenheit_12 = 0;

float v_last_fahrenheit_5 = 0;
float v_last_fahrenheit_2 = 0;
float v_last_fahrenheit_14 = 0;
float v_last_fahrenheit_12 = 0;

// constants won't change. Used here to set a pin number:
const int v_ledPin_13 =  13;            // NodeMCU D7 the number of the pin
int v_ledState_13 = LOW;                // v_ledState used to set the LED
int v_ledValue_13 = 0;                  // v_ledValue used to send to HomeSeer

// constants won't change. Used here to set a pin number:
const int v_ledPin_15 =  15;            // NodeMCU D8 the number of the pin
int v_ledState_15 = LOW;                // v_ledState used to set the LED
int v_ledValue_15 = 0;                  // v_ledValue recieved from HomeSeer

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;       // will store last time LED was updated

// constants do not change:
const long interval = 5000;             // interval at which to blink (milliseconds) 5 seconds

/********************************************************************/ 


//****************************************************************


void HSSetup() {
  
  //************************
  //Add YOUR SETUP HERE;
  //************************

  pinMode(v_ledPin_13, OUTPUT); // set the digital pin as output:
  pinMode(v_ledPin_15, OUTPUT); // set the digital pin as output:

  // start serial port
  Serial.begin(9600);
  Serial.println("Temperature Display");

  // Start up the library
  v_sensors_5.begin();
  v_sensors_2.begin();
  v_sensors_14.begin();
  v_sensors_12.begin();
}

void HSloop() {
               
    //************************
    //Add YOUR CODE HERE;
    //************************
    /* To Send Data to Homeseer use SendToHS(Device,Value)
     Eg.. SendToHS(1,200); where 1 is the API device in homeseer and 200 is the value to send
     To Recieve data from Homeseer look up the FromHS array that is updated when the device value changes.
     Eg.. FromHS[5] would be the data from API Output device 5
     All code that is located just below this block will execute regardless of connection status!
     You can include SendToHS() calls, however when there isn't an active connection, it will just return and continue.
     If you only want code to execute when HomeSeer is connected, put it inside the if statement below.
     */

    /*Execute regardless of connection status*/

 if (IsConnected == true) {
   /*Execute ONLY when HomeSeer is connected*/

   Serial.print("LED is: " );     
   Serial.println(FromHS[0]); 

   v_ledValue_15 = FromHS[0];

   // Find value of LED:
   if (v_ledValue_15 == 255) {
     v_ledState_15 = HIGH;
   } else {
     v_ledState_15 = LOW;
   }
   digitalWrite(v_ledPin_15, v_ledState_15);   // set the LED with the ledState of the variable:

   // check to see if it's time to blink the LED; that is, if the difference
   // between the current time and last time you blinked the LED is bigger than
   // the interval at which you want to blink the LED.
   unsigned long currentMillis = millis();

   if (currentMillis - previousMillis >= interval) {
     // save the last time you blinked the LED
     previousMillis = currentMillis;

     // if the LED is off turn it on and vice-versa:
     if (v_ledState_13 == LOW) {
       v_ledState_13 = HIGH;
       v_ledValue_13 = 100;
     } else {
       v_ledState_13 = LOW;
       v_ledValue_13 = 0;
     }
     digitalWrite(v_ledPin_13, v_ledState_13);   // set the LED with the ledState of the variable:
     SendToHS(5,v_ledValue_13);
     
     v_sensors_5.requestTemperatures(); // Send the command to get temperature readings
     v_sensors_2.requestTemperatures(); // Send the command to get temperature readings
     v_sensors_14.requestTemperatures(); // Send the command to get temperature readings
     v_sensors_12.requestTemperatures(); // Send the command to get temperature readings
     /********************************************************************/
     v_current_fahrenheit_5 = v_sensors_5.getTempCByIndex(0)* 1.8 + 32.0;
     v_current_fahrenheit_2 = v_sensors_2.getTempCByIndex(0)* 1.8 + 32.0;
     v_current_fahrenheit_14 = v_sensors_14.getTempCByIndex(0)* 1.8 + 32.0;
     v_current_fahrenheit_12 = v_sensors_12.getTempCByIndex(0)* 1.8 + 32.0;

     if (v_current_fahrenheit_5 != v_last_fahrenheit_5){
        Serial.print("Temperature 5 is: ");
        Serial.println(v_current_fahrenheit_5); 
        SendToHS(1,v_current_fahrenheit_5);
        v_last_fahrenheit_5 = v_current_fahrenheit_5;
      }
     if (v_current_fahrenheit_2 != v_last_fahrenheit_2){
        Serial.print("Temperature 2 is: ");
        Serial.println(v_current_fahrenheit_2); 
        SendToHS(2,v_current_fahrenheit_2);
        v_last_fahrenheit_2 = v_current_fahrenheit_2;
      }
     if (v_current_fahrenheit_14 != v_last_fahrenheit_14){
        Serial.print("Temperature 14 is: ");
        Serial.println(v_current_fahrenheit_14); 
        SendToHS(3,v_current_fahrenheit_14);
        v_last_fahrenheit_14 = v_current_fahrenheit_14;
      }      
     if (v_current_fahrenheit_12 != v_last_fahrenheit_12){
        Serial.print("Temperature 12 is: ");
        Serial.println(v_current_fahrenheit_12); 
        SendToHS(4,v_current_fahrenheit_12);
        v_last_fahrenheit_12 = v_current_fahrenheit_12;
      }      
    }
  }
}


//************Do not change anything after Here*****************
 
#define ISIP 1
#define BoardType 3
const byte BoardAdd = 5;

#include <EEPROM.h>

#if BoardType == 3
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
char ssid[] = "SSID";
char pass[] = "PASS";
#else
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#endif


#if ISIP == 1


byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x05};
IPAddress ip(123,123,123,123);     //IP entered In HS config.
const unsigned int localPort = 1234;      //port entered In HS config.
IPAddress HomeseerIP(123,123,123,123); //Homeseer IP address
IPAddress ServerIP(EEPROM.read(2),EEPROM.read(3),EEPROM.read(4),EEPROM.read(5));
IPAddress gateway(123,123,123,123);
IPAddress subnet(255,255,255,0);
byte EEpromVersion = EEPROM.read(250);
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];              
const unsigned int ServerPort = 8888; 
#endif

                                        
                           

#if BoardType == 3
WiFiUDP Udp;
WiFiUDP SendPort;
#else
EthernetUDP Udp;
#endif

#if BoardType == 3
void resetFunc() {
  ESP.restart();
}
#else
void(* resetFunc) (void) = 0;
#endif




































char* Version = "API1.0.0.140";

byte Byte1, Byte2, Byte3;
unsigned int Byte4, Byte5;


void setup() {

#if BoardType == 3
 // WiFi.persistent(false);
  EEPROM.begin(256);
  EEpromVersion = EEPROM.read(250);
#endif

#if ISIP == 1
    if (EEpromVersion!=22) {
    ServerIP=HomeseerIP;
    EEPROM.write(2,ServerIP[0]);
    EEPROM.write(3,ServerIP[1]);
    EEPROM.write(4,ServerIP[2]);
    EEPROM.write(5,ServerIP[3]);
    EEPROM.write(250,22); //Store the version where the eeprom data layout was last changed
    EEpromVersion=22;
  }
#if BoardType == 3
  //Serial.begin(115200);
  WiFi.begin(ssid, pass);
  WiFi.config(ip, gateway, subnet);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
#else
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
#endif
  Udp.begin(localPort);
  Udp.setTimeout(0);
  delay(1000);
SendConnect();
#else
  Serial.begin(115200);
  Serial.flush();
  Serial.setTimeout(0);
  delay(1000);
  Serial.print("Connect ");
  Serial.println(BoardAdd);
#endif

  IsConnected = false;
HSSetup();
}


void loop(){
  HSloop();
#if ISIP == 1
  UDPCheck();
#endif
}


void SendConnect()
{
#if ISIP == 0
  Serial.print("Connect ");
  Serial.println(BoardAdd);
#else
    Udp.beginPacket(HomeseerIP,ServerPort);  //First send a connect packet to the dynamic IP stored in eeprom
    Udp.print("Connect ");
    Udp.print(BoardAdd);
    Udp.endPacket();
    if (ServerIP!=HomeseerIP) {
      Udp.beginPacket(HomeseerIP,ServerPort);  //Then if the stored value doesn't match the pre-specified one, send a connect packet there also
      Udp.print("Connect ");
      Udp.print(BoardAdd);
      Udp.endPacket();
    }
 
#endif
}



#if ISIP == 1
void UDPCheck(){
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    
 #if BoardType == 3
    IPAddress remote = Udp.remoteIP();
    Byte1 = Udp.parseInt();
    Udp.read();
    Byte2 = Udp.read();
    Udp.read();
    Byte3 = Udp.parseInt();
    Udp.read();
    Byte4 = Udp.parseInt();
    Udp.read();
    Byte5 = Udp.parseInt();
    DataEvent();
    #else

   ServerIP = Udp.remoteIP();
    Byte1 = Udp.parseInt();
    Udp.read();
    Byte2 = Udp.read();
    Byte3 = Udp.parseInt();;
    Byte4 = Udp.parseInt();
    Byte5 = Udp.parseInt();;

    DataEvent();
#endif
  }
}

#else
void serialEvent() {
  while (Serial.available() > 0) {
    delay(17);


    Byte1 = Serial.parseInt();
    Serial.read();  
    Byte2 = Serial.read(); 
    Byte3 = Serial.parseInt();
    Byte4 = Serial.parseInt();
    Byte5 = Serial.parseInt();
    DataEvent();
  }
}
#endif


/*

Used Data Input Cases
D Disconnect
r reset
K Keepalive
O PinMode Output Set
d Input debounce time set
C Connect request
c Connection established - report current status
*/
void DataEvent() {

  if (Byte1 == BoardAdd) {

#if ISIP == 1
      if (Udp.remoteIP() != ServerIP) {
        ServerIP=Udp.remoteIP();
        EEPROM.write(2,ServerIP[0]);
        EEPROM.write(3,ServerIP[1]);
        EEPROM.write(4,ServerIP[2]);
        EEPROM.write(5,ServerIP[3]);
      }     
#endif

    switch (Byte2) {
    case 'c':
      IsConnected = true;
      break;

    case 'C':   
#if ISIP == 1
      Udp.beginPacket(HomeseerIP, ServerPort);
      Udp.print("Version ");
      Udp.print(BoardAdd);
      Udp.print(" ");
      Udp.print(Version);
      Udp.println(" HS3");
      Udp.endPacket();

      Udp.beginPacket(HomeseerIP, ServerPort);
      delay(100);
      Udp.print("Connected ");
      Udp.println(BoardAdd);
      Udp.endPacket();
#else
      Serial.print("Version ");
      Serial.print(BoardAdd);
      Serial.print(" ");
      Serial.print(Version);
      Serial.println(" HS3"); 
      delay(100);
      Serial.print("Connected ");
      Serial.println(BoardAdd);
#endif
      delay(100);
      IsConnected = false;
      break;

    case 'K':
      delay(200);
#if ISIP == 1
      Udp.beginPacket(HomeseerIP, ServerPort);
      Udp.print("Alive ");
      Udp.println(BoardAdd);
      Udp.endPacket();
      if (Udp.remoteIP() != ServerIP) {
        ServerIP=Udp.remoteIP();
        EEPROM.write(2,ServerIP[0]);
        EEPROM.write(3,ServerIP[1]);
        EEPROM.write(4,ServerIP[2]);
        EEPROM.write(5,ServerIP[3]);
      }     
#else     
      Serial.print("Alive ");
      Serial.println(BoardAdd);
#endif
      break; 
      
      case 'r':
      delay(200);
      resetFunc();  //call reset
      break; 

    case 'O':
      FromHS[Byte3] = Byte4;
      break; 

    case 'D':
      IsConnected = false;
      break;   
    }
  }
}

void SendToHS(byte Device, long Data){
if (IsConnected == true) {
#if ISIP == 1
  Udp.beginPacket(HomeseerIP, ServerPort);
  Udp.print(BoardAdd);
  Udp.print(" API ");
  Udp.print(Device);
  Udp.print(" ");
  Udp.print(Data);
  Udp.endPacket();
#else
  Serial.print(BoardAdd);
  Serial.print(" API ");
  Serial.print(Device);
  Serial.print(" ");
  Serial.println(Data);
#endif
}
}

void SendToHS(byte Device, int Data){
if (IsConnected == true) {
#if ISIP == 1
  Udp.beginPacket(HomeseerIP, ServerPort);
  Udp.print(BoardAdd);
  Udp.print(" API ");
  Udp.print(Device);
  Udp.print(" ");
  Udp.print(Data);
  Udp.endPacket();
#else
  Serial.print(BoardAdd);
  Serial.print(" API ");
  Serial.print(Device);
  Serial.print(" ");
  Serial.println(Data);
#endif
}
}

void SendToHS(byte Device, float Data){
if (IsConnected == true) {
#if ISIP == 1
  Udp.beginPacket(HomeseerIP, ServerPort);
  Udp.print(BoardAdd);
  Udp.print(" API ");
  Udp.print(Device);
  Udp.print(" ");
  Udp.print(Data);
  Udp.endPacket();
#else
  Serial.print(BoardAdd);
  Serial.print(" API ");
  Serial.print(Device);
  Serial.print(" ");
  Serial.println(Data);
#endif
}
}

void SendToHS(byte Device, double Data){
if (IsConnected == true) {
#if ISIP == 1
  Udp.beginPacket(HomeseerIP, ServerPort);
  Udp.print(BoardAdd);
  Udp.print(" API ");
  Udp.print(Device);
  Udp.print(" ");
  Udp.print(Data);
  Udp.endPacket();
#else
  Serial.print(BoardAdd);
  Serial.print(" API ");
  Serial.print(Device);
  Serial.print(" ");
  Serial.println(Data);
#endif
}
}
Reply With Quote
  #5  
Old December 10th, 2017, 09:45 AM
csmith's Avatar
csmith csmith is offline
Seer Plus
 
Join Date: Mar 2002
Location: Waukesha, WI
Posts: 103
Quote:
Originally Posted by bdraper View Post
Sure no problem, let me know if you have any questions.
Really helpful. Your example cleared things up. Thanks so much.
Reply With Quote
  #6  
Old December 10th, 2017, 09:51 AM
bdraper's Avatar
bdraper bdraper is offline
Seer Master
 
Join Date: Feb 2005
Location: White House, TN
Posts: 1,150
Anytime, glad to help.
Reply With Quote
  #7  
Old April 3rd, 2018, 11:16 AM
thestosh's Avatar
thestosh thestosh is offline
Seer
 
Join Date: Oct 2017
Location: USA
Posts: 8
Quote:
Originally Posted by bdraper View Post
Anytime, glad to help.
bdraper,
Would you mind posting some pictures of the hardware side of your setup?
Are you connecting the NodeMCU to an Arduino board or using it as an Arduino board?
Sorry for the newbie question. I'm just getting back into this world and dusting off my old Arduino boards and home automation setup. Only bumped into NodeMCU today.
What temperature sensors did you use and are they holding up fine?
How did you thermally couple them to the pipes and water heater?
Thanks for sharing.
Reply With Quote
  #8  
Old April 3rd, 2018, 05:23 PM
bdraper's Avatar
bdraper bdraper is offline
Seer Master
 
Join Date: Feb 2005
Location: White House, TN
Posts: 1,150
Quote:
Originally Posted by thestosh View Post
bdraper,
Would you mind posting some pictures of the hardware side of your setup?
Are you connecting the NodeMCU to an Arduino board or using it as an Arduino board?
Sorry for the newbie question. I'm just getting back into this world and dusting off my old Arduino boards and home automation setup. Only bumped into NodeMCU today.
What temperature sensors did you use and are they holding up fine?
How did you thermally couple them to the pipes and water heater?
Thanks for sharing.
Sure, no problem. These are pictures of the NodeMCU unit on our water heater. I have the breadboard and NodeMCU in a clear tupperware container with holes for the probes, but took it out for the picture. Also included is a picture of the temperature probe connected to the hot water line. I usually put a dab of CPU grease but have not been able to tell much of a difference without it. In this instance, the probe is connected with a metal hose clamp (hot water line). I have connected these probes to things with zip ties... In this instance, the probe connected to the cold water line is attached with a couple of zip ties.

NodeMCU out of the container
Name:  NodeMCU.jpg
Views: 76
Size:  60.0 KB

Probe connected to hot water line
Name:  temp_waterline.jpg
Views: 76
Size:  38.3 KB

Hope this helps.
Reply With Quote
  #9  
Old April 4th, 2018, 12:32 AM
thestosh's Avatar
thestosh thestosh is offline
Seer
 
Join Date: Oct 2017
Location: USA
Posts: 8
Thanks so much for the hardware pics. A picture is worth a thousand words, right?
Reply With Quote
  #10  
Old April 4th, 2018, 08:44 AM
bdraper's Avatar
bdraper bdraper is offline
Seer Master
 
Join Date: Feb 2005
Location: White House, TN
Posts: 1,150
Quote:
Originally Posted by thestosh View Post
Thanks so much for the hardware pics. A picture is worth a thousand words, right?
Not a problem, I agree, a picture is worth a thousand words.
Reply With Quote
Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Feature request : Servo limit tfoutfou Arduino Plugin (3P) 2 January 14th, 2017 09:41 AM
Servo jitter Marnix Ongena Arduino Plugin (3P) 2 January 3rd, 2017 06:41 AM
Control continous rotation servo? dannieboiz Arduino Plugin (3P) 0 August 9th, 2016 09:25 PM
servo jitter Daggy67 Arduino Plugin (3P) 0 November 28th, 2014 06:36 AM
Servo thermostat control zoomkat General Home Automation Hardware Discussion 3 March 7th, 2005 08:40 PM


All times are GMT -4. The time now is 10:59 AM.


Copyright HomeSeer Technologies, LLC