Hi. Do you mean the yaml part in HA?
Hi Rune, I use this Alarm System (https://github.com/runningman84/home-assistant-apps/blob/master/apps/alarm.py) that automatically arm and disarm alarm based on device_tracker recognition of my smartphone (when works fine). I wish an alternative way to arm and disarm it using RFID badge or tag.
Iāve a RC522, a Nodemcu V3 Lolin and I wish to use the firmware and scripts created by thaijames to integrate them in my Home Assistant.
Iām a newbie please help meā¦
There is a firmware to flash in Nodemcu to send RFID token to HA
(Controlling House Alarm From HA)
There is a code to interface RFID reader to HA ā¦I suppose to put in a file likeā¦ rfid.py
(Controlling House Alarm From HA)
Where should this file be put?
Then there is some automation to put in configuration.yaml to arm or disarm alarm
My alarm code is based on appdaemon and is located in /config/appdaemon/apps/alarm.py
Usually I arm or disarm it using automationsā¦
action:
- service: alarm_control_panel.alarm_arm_home
data: {"entity_id":"alarm_control_panel.ha_alarm","code":"12345678"}
or
action:
- service: alarm_control_panel.alarm_disarm
data: {"entity_id":"alarm_control_panel.ha_alarm","code":"12345678"}
To simplify operations at the moment I wish to exclude the management of the LEDs
Can you help me?
I uploaded the sketch I used to the NodeMCU and then received RFID ids as MQTT messages to HA. Based on these ids I made automations to turn on if off and off if on. No fancy stuff ;) I only use the LEDs to show if the alarm is on or off. If you dont want to use LED
s just dont connect anything to these outputs.
I filled mqtt server data and flashed the Nodemcu commenting the code about leds managementā¦
and now?
how to integrate it in HA?
How to authorize only my rdif badge?
How to do to arm/disarm my alarm?
My firmware version now isā¦
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "MFRC522.h"
/* wiring the MFRC522 to ESP8266 (ESP-12)
RST = GPIO4
SDA(SS) = GPIO2
MOSI = GPIO13
MISO = GPIO12
SCK = GPIO14
GND = GND
3.3V = 3.3V
*/
#define RST_PIN D3 // RST-PIN GPIO4
#define SS_PIN D8 // SDA-PIN GPIO2
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
// Wifi Connection details
const char* ssid = "TIM-12345678";
const char* password = "aabbccddeeffgghhiijjkkll";
const char* mqtt_server = "192.168.1.2";
const char* mqtt_user = "user";
const char* mqtt_password = "12345";
const char* clientID = "RFID";
const char* rfid_topic = "home/rfid";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
void setup() {
Serial.begin(115200);
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
delay(2);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// Connect to Wifi
void setup_wifi() {
//Turn off Access Point
WiFi.mode(WIFI_STA);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// Check for incoming messages
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("");
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
char s[20];
sprintf(s, "%s", payload);
if ( (strcmp(topic,"home/alarm")==0))
{
payload[length] = '\0';
String sp = String((char*)payload);
// Alarm is off
if (sp == "disarmed")
{
Serial.println();
Serial.print("Alarm is set to Disarmed");
Serial.println();
//off_both_led();
}
// Alarm is Armed Home
else if (sp == "armed_home")
{
Serial.println();
Serial.print("Alarm is set to Armed Home");
Serial.println();
//on_green_led();
}
// Alarm is arming
else if (sp == "pending")
{
Serial.println();
Serial.print("Alarm set to Pending");
Serial.println();
//on_both_led();
}
// Alarm is Armed Away
else if (sp == "armed_away")
{
Serial.println();
Serial.print("Alarm set to Armed Away");
Serial.println();
//on_green_led();
}
// Alarm is Triggered
else if (sp == "triggered")
{
Serial.println();
Serial.print("Alarm is triggered!!");
Serial.println();
//on_red_led();
}
}}
/* interpret the ascii digits in[0] and in[1] as hex
* notation and convert to an integer 0..255.
*/
int hex8(byte *in)
{
char c, h;
c = (char)in[0];
if (c <= '9' && c >= '0') { c -= '0'; }
else if (c <= 'f' && c >= 'a') { c -= ('a' - 0x0a); }
else if (c <= 'F' && c >= 'A') { c -= ('A' - 0x0a); }
else return(-1);
h = c;
c = (char)in[1];
if (c <= '9' && c >= '0') { c -= '0'; }
else if (c <= 'f' && c >= 'a') { c -= ('a' - 0x0a); }
else if (c <= 'F' && c >= 'A') { c -= ('A' - 0x0a); }
else return(-1);
return ( h<<4 | c);
}
// Reconnect to wifi if connection lost
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(clientID, mqtt_user, mqtt_password)) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("home/rfid", "connected");
// ... and resubscribe
client.subscribe("home/alarm");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// Main functions
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
delay(50);
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
delay(50);
return;
}
// Show some details of the PICC (that is: the tag/card)
Serial.println("");
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
//digitalWrite(idPin, HIGH);
delay(500);
//digitalWrite(idPin, LOW);
delay(500);
// Send data to MQTT
String rfidUid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
rfidUid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
rfidUid += String(mfrc522.uid.uidByte[i], HEX);
}
const char* id = rfidUid.c_str();
client.publish("home/rfid", id);
delay(3000);
}
// Helper routine to dump a byte array as hex values to Serial
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
Hi, I will find my old configuration and automations and put it here (I removed my RFID since I got my device tracker working properly). Could you confirm that you have hass.io and Mosquitto MQTT broker? The alarm also needs to be Manual alarm with MQTT.
Yes, I use Hassio and Mosquitto MQTT broker.
I can arm or disarm alarm manuallyā¦ usually I ise a Xiaomi wireless switch with a automation like thisā¦
- alias: SystemAlarm Disarmed Manually
trigger:
platform: event
event_type: click
event_data:
event_id: binary_sensor.switch_123456789123456789
click_type: double
action:
service: alarm_control_panel.alarm_disarm
data: {"entity_id":"alarm_control_panel.ha_alarm","code":"12345"}
After flashing Nodemcu what will be his IP?
I do not see it in my wifi networkā¦ it is strangeā¦
When you flash it with the sketch you can have the log open, there you will see if it connects and which IP it receives.
After flashing in serial monitor of Arduino IDE it printedā¦ āø®8āø®āø®āø®
I fear there is something wrong with the firmware
Hi, did you remember to set it to speed to 115200? If this is your first time using arduino watch this video. It helped me alot: https://www.youtube.com/watch?v=jpjfVc-9IrQ&t=662s
I used many time Arduino IDE, I flashed with Tasmota 8 Sonoff switches few months ago.
Serial speed is 115200
huh. Then I dont get it. It works fine for me on NodeMCU. I can retry the sketch a bit later tonight and see what I find. I remember all my sketches always start with some like ???something, but then goes over to normal.
Hi Rune, I solved the problemā¦ the Nodemcu V3 was partially brokenā¦ I flashed the blink sketch and it do not blink the led.
Now I tested with a ESP8266 D1 mini and it works fine and is recognized from my wifi network and assigned a IP. If I use a badge or tag it show me its code in the Arduino serial monitor.
Mosquitto MQTT view itā¦ āNew client connected from 192.168.1.133 as RFID (c1, k15, uāvpomaxā).ā
Now I need to make the code HA side.
I used the sensor to have a view of what I received in HA and the automation below for the alarm. Just replace RFIDxxxxxx with the ID that shows in the sensor. Goodluck
Sensor:
- platform: mqtt
state_topic: "home/rfid"
name: RFID
Automation:
- alias: RFID 1 Alarm off
trigger:
platform: mqtt
topic: "home/rfid"
payload: 'RFIDxxxxxx'
condition:
condition: or
conditions:
- condition: state
entity_id: youralarmhere
state: armed_home
- condition: state
entity_id: youralarmhere
state: armed_away
action:
- service: notify.ios_yourphone
data:
message: "RFID 1 -> Alarm off!"
- service: logbook.log
data_template:
name: >-
{{ MQTT }}
message: RFID 1 -> Alarm off!
- service: alarm_control_panel.alarm_disarm
data:
entity_id: youralarmhere
code: myalarmpassword
- alias: RFID 1 Alarm on
trigger:
platform: mqtt
topic: "home/rfid"
payload: 'RFIDxxxxxx'
condition:
- condition: state
entity_id: youralarmhere
state: disarmed
action:
- service: notify.ios_xxxxx
data:
message: "RFID 1 -> Alarm on!"
- service: logbook.log
data_template:
name: >-
{{ MQTT }}
message: RFID 1 -> Alarm on!
- service: alarm_control_panel.alarm_arm_home
data:
entity_id: youralarmhere
code: youralarmpassword
HA called it sensor.rfid__c
the RFIDxxxxxx code is the code of the badge? e.g RFID95a6c81f ?
Sounds correct, but without the RFID part. Just the random letters and numbers.
WOW!!! it works fine!!!
it was more easy than I thinked
Thank you Rune for supportā¦ you have been very helpful and patient
I will use it in alternative to device_tracker becouse sometimes device_tracker do not recognize smartphone when we return at home, so I need a fast way to disarm it
Thanks for the great contribution to the original post, itās more than great!
I have this now setup, but have 2 questions:
-
The blue light is working for me (the one that turns ON when it reads a tag). I know you disabled the red&green leds on purpose, but could you describe exactly why? And how could I enable them again by using your code?
-
I donāt understand the part on your code that says ācode: youralarmpasswordā. What is exactly that alarm for? In my setup I just have the following in configuration.yaml and seems to be more than enough:
alarm_control_panel: platform: manual name: Home Alarm pending_time: 0 trigger_time: 1 # Workaround to prevent being in the triggered state
Thanks a lot!
Hi. All the LEDs should be working with the sketch, but without the blinking. I use Manual Alarm Panel with a password (optional), since you dont have password you dont need that line (Manual Alarm Panel).
Humā¦ strange only the blue one is working with me.
Anyway, what sketch are you refering to?
Thanks.
Hi
As you can see below in the sketch I have assigned D0 , D1 and D2 to the LEDs.