Fjärrstyrning / Mini hemautomation

Berätta om dina pågående projekt.
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Tänkte det är bra att skriva här så man kanske får lite fart under fötterna...

Jag köpte ett av dessa klassiska fjärrströmbrytarseten, tre on/off för vägguttaget och en fjärrkontroll. Visade sig icke kompatibelt med Nexa eller liknande så då blir det såklart att göra något eget. Lite googlande och jag har hittat hur jag kan styra de med en arduino och en 433Mhz modul. Klicka runt lite på ebay och sedan vänta så fick jag hem vad jag behövde och kopplade ihop och med en enkel arduino-sketch kan jag då styra uttagen med med hjälp av seriekommandon. Nu ska det ju inte vara så enkelt utan måste ju bygga vidare :)

Mål:
* Slå på/av eluttagen till några lampor
* Mäta temperatur och luftfuktighet (fick med en sensor i arduinons startkit jag börjar med)
* Styras via hemsida i första skeedet och senare via MQTT och openhab (fast det är en senare historia att få igång)
* Strömförsörjning via power over ethernet
* Förpackat i en snygg låda...

Nuläge:
* Testat koden för att slå på av/ uttagen
* Beställt hem det mesta som behövs
* Håller på att få arduinon att fungera med ethernetshielden för att komma vidare...

Mer info kommer efterhand ;)
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Fjärrstyrning / Mini hemautomation

Inlägg av Lennart Aspenryd »

Bravo! Ser fram emot mer information och lite bilder!
Användarvisningsbild
sommarlov
Inlägg: 514
Blev medlem: 28 november 2015, 19:03:40
Ort: 08

Re: Fjärrstyrning / Mini hemautomation

Inlägg av sommarlov »

Lite input: Mqtt är världens enklaste att installera. Få den på plats i steg 1, och få din kod att publisera dit. Sen kan du välja hur du vill visa datat, hemsida eller OpenHab (eller kanske en Magic Mirror).

Openhab var lite mer klurig, men leta upp exempel på nätet så går det snabbt att få fram resultat.
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Re: Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Tack för tillrop och input, uppskattas.
Hemsida före MQTT är framförallt för att det är ungeför det enda som inte är nytt för mig och därför lite kortare startsträcka och någon felkälla mindre...

Lite mer info och bilder. Strömbrytarsetet är sålt av Gelia men tillverkat och Everflourish och säljs tydligen under många namn. Uttagen heter EMW203R och fjärrkontrollen EMW203T, denna hemsidan hjälpte mig att hitta rätt koder.
IMG_20170507_130859674.png
IMG_20170507_130916414.png
Enkel testuppkoppling (även om den inte säger mycket men bilder brukar uppskattas)
20170203_214145.png
Också koden jag använde för att testa, helt ostädad och okommenterad...

Kod: Markera allt

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

const int tx_pin = 12;

const unsigned long xA = 1376256;
const unsigned long xB = 4521984;
const unsigned long xC = 5308416;
const unsigned long xD = 5505024;

const unsigned int x1 = 5120;
const unsigned int x2 = 17408;
const unsigned int x3 = 20480;

const unsigned int xOn = 343;
const unsigned int xOff = 340;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  // Transmitter is connected to Arduino Pin #10
  mySwitch.enableTransmit(tx_pin);
}

void loop() {
  // put your main code here, to run repeatedly:

  while (Serial.available() > 0)
  {
    String text = Serial.readStringUntil('*');
//    Serial.println(text.length());

    if (text.length() == 3)
    {
      long data = 0;

      switch (text[0])
      {
        case 'a': data = data +  xA; break;
        case 'b': data = data +  xB; break;
        case 'c': data = data +  xC; break;
        case 'd': data = data +  xD; break;
        default: break;
      }

      switch (text[1])
      {
        case '1': data = data +  x1; break;
        case '2': data = data +  x2; break;
        case '3': data = data +  x3; break;
        default: break;
      }

      switch (text[2])
      {
        case '0': data = data +  xOff; break;
        case '1': data = data + xOn; break;
        default: break;
      }

      mySwitch.send(data, 24);
    }
  }
}
Styrs med seriella kommandon typ "a11" för att slå på strömbrytare "1" på kanal "a" och "a10" för att slå av den.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Re: Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Så, dagens övningar, glädjeämnen och lärdomar...

Har innan försökt få igång ethernet-shielden med hjälp av arduinos exempel utan resultat men nu tog jag tag i detta igen. Fram med förstoringsglas och lampa och synar shielden så att det är rätt krets etc. Tittar på undersidan och ser något som kan vara en liten tenntråd mellan reset-paddarna, fram med multimeter, hm ska väl inte vara när noll ohm här? Fram med en kniv och skrapar, mäter igen, oändligt motstånd, känns bättre! Nästa steg, flyttar runt sladdar så att alla power on lampor lyser (ja, jag fick ta hjälp av Google, nej, varför läsa innan när man kan pröva sig fram ;) Så länge den magiska röken är kvar är det ingen fara).

Kopplar in alla sladdar och laddar in exemplen igen (dhcp-printer, webserver) och får en ip-adress. Det fungerar! Nu är jag glad!

Fortsätter att fiffla runt i koden och skriva in den fina lilla (trodde jag) hemsidan jag gjort innan i notepad++. Den var inte så liten som jag trodde utan fick veta hur litet minnet i arduinon är så det blev en väldigt förenklad variant. Nu har den iallafall kontakt med omvärlden och jag kan fortsätta en annan dag.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Fjärrstyrning / Mini hemautomation

Inlägg av Lennart Aspenryd »

Bra att finna fel som man själv inte är skyldig till!
Hoppas att det blir rätt nu!
Vill också påminna om att Arduino inte är en grej! Det är ett koncept!
Det är därför det har blivit så stort. Du kan idag välja vilken Mikrokontroller du vill ha i Arduinokort.
En del kostar nästan inget och kan dra en tiondel i kräm, en del går 10 gånger fortare än en vanlig Uno och kan hålla 100 gånger mer kod. Somliga har få pinnar ut (Nano) (tillgängliga) och andra har många (Mega).
Så det stora felet med Arduino, det är att folk tror att det är en grej (sak) .
Och då har vi ändå inte sett vad Esp8266 för med sig!
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Re: Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Visst är det så. Här valde jag en nano för att få den fysiskt liten, dessutom kinaimport för att få det billigt så då får jag ta konsekvenserna...

En hel värld att utforska framöver iallafall :)
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Re: Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Såja, nu har jag nått en bit på vägen :) Hemsidan fungerar, går att tända och släcka lamporna och läser temperatur och luftfuktighet med en DHT11. Behöver jag säga att jag uppskattar arduinon och dess färdiga moduler och bibliotek, det gör det hela enkelt för en nybörjare att klippa och klistra och lära sig något på vägen...
Screenshot_20170516-202655.png
Nu till nästa steg, MQTT
Har laddat ner och installerat MQTT-bibliotek för arduinon, http://pubsubclient.knolleary.net/index.html
Har en raspberry pi med openhabian som jag TROR har Mosquitto installerat.
Börjar så smått förstå mig på publish/subscribe för MQTT men har en bit kvar innan det blir riktigt begripligt.
Har inte begripit hur man läser ett meddelande/topic på arduinon som man "subscibat" på.

Någon vänlig själ som kan ge en pekpinne var man börjar nysta i det hela för just nu läser jag en här och än där och begriper får inget grepp om det?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
zealotry
Inlägg: 918
Blev medlem: 9 oktober 2004, 22:28:40
Ort: Västerås

Re: Fjärrstyrning / Mini hemautomation

Inlägg av zealotry »

Har inte testat själv men det här exemplet ser inte alltför avancerat ut. http://www.hivemq.com/blog/mqtt-client- ... subclient/

I setup() registrerar (set callback) man en funktion som ska köras när det kommer in paket som man prenumererar på.

I reconnect-funktionen sätter han upp subscription till en topic.

Sen i funktionen som heter callback (den man la till i setup) hanteras datat som kommer in från dom topics man prenumererar på.
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Re: Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Tackar. Har läst på lite mer nu och så svårt ska det nog inte vara :) Men man kunde inte vara så lat som jag trodde, trodde det skulle gå att bara implementera arduinon och sedan testa mot en enkel androidapp (som såklart bara skulle vara att ladda ner): Men en broker måste till så jag har börjat i den ändan att installera Mosquitto på Raspberry Pin som såklart inte var installerat innan.
Återkommer...
Användarvisningsbild
LittleFish
Inlägg: 77
Blev medlem: 17 juni 2010, 03:44:14

Re: Fjärrstyrning / Mini hemautomation

Inlägg av LittleFish »

Så, nu får den anses klar. Fungerar att styra lamporna vi mqtt och till största delen är detta också inlagt i openhab, bara temperaturvisningen kvar att få ordning på...
Koden för den som är intresserad, helt oorganiserad och dåligt kommenterad men kanske kan hjälpa någon nån gång.

Kod: Markera allt

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <RCSwitch.h>
//https://github.com/winlinvip/SimpleDHT
#include <SimpleDHT.h>

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 101);
IPAddress server(192, 168, 1, 100);

EthernetClient ethClient;
PubSubClient client(ethClient);

//Setup for RCSwitch
RCSwitch mySwitch = RCSwitch();
const int tx_pin = 8;
const int retry = 20;

const unsigned long xA = 1376256;
const unsigned long xB = 4521984;
const unsigned long xC = 5308416;
const unsigned long xD = 5505024;

const unsigned int x1 = 5120;
const unsigned int x2 = 17408;
const unsigned int x3 = 20480;

const unsigned int xOn = 343;
const unsigned int xOff = 340;

//Setup for dht11
int pinDHT11 = 5;
SimpleDHT11 dht11;
byte temperature = 0;
byte humidity = 0;
unsigned long previousMillis = 0;


void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  client.setServer(server, 1883);
  client.setCallback(callback);

  Ethernet.begin(mac, ip);
  // Allow the hardware to sort itself out
  delay(1500);

  //RCSwitch
  mySwitch.enableTransmit(tx_pin);
  mySwitch.setRepeatTransmit(retry);

  Serial.println("Setup done");
}

String readString;

void loop() {

  //Do MQTT stuff
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  readTempAndHum();
}

void execute(String command)
{
  if (command.length() >= 3 &&
      (command[0] == 'a' || command[0] == 'b' || command[0] == 'c' || command[0] == 'd') &&
      (command[1] == '1' || command[1] == '2' || command[1] == '3') &&
      (command[2] == '0' || command[2] == '1'))
  {
    Serial.print("Execute command: ");
    Serial.println(command);

    long data = 0;

    switch (command[0])
    {
      case 'a': data = data +  xA; break;
      case 'b': data = data +  xB; break;
      case 'c': data = data +  xC; break;
      case 'd': data = data +  xD; break;
      default: break;
    }

    switch (command[1])
    {
      case '1': data = data +  x1; break;
      case '2': data = data +  x2; break;
      case '3': data = data +  x3; break;
      default: break;
    }

    switch (command[2])
    {
      case '0': data = data +  xOff; break;
      case '1': data = data + xOn; break;
      default: break;
    }

    mySwitch.send(data, 24);
  }
}

void readTempAndHum()
{
  //https://www.baldengineer.com/arduino-how-do-you-reset-millis.html 2017-05-15
  // Get snapshot of time
  unsigned long currentMillis = millis();

  // How much time has passed, accounting for rollover with subtraction!
  if ((unsigned long)(currentMillis - previousMillis) >= 10000) { //10 sekunder
    dht11.read(pinDHT11, &temperature, &humidity, NULL);
    previousMillis = currentMillis;

    if (client.connected())
    {
      char buf[2];
      String(temperature).toCharArray(buf, 3);
      client.publish("room/remote/temp", buf, true);

      String(humidity).toCharArray(buf, 3);
      client.publish("room/remote/hum", buf, true);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
//  Serial.print("Message arrived [");
//  Serial.print(topic);
//  Serial.print("] ");
//  for (int i = 0; i < length; i++) {
//    Serial.print((char)payload[i]);
//  }
  String command = "";
  for (int i = 0; i < length; i++) {
    command += (char)payload[i];
  }
  execute(command);
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("arduinoClient")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("room/lights");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
Låda beställd men tar nog nån månad innan det sista kan slutföras.
Skriv svar