add code and config files

This commit is contained in:
Christian 2020-05-06 21:22:58 +02:00
parent 9bd1f7016c
commit eab3fc37e9
Signed by: exxess
GPG Key ID: 88ED5070FE0D5F23
2 changed files with 205 additions and 0 deletions

53
platformio.ini Normal file
View File

@ -0,0 +1,53 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[platformio]
default_envs = serial
[common]
ssid = wifi
password = foobar
mqtt_server = mqtt
mqtt_room = test
mqtt_device = ledstrip
; must be a positive integer value
; must be incremented for automated updates to happen!
firmware_version = 1
[uploadconfig]
sign_prog = $PROJECT_PACKAGES_DIR/framework-arduinoespressif8266/tools/signing.py
sign_key = ../private.pem
sign_cert = ../public.pem
upl_url = http://mqtt/arduino-upload.php
upl_token = secretpassphrase
[env]
platform = espressif8266
board = d1_mini
framework = arduino
build_flags =
'-DINI_SSID="${common.ssid}"'
'-DINI_PSK="${common.password}"'
'-DINI_SERVER="${common.mqtt_server}"'
'-DINI_ROOM="${common.mqtt_room}"'
'-DINI_DEVICE="${common.mqtt_device}"'
'-DINI_VERSION="${common.firmware_version}"'
extra_scripts = pre:public_key.py
[env:serial]
upload_port = /dev/ttyUSB*
upload_speed = 921600
monitor_port = /dev/ttyUSB*
monitor_speed = 115200
[env:web]
upload_protocol = custom
extra_scripts = pre:sign_and_upload.py

152
src/main.cpp Normal file
View File

@ -0,0 +1,152 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <FastLED.h>
#include "elapsedMillis.h"
#include "signedUpdatesHelper.h"
// most of these configuration settings should be changed in the file platformio.ini
#define WIFI_SSID INI_SSID
#define WIFI_PSK INI_PSK
#define MQTT_SERVER INI_SERVER
#define MQTT_ROOM INI_ROOM
#define MQTT_DEVICE INI_DEVICE
#define MQTT_RETAIN true
#define UPDATE_URL "http://" MQTT_SERVER "/arduino-download.php?room=" MQTT_ROOM "&device=" MQTT_DEVICE
#define UPDATE_VERSION INI_VERSION
const char* const topic_state = MQTT_ROOM "/" MQTT_DEVICE "/state";
const char* const topic_bright = MQTT_ROOM "/" MQTT_DEVICE "/brightness";
const char* const topic_color = MQTT_ROOM "/" MQTT_DEVICE "/color";
const char* const topic_lwt = MQTT_ROOM "/" MQTT_DEVICE "/lwt";
const char* const topic_rssi = MQTT_ROOM "/" MQTT_DEVICE "/stats/rssi";
const char* const topic_vers = MQTT_ROOM "/" MQTT_DEVICE "/stats/update-version";
const char* const topic_upderr = MQTT_ROOM "/" MQTT_DEVICE "/stats/update-error";
#define LED_CHIPSET APA102
#define COLOR_ORDER BGR
#define NUM_LEDS 1
#define DATA_PIN 4
#define CLOCK_PIN 5
#define SWITCH_PIN 15
bool is_auto_mode = false;
int brightness = 0;
String updateStatus;
WiFiClient wifiClient, wifiClient2;
PubSubClient mqttClient;
CRGB leds[NUM_LEDS];
// by noby
inline uint8_t parse_hex_nibble(uint8_t nibble) {
return isdigit(nibble) ? nibble - '0' : toupper(nibble) - 'A';
}
CRGB parse_colorcode(const char* payload) {
uint8_t r = ((parse_hex_nibble(payload[0]) << 4)) | parse_hex_nibble(payload[1]);
uint8_t g = ((parse_hex_nibble(payload[2]) << 4)) | parse_hex_nibble(payload[3]);
uint8_t b = ((parse_hex_nibble(payload[4]) << 4)) | parse_hex_nibble(payload[5]);
return CRGB(r, g, b);
}
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
if (strcmp(topic, topic_state) == 0 && length == 1) {
if ((char)payload[0] == '0') {
FastLED.setBrightness(0);
is_auto_mode = false;
} else if ((char)payload[0] == '1') {
FastLED.setBrightness(brightness);
is_auto_mode = false;
} else if ((char)payload[0] == '2') {
FastLED.setBrightness(0);
is_auto_mode = true;
}
}
else if (strcmp(topic, topic_bright) == 0 && length >= 1) {
brightness = atoi((const char*) payload);
FastLED.setBrightness(brightness);
}
else if (strcmp(topic, topic_color) == 0 && length == 6) {
fill_solid(leds, NUM_LEDS, parse_colorcode((const char*)payload));
}
}
void mqtt_connect() {
String mqtt_client_id = MQTT_DEVICE + ESP.getChipId();
if (mqttClient.connect(mqtt_client_id.c_str(), topic_lwt, 0, true, "offline")) {
mqttClient.publish(topic_lwt, "online", MQTT_RETAIN);
mqttClient.subscribe(topic_state);
mqttClient.subscribe(topic_bright);
mqttClient.subscribe(topic_color);
}
}
void publish_stats()
{
if (mqttClient.connected()) {
mqttClient.publish(topic_rssi, String(WiFi.RSSI()).c_str(), MQTT_RETAIN);
mqttClient.publish(topic_vers, UPDATE_VERSION, MQTT_RETAIN);
mqttClient.publish(topic_upderr, updateStatus.c_str());
}
}
void setup() {
// FastLED setup
#ifndef CLOCK_PIN
FastLED.addLeds<LED_CHIPSET, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
#else
FastLED.addLeds<LED_CHIPSET, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
#endif
// Wifi setup
WiFi.hostname(MQTT_ROOM "_" MQTT_DEVICE);
WiFi.begin(WIFI_SSID, WIFI_PSK);
while (WiFi.status() != WL_CONNECTED)
delay(500);
// MQTT setup
mqttClient.setClient(wifiClient);
mqttClient.setServer(MQTT_SERVER, 1883);
mqttClient.setCallback(mqtt_callback);
// misc setup
randomSeed(micros());
signedUpdatesHelperInit();
}
elapsedSeconds lastReconnect = 0;
elapsedMillis lastLedShow = 0;
elapsedSeconds lastStats = 0;
elapsedSeconds lastUpdate = 0;
void loop() {
if (WiFi.status() == WL_CONNECTED && !mqttClient.connected()) {
if (lastReconnect > 5) {
lastReconnect = 0;
mqtt_connect();
}
}
if (is_auto_mode) {
FastLED.setBrightness(digitalRead(SWITCH_PIN) == HIGH ? brightness : 0);
}
if (lastLedShow > 200) {
lastLedShow = 0;
FastLED.show();
}
if (lastStats > 120) {
lastStats = 0;
publish_stats();
}
if (lastUpdate > 300) {
lastUpdate = 0;
updateStatus = signedUpdatesHelperRun(wifiClient2, UPDATE_URL, UPDATE_VERSION);
}
mqttClient.loop();
}