Esp8266 pour les pro

Toutes les discussions qui concernent Alexa et les enceintes Echo.
Les demandes d'aide ou de support sont à faire dans la section Aide & Support !
Ludo Civodul
Membre
Membre
Messages : 53
Enregistré le : dim. 17 juin 2018 17:37

Re: Esp8266 pour les pro

Message par Ludo Civodul » ven. 13 juil. 2018 22:37

il y a un paquet de forums qui parlent d'Alexa, mais tous en anglais. Ca ne me gêne pas, mais ça concerne la plupart du temps des 1eres générations d'Echo qui ont l'air moins bridées.
Pour les valeurs de 0 à 100% ou les températures, comme il n'y a que du Belkin qui est en natif dans le soft d'Alexa, il faudrait avoir sous la main des périphériques pour logger les échanges en upnp (configuration.xml, xetup.xml, et les commandes upnp...)
Image

Maison connectée et enceintes Echo ou Google Home

 
piman33
Nouveau
Nouveau
Messages : 29
Enregistré le : mar. 10 juil. 2018 21:19

Re: Esp8266 pour les pro

Message par piman33 » sam. 14 juil. 2018 17:19

Ludo Civodul a écrit :
ven. 13 juil. 2018 21:14
piman33 a écrit :
mer. 11 juil. 2018 07:13
je n' ai pas pû tester car j' ai pas trouvé les pins qui sont configurer en sortie, j ai chercher dans tous le code?
Le code ne contient pas les lignes pour activer ou désactiver les pins.
Il faut déclarer les pin utilisées et les mettre en output dans la fonction setup()
avec l'instruction suivante (une par broche utilisée) : pinMode(pin, OUTPUT)
et les configurer par défaut en Off (en fonction du relai que tu utilises ça peut être en LOW ou HIGH)
avec digitalWrite(pin, LOW) ;

Code : Tout sélectionner

setup(){
...
...
pinMode(pin, OUTPUT)
digitalWrite(pin, LOW)
...

}
Ensuite rajouter du code dans les fonctions RelayXLigtsOn() et Off()
en utilsant l'instruction digitalWrite(pin, value);
-> value = HIGH (1) ou LOW (0) )

Ex :

Code : Tout sélectionner

bool Relay1LightsOn() {
...
...
digitalWrite(pin, HIGH)
De mon côté j'ai configuré les déclenchements pour envoyer des URL pour activer mes lampes en radio (RF) vers un autre ESP qui centralise tous les codes de télécommandes 433 MHz de mes lampes / appareils / prises.

J'ai aussi modifié plusieurs partie du code dont le "setup.xml" dans le fichier switch.cpp.

En modifiant la ligne

Code : Tout sélectionner

<deviceType>urn:Belkin:device:controlee:1</deviceType>
par

Code : Tout sélectionner

<deviceType>urn:Belkin:device:"+ device_type +":1</deviceType>
device_type pouvant être "lightswitch" ou "controlee"

lightswitch => ça affiche un interrupteur dans l'appli Alexa (modifiable en lampe dans l'appli)
controlee => ça affiche une prise de courant dans l'appli Alexa (modifiable en lampe dans l'appli)

Pour changer le device_type en fonction de chaque "device" déclaré, j'ai modifié la fonction "Switch" dans le même fichier switch.cpp pour lui ajouter un argument supplémentaire pour choisir le type.

Code : Tout sélectionner

Switch::Switch(String alexaInvokeName, unsigned int port, CallbackFunction oncb, CallbackFunction offcb)
devient

Code : Tout sélectionner

Switch::Switch(String alexaInvokeName, String typedevice , unsigned int port, CallbackFunction oncb, CallbackFunction offcb)

P.S. : Quand je disais qu'il faudrait ouvrir une section Arduino :mrgreen:
A+
Ludo
desolé je suis miro :D
// change gpio pins as you need it.
//I am using ESP8266 EPS-12E GPIO16 and GPIO14
const int relayPin1 = 16;
const int relayPin2 = 5;


Serial.begin(115200);
pinMode(relayPin1, OUTPUT);
pinMode(relayPin2, OUTPUT);

Ludo Civodul
Membre
Membre
Messages : 53
Enregistré le : dim. 17 juin 2018 17:37

Re: Esp8266 pour les pro

Message par Ludo Civodul » dim. 15 juil. 2018 11:38

Salut piman33,
piman33 a écrit :
sam. 14 juil. 2018 17:19
desolé je suis miro :D
// change gpio pins as you need it.
//I am using ESP8266 EPS-12E GPIO16 and GPIO14
const int relayPin1 = 16;
const int relayPin2 = 5;

Serial.begin(115200);
pinMode(relayPin1, OUTPUT);
pinMode(relayPin2, OUTPUT);
Tu utilises quel script ?
De mon côté, je suis parti du script du lien qu'a donné jerome31 ici :
jerome31 a écrit :
mar. 3 juil. 2018 17:22
Pareil. Ca marche impec sur mon Wemos D1 mini :) Aucun skill.

J'ai utilisé ce code : https://github.com/kakopappa/arduino-es ... emo-switch
Il permet de simuler plusieurs lampe avec un seul ESP8266.
"Alexa allume le bureau", "Alexa allume la chambre". Reste à tester en flashant un module ou prise sonoff.

Ca permet d'envoyer du ON/OFF. Maintenant reste à trouver un moyen de recevoir des valeurs :
"Alexa quelle température fait il dans le bureau " => ESP8266 + DS18B20
Ce script n'a pas de broche de déclarée ni de commande de relai dans les fonctions.

Si j'ai du temps cette semaine j'essaie de faire un post complet à part, récapitulant les modifications que j'ai faites sur ce script.
En attendant une section développement :idea: (où je le mets sur github).

Pour ceux qui veulent comprendre un peu mieux le fonctionnement des requetes UPnP et comment sont configurés les fichiers XML de réponse (in english please) :
http://www.upnp.org/specs/arch/UPnP-arc ... e-v1.1.pdf


A+
Ludo
Image

piman33
Nouveau
Nouveau
Messages : 29
Enregistré le : mar. 10 juil. 2018 21:19

Re: Esp8266 pour les pro

Message par piman33 » lun. 16 juil. 2018 18:06

salut ludo
j ai pas le meme :D le miens je l ai pris je sais plus sur quel lien sur le forum
je me suis embrouiller , j en ai tester plein que j ai pas reussi a faire fonctionné :? :?
je te donne le liens sur le gitehub https://github.com/nassir-malik/IOT-ESP ... ster/wemos
la video https://www.youtube.com/watch?v=OC6QSXzkQU8

tu sais s il y a possibilité d envoyer des requette http avec un nodemcu ou un wemos?
du style " https://user:Password@adresse ip:port/json.htm?type=command&param=switchlight&idx=1051&switchcmd=On

Ludo Civodul
Membre
Membre
Messages : 53
Enregistré le : dim. 17 juin 2018 17:37

Re: Esp8266 pour les pro

Message par Ludo Civodul » lun. 16 juil. 2018 18:53

piman33 a écrit :
lun. 16 juil. 2018 18:06
tu sais s il y a possibilité d envoyer des requette http avec un nodemcu ou un wemos?
du style " https://user:Password@adresse ip:port/json.htm?type=command&param=switchlight&idx=1051&switchcmd=On
Oui c'est tout à fait possible j'utilise cette méthode pour allumer mes lampes qui sont télécommandées en RF433 Mhz.

Il faut utiliser la librairie client du wifi 8266 (8266wificlient de mémoire) je te confirme ça se soir avec un exemple si tu veux.

Merci pour le lien.
Ludo
Image

jerome31
Nouveau
Nouveau
Messages : 18
Enregistré le : dim. 17 juin 2018 16:53

Re: Esp8266 pour les pro

Message par jerome31 » lun. 16 juil. 2018 19:26

Voici un serveur Web minimaliste pour comprendre. Il y a plein d'exemple en cherchant ESP8266WebServer.

Code : Tout sélectionner

// Déclare le serveur Web
#include <ESP8266WebServer.h>
ESP8266WebServer server(80); 

void setup() {
  // Répond à la requete / (racine)
  server.on("/", [](){ 
    server.send(200, "text/plain", "Bienvenue sur le serveur Web");
  });
  
  // Démarre le serveur Web
  server.begin(); 
}
void loop() {
  // Traite les requetes
  server.handleClient();
}
Avec ça ton ESP répond aux requêtes Web mais l'idée est à mon avis de faire le contraire :
"Alexa allume le bureau" -> Ordre reçu par le ESP -> Appel d'une API Web pour déclencher une action (box domotique,...)
Dev JS la journée et bidouilleur Arduino/Rasberry le soir.

jerome31
Nouveau
Nouveau
Messages : 18
Enregistré le : dim. 17 juin 2018 16:53

Re: Esp8266 pour les pro

Message par jerome31 » lun. 16 juil. 2018 19:32

Houlà ! J'ai lu la question à l'envers :)
Voici un exemple d'appel d'une url.

Code : Tout sélectionner

#include <ESP8266HTTPClient.h>

void loop() {
  if (J'ai reçu un ordre reconnu d'alexa) {
    // Je lance une requete
    HTTPClient http;
    http.begin("http://192.168.1.50/monapi.php");
    http.GET();
    http.end();
  }
}
Dev JS la journée et bidouilleur Arduino/Rasberry le soir.

Ludo Civodul
Membre
Membre
Messages : 53
Enregistré le : dim. 17 juin 2018 17:37

Re: Esp8266 pour les pro

Message par Ludo Civodul » lun. 16 juil. 2018 21:05

Bah voilà impeccable. Merci Jerome31 !

Pour utiliser un argument On ou Off, tu peux récupérer l'état du device et son numéro pour l'envoyer à ton script ou ton serveur domotique :

Voici la fonction que j'ai fait pour envoyer mes requêtes (j'ai commenté en français pour la compréhension).
Les serial.print sont là pour le debug et peuvent-être supprimé.

Code : Tout sélectionner

void sendHttpState(int device, bool etat) {

        String s_etat;
        String s_URL;

        if (etat == 0) {
          s_etat = "Off";
        }
        else if (etat == 1) {
          s_etat = "On";
        }

        HTTPClient http;
        Serial.println("[HTTP] begin...");
        
        // configure L'URL à envoyer
        s_URL = URL[device] + s_etat;    // <--- les strings URL[x] sont configurés en tableau et en amont en fonction du device déclaré de 0 à 3

        // Connexion sur l'URL
        http.begin(s_URL);
        Serial.print("[HTTP] GET... ");
        Serial.println(s_URL);
        
        // Envoi du HTTP header
        int httpCode = http.GET();

        // Si httpCode est négatif c'est qu'il y a eu une erreur
        if(httpCode > 0) {
            // Réponse du serveur
            Serial.printf("[HTTP] GET... code: %d\n", httpCode);
        } 
         else {
            // Erreur
            Serial.printf("[HTTP] GET... echouee, erreur: %s\n", http.errorToString(httpCode).c_str());
        }       
        http.end();
}
Image

piman33
Nouveau
Nouveau
Messages : 29
Enregistré le : mar. 10 juil. 2018 21:19

Re: Esp8266 pour les pro

Message par piman33 » lun. 16 juil. 2018 21:29

houla ca devient trop compliqué
tu peux partager ton code wemos modifier stp pour comprendre je vais essayer de modifier pour envoyer les requettes http

piman33
Nouveau
Nouveau
Messages : 29
Enregistré le : mar. 10 juil. 2018 21:19

Re: Esp8266 pour les pro

Message par piman33 » lun. 16 juil. 2018 22:07

j ai commencé doucement

Code : Tout sélectionner

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include <functional>
#include "switch.h"
#include "UpnpBroadcastResponder.h"
#include "CallbackFunction.h"

#define LampeBureau      16

// prototypes
boolean connectWifi();

//on/off callbacks 
bool officeLightsOn();
bool officeLightsOff();
bool kitchenLightsOn();
bool kitchenLightsOff();

// Change this before you flash
const char* ssid = "ssid";
const char* password = "psw";

boolean wifiConnected = false;

UpnpBroadcastResponder upnpBroadcastResponder;

Switch *office = NULL;
Switch *kitchen = NULL;

bool isOfficeLightsOn = false;
bool isKitchenLightstsOn = false;

void setup()
{
  Serial.begin(9600);

  pinMode(LampeBureau, OUTPUT);
  digitalWrite(LampeBureau, LOW);
   
  // Initialise wifi connection
  wifiConnected = connectWifi();
  
  if(wifiConnected){
    upnpBroadcastResponder.beginUdpMulticast();
    
    // Define your switches here. Max 10
    // Format: Alexa invocation name, local port no, on callback, off callback
    office = new Switch("office lights", 80, officeLightsOn, officeLightsOff);
    kitchen = new Switch("kitchen lights", 81, kitchenLightsOn, kitchenLightsOff);

    Serial.println("Adding switches upnp broadcast responder");
    upnpBroadcastResponder.addDevice(*office);
    upnpBroadcastResponder.addDevice(*kitchen);
  }
}
 
void loop()
{
	 if(wifiConnected){
      upnpBroadcastResponder.serverLoop();
      
      kitchen->serverLoop();
      office->serverLoop();
	 }
}

bool officeLightsOn() {
    Serial.println("Switch 1 turn on ...");

    digitalWrite(LampeBureau, LOW); //ajout
    isOfficeLightsOn = true;    
    return isOfficeLightsOn;
}

bool officeLightsOff() {
    Serial.println("Switch 1 turn off ...");

    digitalWrite(LampeBureau, LOW);  //ajout
    isOfficeLightsOn = false;
    return isOfficeLightsOn;
}

bool kitchenLightsOn() {
    Serial.println("Switch 2 turn on ...");

    isKitchenLightstsOn = true;
    return isKitchenLightstsOn;
}

bool kitchenLightsOff() {
  Serial.println("Switch 2 turn off ...");

  isKitchenLightstsOn = false;
  return isKitchenLightstsOn;
}

// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
  boolean state = true;
  int i = 0;
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting ...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 10){
      state = false;
      break;
    }
    i++;
  }
  
  if (state){
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("");
    Serial.println("Connection failed.");
  }
  
  return state;
}

Répondre