Initial SpejsNode code

master
informatic 2016-06-29 17:00:22 +02:00
parent 007181dbad
commit 5499270903
6 changed files with 193 additions and 91 deletions

View File

@ -11,6 +11,8 @@
#define MQTT_PORT 1883
#endif
#define TOPIC_PREFIX "iot/"
#define BTN_PIN 0
#define LED_PIN 2

View File

@ -7,22 +7,16 @@ def on_connect(client, userdata, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("light/status")
client.subscribe("#")
client.publish("main/status/penisy", "dupa")
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(str(time.time())+" "+msg.topic+" "+str(msg.payload))
print('%d %-20s %s' % (time.time(), msg.topic, msg.payload))
client = mqtt.Client("test-client-%d" % random.randint(100, 999))
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()

79
spejsiot/SpejsNode.cpp Normal file
View File

@ -0,0 +1,79 @@
#include <SpejsNode.h>
void SpejsNode::init() {
deviceID = WifiStation.getMAC().substring(6, 12);
Serial.begin(115200);
Serial.systemDebugOutput(false); // Debug output to serial
Serial.print("*** SpejsNode init, running on: ");
Serial.println(deviceID);
WifiStation.config(WIFI_SSID, WIFI_PWD);
WifiStation.enable(true);
WifiAccessPoint.enable(false);
WifiStation.waitConnection(
ConnectionDelegate(&SpejsNode::onConnected, this),
20, *[] {
Serial.println("Connection failed");
});
}
void SpejsNode::keepAliveHandler() {
if(mqtt.getConnectionState() != eTCS_Connected) {
Serial.println("Reconnecting");
onConnected();
}
}
void SpejsNode::onConnected() {
Serial.println("Connection successful");
// "+deviceID+"/
mqtt.setWill(TOPIC_PREFIX + deviceID + "/state", "offline", 1, true);
mqtt.connect("iot-" + deviceID);
mqtt.subscribe(TOPIC_PREFIX + deviceID + "/control");
for(unsigned int i = 0 ; i < inputs.count() ; i++) {
mqtt.subscribe(TOPIC_PREFIX + deviceID + "/" + inputs.keyAt(i));
}
mqtt.publish(TOPIC_PREFIX + deviceID + "/state", "online");
mqtt.publish(TOPIC_PREFIX + deviceID + "/type", deviceType);
keepaliveTimer.initializeMs(10000, TimerDelegate(&SpejsNode::keepAliveHandler, this)).start();
}
bool SpejsNode::notify(String key, String value) {
if(mqtt.getConnectionState() == eTCS_Connected) {
mqtt.publish("iot/" + deviceID + "/" + key, value);
return true;
}
return false;
}
void SpejsNode::registerInput(String key, InputCallback callback) {
inputs[key] = callback;
}
void SpejsNode::mqttCallback(String topic, String value) {
String devicePrefix = TOPIC_PREFIX + deviceID;
if(!topic.startsWith(devicePrefix)) {
Serial.println("ignoring");
return;
}
topic = topic.substring(devicePrefix.length() + 1);
Serial.println(topic);
Serial.println(value);
if(inputs.contains(topic)) {
Serial.println("dupa");
inputs[topic](value);
} else {
Serial.println("default");
}
}

97
spejsiot/SpejsNode.h Normal file
View File

@ -0,0 +1,97 @@
#include <user_config.h>
#include <common_config.h>
#include <SmingCore/SmingCore.h>
typedef void (*InputCallback)(String);
class SpejsNode {
protected:
String deviceID;
String deviceType;
MqttClient mqtt; // (MQTT_BROKER, MQTT_PORT);
Timer keepaliveTimer;
HashMap<String, InputCallback> inputs;
void onConnected();
void startOTA();
void keepAliveHandler();
public:
SpejsNode(String _deviceType) :
mqtt(MQTT_BROKER, MQTT_PORT, MqttStringSubscriptionCallback(&SpejsNode::mqttCallback, this)),
//*[](String topic, String message) {
// Serial.printf("*** message received @ %s:\n\t%s\n***\n", topic.c_str(), message.c_str());
//}),
deviceType(_deviceType)
{};
void init();
//void registerInput(uint32_t gpio);
//void registerOutput(uint32_t gpio);
bool notify(String key, String value);
void registerInput(String key, InputCallback cb);
void mqttCallback(String, String);
};
/*
MqttClient mqtt(MQTT_BROKER, MQTT_PORT, *[](String topic, String message) {
Serial.printf("*** message received @ %s:\n\t%s\n***\n", topic.c_str(), message.c_str());
});
Timer keepaliveTimer;
String deviceName;
void startMqttClient()
{
Serial.println("*** Connecting to MQTT as " + deviceName);
mqtt.setWill("main/status/" + deviceName, "offline", 1, true);
mqtt.connect(deviceName);
mqtt.publish("main/status/" + deviceName, "online");
keepaliveTimer.initializeMs(5000, *[] {
mqtt.publish("main/status/" + deviceName, "alive " + String(millis()));
}).start();
}
void init()
{
deviceName = "switch-" + WifiStation.getMAC().substring(6, 12);
Serial.begin(SERIAL_BAUD_RATE); // 115200 by default
Serial.systemDebugOutput(false); // Debug output to serial
Serial.println("*** Starting " + deviceName + " ...");
WifiStation.config(WIFI_SSID, WIFI_PWD);
WifiStation.setIP(IPAddress(10, 5, 0, 39), IPAddress(255, 255, 255, 0), IPAddress(10, 5, 0, 1));
WifiStation.enable(true);
WifiAccessPoint.enable(false);
WifiStation.waitConnection(*[] {
Serial.println("*** Connection succeeded");
startMqttClient();
}, 20, *[] {
Serial.println("*** Connection failed");
});
attachInterrupt(BTN_PIN, *[] {
static int lastSwitch = 0;
// Debouncing
if(lastSwitch + 150 > millis()) {
Serial.println("--- debouncing");
return;
}
lastSwitch = millis();
Serial.println("*** Button pressed");
mqtt.publish("light/status", "toggle");
}, FALLING);
}
*/

View File

@ -1,31 +1,3 @@
## Local build configuration
## Parameters configured here will override default and ENV values.
## Uncomment and change examples:
#Add your source directories here separated by space
MODULES = app
MODULES = app ../spejsiot
DISABLE_SPIFFS = 1
USER_CFLAGS = -I../common
## ESP_HOME sets the path where ESP tools and SDK are located.
## Windows:
# ESP_HOME = c:/Espressif
## MacOS / Linux:
#ESP_HOME = /opt/esp-open-sdk
## SMING_HOME sets the path where Sming framework is located.
## Windows:
# SMING_HOME = c:/tools/sming/Sming
# MacOS / Linux
# SMING_HOME = /opt/sming/Sming
## COM port parameter is reqruied to flash firmware correctly.
## Windows:
# COM_PORT = COM3
# MacOS / Linux:
# COM_PORT = /dev/tty.usbserial
# Com port speed
# COM_SPEED = 115200

View File

@ -1,60 +1,18 @@
#include <user_config.h>
#include <common_config.h>
#include <SmingCore/SmingCore.h>
#include <SpejsNode.h>
MqttClient mqtt(MQTT_BROKER, MQTT_PORT, *[](String topic, String message) {
Serial.printf("*** message received @ %s:\n\t%s\n***\n", topic.c_str(), message.c_str());
});
SpejsNode node("switch");
Timer keepaliveTimer;
String deviceName;
void startMqttClient()
{
Serial.println("*** Connecting to MQTT as " + deviceName);
mqtt.setWill("main/status/" + deviceName, "offline", 1, true);
mqtt.connect(deviceName);
mqtt.publish("main/status/" + deviceName, "online");
keepaliveTimer.initializeMs(5000, *[] {
mqtt.publish("main/status/" + deviceName, "alive " + String(millis()));
}).start();
}
void init()
{
deviceName = "switch-" + WifiStation.getMAC().substring(6, 12);
Serial.begin(SERIAL_BAUD_RATE); // 115200 by default
Serial.systemDebugOutput(false); // Debug output to serial
Serial.println("*** Starting " + deviceName + " ...");
WifiStation.config(WIFI_SSID, WIFI_PWD);
WifiStation.enable(true);
WifiAccessPoint.enable(false);
WifiStation.waitConnection(*[] {
Serial.println("*** Connection succeeded");
startMqttClient();
}, 20, *[] {
Serial.println("*** Connection failed");
void init() {
node.init();
node.registerInput("relay", *[](String value) {
Serial.println("handler");
digitalWrite(5, value == "1" ? HIGH : LOW);
});
pinMode(5, OUTPUT);
digitalWrite(5, LOW);
attachInterrupt(BTN_PIN, *[] {
static int lastSwitch = 0;
// Debouncing
if(lastSwitch + 150 > millis()) {
Serial.println("--- debouncing");
return;
}
lastSwitch = millis();
Serial.println("*** Button pressed");
mqtt.publish("light/status", "toggle");
}, FALLING);
node.notify("btn", String(digitalRead(BTN_PIN)));
}, CHANGE);
//node.registerInputGPIO("btn", BTN_PIN);
//node.registerOutputGPIO("led", LED_PIN);
}