Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Prosjekt: styre HS fra (Harmony-)fjernkontroll


ZoRaC

Anbefalte innlegg

Som nevnt i et par tråder, så har jeg planer om å finne en løsning på å kunne trigge HS fra min Harmony-fjernkontroll. Harmony-plugin baserer seg på "polling" og det vil da ta tid før den reagerer på noe. 

 

Jeg har derfor tenkt å lage en (billig og enkel) løsning selv! :) 

 

Utstyr:

• NodeMCU

• IR-modul

• 3D-printet boks

 

Første "oppkobling":

IMG_5222.thumb.JPG.f1fd8ae32e0afd66d7c4a7c518021c92.JPG

 

Hva jeg ellers har gjort:

• lagt til en ny TV i Harmony-oppsettet (av et merke jeg ikke har) og sagt at denne alltid er på

• opprettet en ny device i HS for fjernkontrollen, foreløpig bare med statusrange 0-99999999

 

Tanken er å først bare bruke denne koden:

https://github.com/markszabo/IRremoteESP8266/blob/master/examples/IRrecvDemo/IRrecvDemo.ino

 

til å finne verdiene for tallene 0-9 på fjernkontrollen. Deretter opprette 10 statusvalues på devicen. F.eks kan det som er tallet 1 på fjernkontrollen være status "filmlys". Deretter skal NodeMCU lytte etter IR-signal og sende de til HS via JSON. :) 

 

Første forsøk gikk ikke så bra - ser ikke ut til at den mottar noe IR-signal. :( 

Har prøvd 2 IR-mottakere, annen datapin, både 3v og vin for strøm, prøvde til og med å snu IR-mottakeren, i tilfelle pinnene var motsatt. 

 

Forslag til videre feilsøking?

  • Like 1
Lenke til kommentar
Del på andre sider

Jeg hadde en ir receiver som så ut som din, den hadde annen pin out enn de som refereres til som den vanlige pin out.

Min brant opp og da jeg satte inn en annen receiver så virket det fint.

 

Tester du med standard demoprosjekt for IRremote(8266) biblioteket eller egen kode? er det ingen respons? hvilke pins bruker du på NodeMCU(Det har veldig mye å si da min resatte all kode ved restart når jeg benyttet meg av "feil" pin...).

 

Lenke til kommentar
Del på andre sider

  • 2 uker senere...
Den 30.3.2017 klokken 22.34, Lazarus skrev:

Tester du med standard demoprosjekt for IRremote(8266) biblioteket eller egen kode? er det ingen respons? hvilke pins bruker du på NodeMCU(Det har veldig mye å si da min resatte all kode ved restart når jeg benyttet meg av "feil" pin...).

 

Testet med eksempel-fila for IR-biblioteket. Ingen respons. Prøvde forskjellige, D4 og D6. Passet på å i koden bruke konstantene D4 og D6, så da skal det bli rett. 

 

Har nå fått LEDs og resistorer og testet metoden over - ingen lys i LED. For å sjekke at LED var i orden, fjernet jeg IR-mottakeren, men får ikke lys da heller...

 

Bruker G og VU på NodeMCU (måler 5,28v der). Koblet den lange LED-pinnen til VU og mellom en av de korte og G satte jeg inn en 220 Ohm resistor. Prøvde alle de 3 korte pinnene på LED, men ingen lys. 

Hva gjøre jeg feil?

 

EDIT:

Den lange skulle være G og de 3 andre VU (3 forskjellige farger). 

Da skal jeg prøve med IR-mottakeren igjen!

Endret av ZoRaC
Lenke til kommentar
Del på andre sider

Da har jeg prøvd med flere forskjellig IR-mottakere, men får ikke lys i LED... har også dobbelsjekket datasheets og pinout på IR-mottaker skal være riktig. 

 

Noen flere forslag? Kan jeg måle pinout på IR-mottakeren på noe vis for å verifisere?

Lenke til kommentar
Del på andre sider

  • 3 uker senere...

Da har jeg fått nye IR-mottakere, av en annen type ("TSOP4838").

Koblet opp testen med en LED og resistor, men får fortsatt ikke lys i LED'en! :o 

Koblet det også opp mot NodeMCU'en (prøvd både D1 og D6), men den registrerer heller ikke noe signal. Prøvd å mate IR-mottakeren med både 3v og 5v, men ingen forskjell. :( 

 

Hva i all verden kan være problemet??

 

De fleste fjernkontroller er vel på 38 Khz?

Lenke til kommentar
Del på andre sider

  • 3 uker senere...

Endelig litt fremgang!

Viser seg at Canal Digital-fjernkontrollen jeg har testet med går på Bluetooth, ikke IR! I tillegg lot jeg settingen på Harmony stå til "All", siden jeg skal teste direkte nå, men etterhvert er det hub'en som skal sende signalet. Viser seg at "All" ikke betyr "Alle"! ?IMG_5338.thumb.JPG.432c36357816e5b9312a709c1606ee41.JPG

 

Endret til "Remote only" og da blinket LEDen! :D 

Endret av ZoRaC
Lenke til kommentar
Del på andre sider

Da fungerer det!

La inn "kodene" for alle tall fra 0-9 på fjernkontrollen:

fjernkontroll.PNG.3213c4fb99f075abd97c8d1843c5611c.PNG

Så etter hvert som jeg finner ut hva de skal brukes til, så endrer jeg bare navn på dem og legger dem inn i Harmony med egen knapp på skjermen. :)

 

Koden jeg bruker nå (skal endres en del og slås sammen med DHT22-koden jeg bruker, for jeg skal kjøre begge deler på samme NodeMCU):

#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <WiFiClientSecure.h>
WiFiClientSecure client;

int RECV_PIN = D1; 
// Update these with values suitable for your network.
const char* ssid = "...";
const char* password = "....";

const char* host = "homeseer.local";
const int httpsPort = 443;

WiFiClient espClient;
IRrecv irrecv(RECV_PIN);
decode_results results;

long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {
   delay(100);
  // We start by connecting to a WiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(500);
      Serial.print(".");
    }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("PIN:");
  Serial.println(RECV_PIN);
}

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  setup_wifi();
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  long now = millis();
  
  if (now - lastMsg > 2000) {
    Serial.print("-");
     lastMsg = now;
    if (irrecv.decode(&results)) {
      irrecv.resume(); // Receive the next value
       Serial.println(results.value);

       sendDataToHS(525, String(results.value));
     }
  }
}

bool sendDataToHS(int dvRef, String data) {
  if (!client.connect(host, httpsPort)) {
    Serial.println("Connection failed");
    return false;
  }

  String url = "/JSON?request=controldevicebyvalue&ref=" + String(dvRef) + "&value=" + String(data);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Basic BASE64-STRENG-HER\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  Serial.println("Request sent (device " + String(dvRef) + ", data " + String(data) + ")");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      return true;
      break;
    }
  }
  return false;
}

 

  • Like 3
Lenke til kommentar
Del på andre sider

Da var jeg i mål! :)

Her er koden jeg brukter, den har da både en IR-mottaker og en DHT22 temp/fukt tiloblet.

// http://platformio.org/lib/show/721/TaskScheduler/examples
#include <TaskScheduler.h>
void checkIR();
void checkDHT();
void checkWifi();
Task tskCheckIR(1000, TASK_FOREVER, &checkIR);
Task tskCheckDHT(30000, TASK_FOREVER, &checkDHT);
Task tskCheckWifi(10000, TASK_FOREVER, &checkWifi);
Scheduler runner;

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <DHT.h>
#include <WiFiClientSecure.h>

// Use WiFiClientSecure class to create TLS connection
// https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino
WiFiClientSecure client;

// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Replace with your network details
const char* ssid = "....";
const char* password = ".....";
IPAddress ip(192, 168, 0, 10);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 0, 1);
IPAddress dns(192, 168, 0, 1);
const char* host = "homeseer.local";
const int httpsPort = 443;


String lastTemperature;
String lastHumidity;

// DHT Sensor
const int DHTPin = D6;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

// IR-sensor
int IRPin = D1;
IRrecv irrecv(IRPin);
decode_results IRresults;


void checkIR() {
  Serial.println("Sjekker IR");
  if (irrecv.decode(&IRresults)) {
    irrecv.resume(); // Receive the next value
    Serial.println(IRresults.value);
    sendDataToHS(525, String(IRresults.value));
  }
  Serial.println("END: Sjekker IR");
}

void checkDHT() {
  Serial.println("Sjekker DHT");

  String strHumidity = String((int)(dht.readHumidity() + 0.5));
  String strTemperature = String(dht.readTemperature());

  if (strTemperature != lastTemperature) {
    Serial.println("Temp er:" + strTemperature + " - Forrige var:" + lastTemperature);
    sendDataToHS(520, strTemperature);
    lastTemperature = strTemperature;
  }

  if (strHumidity != lastHumidity) {
    Serial.println("Fukt er:" + strHumidity + " - Forrige var:" + lastHumidity);
    sendDataToHS(521, strHumidity);
    lastHumidity = strHumidity;
  }
  Serial.println("END: Sjekker DHT");
}

void checkWifi() {
  Serial.println("Sjekker wifi");
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Mistet wifi, reconnect...");
    WiFi.begin(ssid, password);
  }
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("END: Sjekker wifi");
}

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);

  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(ip, gateway, subnet, dns);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println(WiFi.macAddress());
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());

  configTime(3 * 3600, 3600, "pool.ntp.org", "time.nist.gov");

  dht.begin();  
  irrecv.enableIRIn(); // Start the receiver

  runner.init();
  runner.addTask(tskCheckDHT);
  runner.addTask(tskCheckIR);
  runner.addTask(tskCheckWifi);
  tskCheckDHT.enable();
  tskCheckIR.enable();
  tskCheckWifi.enable();
}

// runs over and over again
void loop() {
  runner.execute();
}

bool sendDataToHS(int dvRef, String data) {
  if (!client.connect(host, httpsPort)) {
    Serial.println("Connection failed");
    return false;
  }

  String url = "/JSON?request=controldevicebyvalue&ref=" + String(dvRef) + "&value=" + String(data);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Basic BASE64-STRENG-HER\r\n" +
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
  Serial.println("Request sent (device " + String(dvRef) + ", data " + String(data) + ")");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      return true;
      break;
    }
  }
  return false;
}

lys_av.PNG.b364a44866936293512f7b38da9f48b0.PNG

 

 

harmony_seq.thumb.PNG.e53762890a04baef9b979b33b9658916.PNG

  • Like 3
Lenke til kommentar
Del på andre sider

8 minutter siden, xibriz skrev:

Takk for det :) Men med tanke på tidligere prosjekter så tror jeg vi har samme ånden :P 

 

Haha! Det der så mer ut som min løsning, ja! :P 

 

Dremel-blad (7 blad, 22-50 mm - regner med noe av det funker bra?) er på vei, sammen med projectbox! :) 

 

Edit:

og en pakke "standoffs"

Endret av ZoRaC
Lenke til kommentar
Del på andre sider

16 minutter siden, Moskus skrev:

Unnskyld, men: 1f602.png

 

Just my luck... har aldri brukt den, for jeg la jo boksen rett inn på Harmony med en gang. Og tilfeldigvis var det bare de to fjernkontrollene som lå tilgjengelig, alle andre var jo pakket vekk (pga Harmony).

 

Så jeg kunne nok fått ferdig dette for ganske mange uker siden... :o 

Lenke til kommentar
Del på andre sider

Jeg tenker utvide med styring av en 5V/0.3A vifte (via et relé). Strømtilførselen er en USB-kabel, så jeg tenker koble NodeMCU og vifta (via reléet) i parallell.

 

Men, vil motoren i vifta skape spenningsfall ved start, som kan "forstyrre" NodeMCU? Bør jeg i såfall parallellkoble en kondensator for å redusere det problemet? Hvilken kondensator, i så fall?

Lenke til kommentar
Del på andre sider

  • 1 måned senere...
15 timer siden, ZoRaC skrev:

Innser at jeg ikke kan feste NodeMCU i boksen, for da får jeg ikke satt inn USB-kabel for å programmere den... :( 

 

Du kan se om du får til å programmere/oppdatere den OTA (Over The Air) ;)

Lenke til kommentar
Del på andre sider

Den 7.7.2017 klokken 9.58, xibriz skrev:

 

Du kan se om du får til å programmere/oppdatere den OTA (Over The Air) ;)

 

Ja, det kan være en mulighet, hvis det er sikkert nok. :) får lese litt om det. Enkleste er kanskje å bare la den ligge løst. 

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  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...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.