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

Dimmerhjul med ESP8266


Actibus

Anbefalte innlegg

Har testet å bruke ESP8266 (NodeMCU) sammen med en rotary encoder mot HS3 og en z-wave dimmer Aeon Labs fra Clas Ohlson.

Det fungerer overraskende bra, jeg vil påstå så godt som ingen merkbar forsinkelse ved bruk, da sendes kommandoer via JSON.

Planen er å bruke Elko sin løse hjul og deksel, sammen med en bakplate som passer i veggboksen for å få dette til å se helt vanlig ut.

 

Jeg hadde håpet jeg kunne lese ut status av dimmeren via JSON og parse verdien på ESP8266 slik at jeg utifra det kunne sende on/off ved å trykke på rotary encoderen, men klarer ikke å finne ut hvordan jeg kan lagre JSON svaret jeg får fra HS i en string (der jeg har testet er kommentert ut i koden, nesten nederst).

Hvis noen har en ide, så hyl ut :)

 

Det virker slik det står, hentet litt kode herfra og derfra og skrevet noe selv

 


#include <ArduinoJson.h>

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

int brightness = 0;    // dim level
int fadeAmount = 3;    // how many points to increase/decrease dim level by for each step
int switchState = 0;
int switchPressed = 0;
int lastDimLevel;
double deviceHSValue;
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 5;  //NodeMCU D1
const int pin_B = 4;  //NodeMCU D2
const int pin_SW = 0; //NodeMCU D3
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

const char* ssid = "SSID";  //SSID
const char* password = "PASSCODE";  //Network passcode

IPAddress ip(192, 168, 1, 204); //Set the desired IP address of the ESP
IPAddress subnet(255, 255, 255, 0); 
IPAddress gateway(192, 168, 1, 1); 


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);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  //Serial.println("WiF connected");
  String s = WiFi.macAddress();
  Serial.println(s);
  Serial.println(WiFi.macAddress());
  
 
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());

    
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  pinMode(pin_SW, INPUT);
  currentTime = millis();
  loopTime = currentTime; 


  
  
} 

void loop()  {

  

  HTTPClient http;
  HTTPClient httpOff;
  HTTPClient httpHSValue;

  currentTime = millis();
  if(currentTime >= (loopTime + 5)){
    // 5ms since last check of encoder = 200Hz  
    encoder_A = digitalRead(pin_A);    // Read encoder pins
    encoder_B = digitalRead(pin_B);   
    if((!encoder_A) && (encoder_A_prev)){
      // A has gone from high to low 
      if(encoder_B) {
        // B is high so clockwise
        // increase the brightness, dont go over 255
        if(brightness + fadeAmount <= 99) brightness += fadeAmount;  
        Serial.println(brightness);  

        String dimm = String(brightness);
        http.begin("http://192.168.1.61/JSON?request=controldevicebyvalue&ref=20&value="+dimm); //Set your HS server IP address and ref is device ID
        int httpCode = http.GET();
        //http.writeToStream(&Serial); //Prints the JSON return to serial
        http.end();      
             
      }   
      else {
        // B is low so counter-clockwise      
        // decrease the brightness, dont go below 10
        if(brightness - fadeAmount >= 10) brightness -= fadeAmount;  
        Serial.println(brightness); 

         String dimmOpp = String(brightness);
        http.begin("http://192.168.1.61/JSON?request=controldevicebyvalue&ref=20&value="+dimmOpp); //Set your HS server IP address and ref is device ID
int httpCode = http.GET();
http.end();           
      }   

    }   
    encoder_A_prev = encoder_A;     // Store value of A for next time    
    
     
   
    loopTime = currentTime;  // Updates loopTime
  }

    //Reads the Switch
  switchState = digitalRead(pin_SW);
  //Checks if the Switch has been pressed
  if (switchState == LOW)
  {
    
    switchPressed = 1;
  }
  if (switchState == HIGH & switchPressed == 1)
  {
    Serial.println("Bryter trykket inn");
    
    httpOff.begin("http://192.168.1.61/JSON?request=controldevicebyvalue&ref=20&value=0"); //Set your HS server IP address and ref is device ID
    int httpCodeOff = httpOff.GET();
    httpOff.end();
   /*deviceHSValue = httpHSValue.begin("http://192.168.1.61/JSON?request=getstatus&ref=20");
    int httpHSValueCode = httpHSValue.GET();
     //JSON Parser setup
    StaticJsonBuffer<2000> jsonBuffer;
    
    //char json[] = 
    char json[] = "{\"Name\":\"HomeSeer Devices\",\"Version\":\"1.0\",\"Devices\":{\"ref\":85,\"name\":\"Test dimmbar\",\"location\":\"Unknown\",\"location2\":\"Unknown\",\"value\":26,\"status\":\"26 °C\",\"device_type_string\":\"\",\"last_change\":\"\\/Date(1472668903085)\\/\",\"relationship\":0,\"hide_from_view\":false,\"associated_devices\":[],\"device_type\":{\"Device_API\":0,\"Device_API_Description\":\"No API\",\"Device_Type\":0,\"Device_Type_Description\":\"Type 0\",\"Device_SubType\":0,\"Device_SubType_Description\":\"\"},\"device_image\":\"\",\"UserNote\":\"\",\"UserAccess\":\"Any\",\"status_image\":\"images/HomeSeer/contemporary/Thermometer-00.png\"}}";
    JsonObject& root = jsonBuffer.parseObject(json);
    if (!root.success()) {
    Serial.println("parseObject() failed");
    return;
    }
    deviceHSValue = root["Devices"]["value"];
    Serial.println("HS Verdi");
    Serial.println(deviceHSValue);
    httpHSValue.writeToStream(&Serial); // Denne skulle jeg gjerne ha lagret slik at den kunne vært brukt istedenfor den manuelle "char json[]" som ligger ovenfor
   
 
    httpHSValue.end();
    */
    
    switchPressed = 0;
    lastDimLevel = brightness;
  }
}

  • Like 2
Lenke til kommentar
Del på andre sider

Knall! :D

En variabel for IPen til HomeSeer-serveren, så er det jo bare helt perfekt. :)

 

(Et lite apropros: ESP8266 er bare Wifi-modulen, NodeMCU er selve produktet, altså Arduino-klonen med ESP8266 påmontert. Hvis jeg har forstått det riktig... ;) )

 

 

11 timer siden, Actibus skrev:

Jeg hadde håpet jeg kunne lese ut status av dimmeren via JSON og parse verdien på ESP8266 slik at jeg utifra det kunne sende on/off ved å trykke på rotary encoderen, men klarer ikke å finne ut hvordan jeg kan lagre JSON svaret jeg får fra HS i en string (der jeg har testet er kommentert ut i koden, nesten nederst).

Hvis noen har en ide, så hyl ut :)

Jeg kan ikke "nok Arduino" til å være særlig til hjelp, men jeg bruker jo JSON-interfacet i WinSeer. Så hvis det er noe du trenger generelle svar på... ;) 

Lenke til kommentar
Del på andre sider

Prototype på gang, har demontert en mobil lader, type LG MCS-02ED den passer nesten perfekt inni dimmerboksen (GLE630), kuttet litt av 2 hjørner på kretskortet, loddet kabler på 230v inngangen og på 5v utgangen og inn på Vin på NodeMCU.

Hvis man hadde brukt en ESP 12F som Fermate linker til her, så kunne man fått plass til den også inni boksen, men da må også sette inn en spenningsregulator, da den krever 3-3,6v.

Har laget noen kretskort tidligere, så det hadde jo vært en tanke hvis jeg skulle hatt slike rundt i hele huset, å lage til kretskort med 230-5v og ESP12 og rotary kontroller på samme kortet, men tror det blir med tanken.

 

Skal ha 3 nye dimmere i kjelleren, der blir det nok til at jeg bare setter rotary encoderen/dimmerhjulet i veggboksen og trekker signalkabler frem til en felles NodeMCU, så sant jeg får til å kjøre flere encodere på samme programmet (har ikke testet), da slipper man å mekke til 230v-5v inni boksen, noe elektrikeren antagelig ikke liker veldig godt..

IMG_20160905_191611.jpg

IMG_20160905_191625.jpg

  • Like 1
Lenke til kommentar
Del på andre sider

Har mobilladerne tilkoplet 24/7 ellers i huset, så akkurat det ser jeg ikke på som noe problem, så lenge de er originale og ikke billige kina kopier, en slik sak trekker ikke mange mye strøm heller.

Største problemet med noe slikt er vel at det nok ikke går helt under kategorien for godkjent elektrisk installasjon, så er nok bedre å ha kontrolleren et annet sted koblet til med vanlig støpsel, og heller trekke signalkabler fra veggboksene, evt om det finnes noen 5v power som passer i en veggboks..

Lenke til kommentar
Del på andre sider

  • 3 måneder senere...

Siden det nærmer seg ferdig med snekkerarbeid så tenkte jeg å komme litt videre med dette prosjektet.

Dimmerrattet fra Elko passer ikke på disse rotary encoderne, så har tegnet og bestilt noen i 3D print, hvis de passer greit så legger jeg ut filen her, hvis noen andre blir inspirert.

 

Siden dette skal på plass i samme rom som jeg skal ha den termostaten min (link) så kommer jeg til å koble den til samme Arduino istedenfor en egen NodeMCU, men virkemåten er jo helt lik.

Er såpass fornøyd med hvor raskt det gikk å dimme med JSON at det beholder jeg, men fikk aldri til å parse JSON responsen fra HS, så for å vite status på lyset vil jeg bruke Arduino pluginen for å sjekke om lyset allerede er av eller på, slik at når man trykker inn dimmerattet så slår den seg da av eller på utifra det.

Lenke til kommentar
Del på andre sider

Sykt kult! Hadde nylig en kar fra futurehome på skolen som sa at denne type dimming med den gode gamle elko dimmeren ikke var på markedet, ihvertfall ikke til en forsvarlig pris. Har du funnet ut av alt dette selv? Kjøpte meg nylig en NodeMCU så hadde vært sykt spennende å prøvd å lage dette.

 

Som testprosjekt, ville dette funket helt fint alene uten et system som HomeSeer fks? At den bare kobler seg direkte på nett og styres via en web server?

 

Jeg er ikke så dreven på all denne programmeringen, har bare brukt litt arduino. 

 

 

Lenke til kommentar
Del på andre sider

Du er avhengig av å kunne styre z-wave dimmeren, så du trenger en form for system. For å bruke min kode trenger du et system som kan kontrolleres med JSON kommandoer, har ikke kjennskap til annet enn Homeseer selv, men antar det er flere som støtter det.

Lenke til kommentar
Del på andre sider

  • 2 uker senere...

Har fått kjøpt meg 3D skriver og jobber med dette prosjektet på kveldene nå, mellom oppussing og unger ?

 

Fått laget ratt som passer på encoderen, og holder på å lage en boks som har plass til power, nodemcu og encoderen, bruker power fra Biltema sin USB vegguttak, som jo er godkjent for skjult installasjon, og ikke koster skjorta som Elko sin gjør.

 

Kommer med en oppdatering bare jeg får gjort siste finpussen på boksen ?

Lenke til kommentar
Del på andre sider

16 timer siden, Actibus skrev:

Fått boksen til å passe ikveld, mangler nå bare lokket på toppen som encoderen skal sitte i.

Også må jeg lage en boks som er mindre, til bruk der man ikke trenger integrert power.

 

Dette så jo kjempebra ut. har du lyst til å dele tekningene? jeg har et veldig likt men alikevel ulikt prosjekt jeg arbeider med(og har arbeidet med altfor lenge). Har tegnet noe selv, men dine så noe(les MYE) bedre ut enn mine. ;-)

Lenke til kommentar
Del på andre sider

Dimmerhjulet laget jeg i 123D Design, fordi jeg ville prøve å lage en mer avrundet utgave, men endte opp med flatt hjul, da det ga penest print.

Rattet er tilpasset de rotary encoderne jeg har kjøpt på ebay, regner med de fleste der er like, men her er de jeg har kjøpt: http://www.ebay.com/itm/272163443462?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

dimmerratt c3.stl

dimmerratt v3.123dx

Lenke til kommentar
Del på andre sider

1 time siden, Actibus skrev:

Dimmerhjulet laget jeg i 123D Design, fordi jeg ville prøve å lage en mer avrundet utgave, men endte opp med flatt hjul, da det ga penest print.

Rattet er tilpasset de rotary encoderne jeg har kjøpt på ebay, regner med de fleste der er like, men her er de jeg har kjøpt: http://www.ebay.com/itm/272163443462?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

dimmerratt c3.stl

dimmerratt v3.123dx

Takker og bukker! da blir det printing på meg i morgen. ?

Lenke til kommentar
Del på andre sider

13 minutter siden, xibriz skrev:

Kjempeprosjekt!

I versjon 2. må du bruke en mindre utgave av ESP8266 eller en Z-UNO 1f44d.png

 

Da kan du lage en ganske flat dimmer som ikke trenger veggboks men bare kan klistres på veggen.

Strømforsyning kan da bli et problem...

Men ordnes jo lett med ekstern strømforsyning eller batteri, selv om levetiden nok ikke blir imponerende.

Lenke til kommentar
Del på andre sider

Det hadde vært veldig kjekt, problemet er jo at de trenger strøm, hadde vært genialt om de kunne kjørt på batteri.

ESP8266 ser ut til å ha litt problemer med deep sleep, det hender visst at den "glemmer" kodingen.

 

Men ser at z-uno kan kjøres i sleep med forbruk på rundt 25uA, det kunne jo funket, hvis den våkner raskt ved input.

Kanskje jeg må bestille en etterhvert ?

Lenke til kommentar
Del på andre sider

Jeg tror nok at Z-UNO blir litt stor for en flat dimmer, den lille ESP8266 er nok best. Men hvis det er utfordinger med deep sleep blir det vanskelig med batteri.

 

Har nettopp kjøpt en ZWC-K8, og der er deep sleep så bra at den er nesten umulig å konfigurere med inkludering og assosiasjoner.

 

 

Lenke til kommentar
Del på andre sider

Har ikke sett noe på den siden, legger den til for senere :)

 

Jeg ser et potensielt problem med å kjøre ESP8266 i deep sleep på en dimmer, det vil jo ta tid å gjenopprette WiFi forbindelsen når den kommer ut av søvnen (antar jeg) og man vil jo helst ikke ha noen forsinkelse i det hele tatt.

 

Z-uno er kanskje bedre, men koster jo 25-30 ganger prisen av en ESP ;)

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.