Wemos, Arduion IDE
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define MQTT_VERSION MQTT_VERSION_3_1_1
// Wifi: SSID and password
const char* WIFI_SSID = "ssid";
const char* WIFI_PASSWORD = "password";
// MQTT: ID, server IP, port, username and password
const PROGMEM char* MQTT_CLIENT_ID = "fasad_light1";
const PROGMEM char* MQTT_SERVER_IP = "192.168.0.114";
const PROGMEM uint16_t MQTT_SERVER_PORT = 1883;
const PROGMEM char* MQTT_USER = "homeassistant";
const PROGMEM char* MQTT_PASSWORD = "password";
// MQTT: topics
const char* MQTT_LIGHT_STATE_TOPIC = "fasad/light1/status";
const char* MQTT_LIGHT_COMMAND_TOPIC = "fasad/light1/switch";
// payloads by default (on/off)
const char* LIGHT_ON = "ON";
const char* LIGHT_OFF = "OFF";
const PROGMEM uint8_t LED_PIN = 5;
boolean m_light_state = false; // light is turned off by default
WiFiClient wifiClient;
PubSubClient client(wifiClient);
// function called to publish the state of the light (on/off)
void publishLightState() {
if (m_light_state) {
client.publish(MQTT_LIGHT_STATE_TOPIC, LIGHT_ON, true);
} else {
client.publish(MQTT_LIGHT_STATE_TOPIC, LIGHT_OFF, true);
}
}
// function called to turn on/off the light
void setLightState() {
if (m_light_state) {
digitalWrite(LED_PIN, HIGH);
Serial.println("INFO: Turn light on...");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("INFO: Turn light off...");
}
}
// function called when a MQTT message arrived
void callback(char* p_topic, byte* p_payload, unsigned int p_length) {
// concat the payload into a string
String payload;
for (uint8_t i = 0; i < p_length; i++) {
payload.concat((char)p_payload[i]);
}
// handle message topic
if (String(MQTT_LIGHT_COMMAND_TOPIC).equals(p_topic)) {
// test if the payload is equal to "ON" or "OFF"
if (payload.equals(String(LIGHT_ON))) {
if (m_light_state != true) {
m_light_state = true;
setLightState();
publishLightState();
}
} else if (payload.equals(String(LIGHT_OFF))) {
if (m_light_state != false) {
m_light_state = false;
setLightState();
publishLightState();
}
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.println("INFO: Attempting MQTT connection...");
// Attempt to connect
if (client.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASSWORD)) {
Serial.println("INFO: connected");
// Once connected, publish an announcement...
publishLightState();
// ... and resubscribe
client.subscribe(MQTT_LIGHT_COMMAND_TOPIC);
} else {
Serial.print("ERROR: failed, rc=");
Serial.print(client.state());
Serial.println("DEBUG: try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
// init the serial
Serial.begin(115200);
// init the led
pinMode(LED_PIN, OUTPUT);
analogWriteRange(255);
setLightState();
// init the WiFi connection
Serial.println();
Serial.println();
Serial.print("INFO: Connecting to ");
WiFi.mode(WIFI_STA);
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("INFO: WiFi connected");
Serial.print("INFO: IP address: ");
Serial.println(WiFi.localIP());
// init the MQTT connection
client.setServer(MQTT_SERVER_IP, MQTT_SERVER_PORT);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Home Assistant Config
homeassistant:
# Name of the location where Home Assistant is running
name: Name
# Location required to calculate the time the sun rises and sets
latitude: 59.4118
longitude: 17.6167
# Impacts weather/sunrise data (altitude above sea level in meters)
elevation: 15
# metric for Metric, imperial for Imperial
unit_system: metric
# Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: Europe/Stockholm
# Customization file
customize: !include customize.yaml
hassio:
# Show links to resources in log and frontend
#introduction:
# Enables the frontend
frontend:
# Enables configuration UI
config:
http:
# Secrets are defined in the file secrets.yaml
# api_password: !secret http_password
# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
# base_url: example.duckdns.org:8123
# Checks for available updates
# Note: This component will send some information about your system to
# the developers to assist with development of Home Assistant.
# For more information, please see:
# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
updater:
# Optional, allows Home Assistant developers to focus on popular components.
# include_used_components: true
# Discover some devices automatically
# discovery:
# Allows you to issue voice commands from the frontend in enabled browsers
#conversation:
# Enables support for tracking state changes over time
history:
# View all events in a logbook
#logbook:
# Enables a map showing the location of tracked devices
#map:
# Track the sun
sun:
# Weather prediction
sensor:
- platform: yr
monitored_conditions:
- symbol
- humidity
- temperature
- platform: time_date
display_options:
- 'time'
- 'time_utc'
# Text to speech
#tts:
# - platform: google
# Cloud
#cloud:
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
panel_iframe:
configurator:
title: Configurator
icon: mdi:wrench
url: http://hassio.local:3218
light:
platform: mqtt
name: 'OutsideGuest'
state_topic: 'fasad/light1/status'
command_topic: 'fasad/light1/switch'
optimistic: false
switch:
platform: rpi_gpio
ports:
11: Fan
12: Light
scene:
- name: OutsideOn
entities:
light.OutsideGuest: on
switch.fan: on
- name: OutsideOff
entities:
light.OutsideGuest: off
switch.fan: off
mqtt:
password: Password
automations.yaml
- id: '1534879696217'
alias: Utomhus T?nd
trigger:
- platform: sun
event: sunset
- platform: time
at: '05:10:00'
action:
service: scene.turn_on
entity_id: scene.OutsideOn
- id: '1534879764580'
alias: Utomhus Sl?ck
trigger:
- platform: sun
event: sunrise
- platform: time
at: '23:00:00'
action:
service: scene.turn_on
entity_id: scene.OutsideOff