Gå til innhold
  • Bli medlem
Fredrick

GUIDE [Homeseer/Tasker]: Fredricks unødvendig kompliserte «babycall»

Anbefalte innlegg

Hei,

 

Valgte å legge topic her da mye av dette kan hackes om til andre systemer, men for egen del er det Homeseer som gjelder.

 

Følgende «komponenter» inngår for å få dette til å virke:

  • Webkamera (PoE Hikvision 2432)
  • ESP8266 med en billig lydsensor
  • Homeseer med plugins:
  • - Kodi
  • - EasyTrigger
  • - Tasker
  • - mcsMQTT
  • MQTT-broker
  • Mobil med Tasker, AutoRemote og AutoNotification

 

Jeg har hermet etter noen andre på forumet i prinsippene, men så har jeg også tatt den litt lenger og tenkte at jeg kunne dele hvordan jeg har gjort det. Jeg forsvarer tidsbruken for meg selv ved at jeg tror vi trenger «babycall» i en del år frem ettersom vi har en lydisolert kjeller-kino der vi ikke hører barna, og det er vi litt avhengige av å ha kontroll på.
Resultatet er slik:

  • Lydnivå i barnerommene overvåkes og sendes kontinuerlig til Homeseer
  • Hvis lydnivå overstiger en terskelverdi sendes det ut en egenprodusert notification (se under) til telefonen.
  • Hvis Kodi i kjelleren eller i stuen spiller av kommer samtidig bilde-i-bilde av webkamera til det rommet det gjelder 
  • Fra notification kan jeg åpne webkamera på mobilen, senke terskelverdien (noen kvelder er det mye bråk ute som gjør at alarmen trigges), skru av alarmen for dagen (eks. hvis jeg vet vi er tilgjengelig – eller hvis vi har barnevakt så trenger ikke jeg notifications) eller «slumre» alarmen i 15 minutter i de tilfellene der barna må få sovnet inn igjen. Notification ser slik ut:

image.png.7d87d41263155809c046ec0fecd91a85.png

 

Jeg fikk aldri digital utgang fra en annen lydsensor til å fungere, så det er brukt analog. Her hadde jeg nok hatt godt av litt bedre elektro-kompetanse, for jeg tipper det mangler en motstand. Justeringen på selve lydsensoren er ekstremt følsom, og den minste endring fører til at signalet klipper på maks. Senker jeg den litt reagerer den ikke på skriking. For eget vedkommende har jeg klart å få det til å fungere, men ta det som en advarsel/mulighet for forbedring. Kombinasjon av «If its stupid, but it works..» og «If it works, dont fix it» 

 

Programmering – ESP8266

Klipper bare inn programmet som brukes, så får dere heller spørre hvis det er noe. Kanskje jeg kan svare, kanskje noen andre kan svare. Kanskje noen kan fortelle meg om ting som burde vært gjort annerledes :)

 

//Library and defining DHT
#include "DHT.h"
#define DHTTYPE DHT22
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE); 

//Library for NodeMCU
#include <ESP8266WiFi.h>

//WiFi setup
const char* ssid = "SSID";
const char* password = "PASSORD";
WiFiClient espClient;

//Libraries, setup and topics for MQTT
#include "PubSubClient.h"
const char* mqtt_server = "192.168.1.7";
const int mqtt_port = 1883;
#define temperature_topic "ESP/Ronjas/temp/temp"
#define lyd10_topic "ESP/Ronjas/lyd/lyd10"
#define lyd60_topic "ESP/Ronjas/lyd/lyd60"
PubSubClient client(espClient);

//Variables for temperature-reporting.
long lastMsg = 0; //Storing last sent temp
float temp = 0.0;
float diff = 1.0; //change to a suited value based on max difference in temp that should be accepted

int pinSignal = A0; // pin connected to sound sensor //Sound-sensor connected to A0   

void setup ()  
{   
  pinMode (pinSignal, INPUT); // Set the signal pin as input for sound sensor   
  Serial.begin (74880);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  dht.begin(); 
} 

void setup_wifi() {
  delay(10);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  }

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      //Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

//Check if new temp value can be accepted
bool checkBound(float newValue, float prevValue, float maxDiff) {
  return !isnan(newValue) &&
         (newValue > prevValue - maxDiff || newValue < prevValue + maxDiff) && newValue != prevValue;
}
   
void loop ()  
{ 
  if (!client.connected()) {
      reconnect();
      }
  client.loop();
  
  int level60 = 0;

  //Averages the last minute and publishes to MQTT
  for (int x = 0; x<6; x++){
    int level10 = 0;
    
    //Averages the reads from last 10 seconds and publishes to MQTT
    for (int y = 0; y<10; y++){
      int level1 = 0;
        
      //Takes 200 polls from sound sensor and stores the sum. 5ms between polls
      for (int z = 0; z<200; z++){
            level1 = level1 + analogRead(pinSignal);
            delay(5);
          }

      level1 = level1 / 200;
      level10 = level10 + level1;

      }

    level10 = level10 / 10;
    level60 = level60 + level10;

    client.publish(lyd10_topic, String(level10).c_str(), true);
    //Serial.print("Lyd siste 10: ");
    //Serial.println(level10);
    }

  level60 = level60 / 6;

  client.publish(lyd60_topic, String(level60).c_str(), true);
  Serial.print("Lyd siste 60: ");
  Serial.println(level60);

  //Reporting new temp each minute if it passes checkBound
    float newTemp = dht.readTemperature();

  if (checkBound(newTemp, temp, diff)) {
    temp = newTemp;
    Serial.print("Ny temperatur rapportert: ");
    Serial.println(String(temp).c_str());
    client.publish(temperature_topic, String(temp).c_str(), true);
    }
  else {
    Serial.print("Skippet rapportering av temp, newTemp: ");
    Serial.print(newTemp);
    Serial.print(" temp: ");
    Serial.println(temp);
    }
}  


Merk at denne sender ut gjennomsnittsverdier for siste 10 og siste 60 sekunder. Dette ble brukt litt i testingen, men jeg har valgt å beholde begge. Jeg bruker siste 10s for å utløse alarmer da det har vist seg å fungere godt uten at det blir for følsomt. 

 

Programmering – Homeseer
Forutsetter at dere har installert Tasker plugin og fått den til å fungere begge veier.
Det trengs noen virtuelle devicer for å komme i mål:

 

«Leggetid» On/Off

  • o    Brukes for å skru av alarmen når ungene ikke sover. Brukes også for å skru av/slumre alarmen

 

«Lydnivå»

  • o    Denne enheten oppdateres (via MQTT) med verdiene fra lydsensoren

 

«Alarmterskel»

  • o    Denne enheten brukes for å utløse Homeseer-event ved sammenligning mot Lydnivå (Lydnivå>terskel – kjør notification)
  • o    Eneste grunn til å ha dette som en egen device og ikke kjøre event direkte (lydnivå>»TERSKELVERDI») er for å kunne senke følsomheten via notification. 

 

Så blir det en del events:

«Leggetid unger»

  • Skrur på device «Leggetid» etter fastsatt klokkeslett. Jeg kan også kjøre dette eventet via snarveier på mobilen. Har ambisjoner om å få dette bedre automatisert fordi leggetid selvsagt ikke følger et fast klokkeslett hver dag. Jeg har lagt inn en «failsafe» ved at dersom de er lagt tidlig og vi fyrer opp kinoen skrus alarmene likevel på.
    image.png.47ab38458f3d893ed70e89df5ae0a5c3.png

 

«Lydalarm»

  • Sammenligner devicene «Lydnivå» og «alarmterskel» med hjelp av EasyTrigger, kjører event hvis barna er lagt (og ikke «huset sover», altså vi voksne også).
  • Sender notification til mobilen min
  • Starter bilde-i-bilde på Kodi dersom det spilles av media der
    image.png.7196c6d90a90c15877129880f56291bc.png

 

"Morgen"

  • Skrur av leggetid for begge barna og for huset 

 

«Resett terskelnivå»

  • Hvis vi har senket sense via mobilen så skal den tilbake til opprinnelig verdi hver natt

image.png.14d0ebbf06accc85df1f2b1cec564baa.png

 

«Senk sense»

  • Kjører skript som senker verdien på «Alarmterskel» med et gitt intervall
  • image.png.8be5562edb795f87f4dfca88c4074886.png

 

«Slumre»

  • Skrur av leggetid i 15 minutter
  • image.png.9b68d273a6d4ddf5dedae2e2fd55d96b.png

 

Programmering – Tasker
Tasker er for meg tungvint og uoversiktlig, men jeg fikk det nå til tilslutt. Ser store muligheter med Autonotification. F.eks automatisk fjerne notifications for «post» fremfor å sende en ny notification «Post hentet».
-    Event «Notification» kjører når det sendes alarm fra Homeseer. Denne notification har 3 knapper i tillegg til å i seg selv fungere som en knapp. Setup ser slik ut:

image.png.9fb2331887fc03154f4913b5bd23ae8a.png

 

-    De ulike knappene må alle ha tilhørende «Profiles» som ser slik ut:

image.png.085ffe75e5c2b5d1b861efd5b1edc7a3.png


Disse profilene kjører hver sin task som ser slik ut:

-    Snooze (OBS! Feil ID-nummer): 
 image.png.814f3e26291981b6337c720f1fec1001.png

 

-    Skru av (OBS! Feil ID-nummer):
  image.png.9ee3254fa9f0759325eb24fa7a40e858.png

 

-    Senk sense:
  image.png.7d9df10097157d61b2cd183b55b94064.png

 

-    Åpne webkamera:
  image.png.84837f6ffc015f23e28270cf6d81f7ed.png

 

image.png

Endret av Fredrick
  • Like 4
  • Thanks 1

Del dette innlegget


Lenke til innlegg
Del på andre sider

Kjempeguide! Denne skal jeg stjele litt av. :)

 

Bonus: Sammenlign 10-sekunders nivået med forrige 1-minutts nivå som terskel, så har du en mer "adaptiv" rutine.

Del dette innlegget


Lenke til innlegg
Del på andre sider
13 hours ago, Moskus said:

Bonus: Sammenlign 10-sekunders nivået med forrige 1-minutts nivå som terskel, så har du en mer "adaptiv" rutine.

 

Det er faktisk noe av grunnen til at jeg skrev den inn i koden. Jeg hadde også andre intervaller inne mens jeg testet det ut. 

 

Når det kom til stykket valgte jeg det bort for en enklere løsning. Som du vet er gråt eller barn som roper en variabel som det er vanskelig å ta høyde for i alle tilfeller. Gråter de mot mikrofonen får jeg masse utslag, har de snudd seg i sengen og ligger inn i dynen er det ingenting. 1-minutts nivået kan også bli kunstig forhøyet av biler/flytrafikk i området som gjør at jeg ikke får alarmer når jeg skal.

 

Til syvende og sist opplever jeg noen falske alarmer når det f.eks kommer en motorsyklist som skal tøffe seg litt forbi vinduene. Jeg vil likevel mye heller ha falske positiver enn falske negativer.

Del dette innlegget


Lenke til innlegg
Del på andre sider
9 timer siden, Fredrick skrev:

Når det kom til stykket valgte jeg det bort for en enklere løsning. Som du vet er gråt eller barn som roper en variabel som det er vanskelig å ta høyde for i alle tilfeller. Gråter de mot mikrofonen får jeg masse utslag, har de snudd seg i sengen og ligger inn i dynen er det ingenting. 1-minutts nivået kan også bli kunstig forhøyet av biler/flytrafikk i området som gjør at jeg ikke får alarmer når jeg skal.

Det kan nok muligens også ha noe med mikrofonen og evt. plasseringen å gjøre. Men det er muligens vanskelig å få gode omnidireksjonelle mikrofoner til slike prosjekter som passer med lommeboken...

 

9 timer siden, Fredrick skrev:

Jeg vil likevel mye heller ha falske positiver enn falske negativer.

Ja, jeg er selvfølgelig helt enig. :) 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Vurdert å tappe inn på lydfeeden til kameraet i stedet? Jeg har mitt Hikvision rett over barn, så mikrofonen har en ideell plassering, men jeg har ikke funnet en god/enkel metode enda. Tenkte å bruke en RPi til det.

Del dette innlegget


Lenke til innlegg
Del på andre sider
On 15/07/2019 at 19:05, Venin said:

Vurdert å tappe inn på lydfeeden til kameraet i stedet? Jeg har mitt Hikvision rett over barn, så mikrofonen har en ideell plassering, men jeg har ikke funnet en god/enkel metode enda. Tenkte å bruke en RPi til det.

 

Ble vurdert, men fant ingen god løsning nei

Del dette innlegget


Lenke til innlegg
Del på andre sider

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Fjern formatering

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.


×
×
  • Opprett ny...