kakopappa / sinric

Amazon Alexa Smart home skill / Google Home Action for ESP8266 / ESP32 / Arduino
https://sinric.com
287 stars 166 forks source link

Problème télécommande virtuelle #410

Open slimlesaurien opened 4 years ago

slimlesaurien commented 4 years ago

Bonjours j'ai 2 problèmes avec ma télécommande virtuelle (nodemcu) Alexa et TV codec ir exemple Le premier j'ai rajouté une touche Netflix ne fonctionne pas Le deuxième Tout fonctionne ai au bout d'un certain tant ma télécommande virtuelle ne réagit plus je suis obligé de dire a Alexa d'éteindre la télé et après sa remarche Je débute sur arduino voici mon code et merci d'avance

include

include

include

include

include

include

include

//IR includes and vars

include

include

include

define IR_LED 4 //TODO: Change to your digital pin for IR. default D2

IRsend irsend(IR_LED);

//Start of including vars //Variables starting with 'TV' are ir commands for the TV //Variables starting with 'TELE' are ir commands for DECODER

const unsigned long TV_POWER_H = 0xD5F2A; const unsigned long TV_VOLUP_H = 0xD0F2F; const unsigned long TV_VOLDOWN_H = 0xD1F2E;

const unsigned long TV_INPUT_H = 0x5CFA3; const unsigned long TV_UP_H = 0xA6F59; const unsigned long TV_DOWN_H = 0xA7F58; const unsigned long TV_MUTE_H = 0xC0F3F; const unsigned long TV_P_UP_H = 0xD2F2D; const unsigned long TV_P_DOWN_H = 0xD3F2C; const unsigned long TV_1 = 0xCEF31; const unsigned long TV_2 = 0xCDF32; const unsigned long TV_3 = 0xCCF33; const unsigned long TV_4 = 0xCBF34; const unsigned long TV_5 = 0xCAF35; const unsigned long TV_6 = 0xC9F36; const unsigned long TV_7 = 0xC8F37; const unsigned long TV_8 = 0xC7F38; const unsigned long TV_9 = 0xC6F39; const unsigned long TV_0 = 0xCFF30; const unsigned long TV_NETFLIX_H = 0x10FEF; const unsigned long TV_OK = 0xBFF4;

const unsigned long DELAY_BETWEEN_COMMANDS = 100; //end ir includes and vars

define API_KEY "" // TODO: Change to your sinric API Key. Your API Key is displayed on sinric.com dashboard

define SSID_NAME "" // TODO: Change to your Wifi network SSID

define WIFI_PASSWORD "" // TODO: Change to your Wifi network password

define DEVICE_ID ""

define SERVER_URL "iot.sinric.com"

define SERVER_PORT 80

define HEARTBEAT_INTERVAL 300000 // 5 Minutes

ESP8266WiFiMulti WiFiMulti; WebSocketsClient webSocket; WiFiClient client;

uint64_t heartbeatTimestamp = 0; bool isConnected = false;

void setPowerStateOnServer(String deviceId, String value); void webSocketEvent(WStype_t type, uint8_t * payload, size_t length); void send_ir_TV(unsigned long type, int len);

void setup() { Serial.begin(115200); irsend.begin(); WiFiMulti.addAP(SSID_NAME, WIFI_PASSWORD); Serial.println(); Serial.print("Connecting to Wifi: "); Serial.println(SSID_NAME);

// Waiting for Wifi connect while (WiFiMulti.run() != WL_CONNECTED) { delay(500); Serial.print("."); } if (WiFiMulti.run() == WL_CONNECTED) { Serial.println(""); Serial.print("WiFi connected. "); Serial.print("IP address: "); Serial.println(WiFi.localIP()); }

// server address, port and URL webSocket.begin(SERVER_URL, SERVER_PORT, "/");

// event handler webSocket.onEvent(webSocketEvent); webSocket.setAuthorization("apikey", API_KEY);

// try again every 5000ms if connection has failed webSocket.setReconnectInterval(5000); // If you see 'class WebSocketsClient' has no member named 'setReconnectInterval' error update arduinoWebSockets }

void loop() { webSocket.loop();

if (isConnected) { uint64_t now = millis();

// Send heartbeat in order to avoid disconnections during ISP resetting IPs over night. Thanks @MacSass
if ((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) {
  heartbeatTimestamp = now;
  webSocket.sendTXT("H");
}

} }

// deviceId is the ID assgined to your smart-home-device in sinric.com dashboard. Copy it from dashboard and paste it here

void skipChannel(int channels) { if (channels < 0) { Serial.print("Channel skip down: "); Serial.println(channels); send_ir_TV(TV_P_DOWN_H, 24); } else if (channels > 0) { Serial.print("Channel skip up: "); Serial.println(channels); send_ir_TV(TV_P_UP_H, 24); } }

void adjustVolume(int adjustVolume, bool kvdefault) { if (adjustVolume < 0) { Serial.print("Volume down: "); Serial.println(adjustVolume); if (kvdefault) { send_ir_TV(TV_VOLDOWN_H, 24); } else { for (int i = 0; i < -adjustVolume; i++ ) { send_ir_TV(TV_VOLDOWN_H, 24); delay(DELAY_BETWEEN_COMMANDS); } } } else if (adjustVolume > 0) { Serial.print("Volume up: "); Serial.println(adjustVolume); if (kvdefault) { send_ir_TV(TV_VOLUP_H, 24); } else { for (int i = 0; i < adjustVolume; i++ ) { send_ir_TV(TV_VOLUP_H, 24); delay(DELAY_BETWEEN_COMMANDS); } } } }

void setMute(bool mute) { Serial.print("mute: "); Serial.println(mute); send_ir_TV(TV_MUTE_H, 24); } void setNetflix(bool netflix) { Serial.print("netflix: "); Serial.println(netflix); send_ir_TV(TV_NETFLIX_H, 24); }

void setChannel(String ch) { Serial.print("Changing channel: "); Serial.println(ch); for (unsigned int i = 0; i < ch.length(); i++) { switch (ch[i]) { case '1': send_ir_TV(TV_1, 24); break; case '2': send_ir_TV(TV_2, 24); break; case '3': send_ir_TV(TV_3, 24); break; case '4': send_ir_TV(TV_4, 24); break; case '5': send_ir_TV(TV_5, 24); break; case '6': send_ir_TV(TV_6, 24); break; case '7': send_ir_TV(TV_7, 24); break; case '8': send_ir_TV(TV_8, 24); break; case '9': send_ir_TV(TV_9, 24); break; case '0': send_ir_TV(TV_0, 24); break; } delay(DELAY_BETWEEN_COMMANDS); } delay(DELAY_BETWEEN_COMMANDS); send_ir_TV(TV_OK, 24); }

// use this to send an ir message to the TV void send_ir_TV(unsigned long type, int len) { irsend.sendNikai(type, len); }

void setInput(String value) { Serial.print("Next input selected: "); send_ir_TV(TV_INPUT_H, 24); delay(DELAY_BETWEEN_COMMANDS); send_ir_TV(TV_DOWN_H, 24); }

void turnOn(String deviceId) { if (deviceId == DEVICE_ID) // Device ID of first device { Serial.print("Turn on device id: "); Serial.println(deviceId); send_ir_TV(TV_POWER_H, 24); } }

void turnOff(String deviceId) { if (deviceId == DEVICE_ID) // Device ID of first device { Serial.print("Turn off Device ID: "); Serial.println(deviceId); send_ir_TV(TV_POWER_H, 24); } }

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { switch (type) { case WStype_DISCONNECTED: isConnected = false; Serial.printf("[webSocketEvent] Webservice disconnected from server!\n"); break; case WStype_CONNECTED: { isConnected = true; Serial.printf("[webSocketEvent] Service connected to server at url: %s\n", payload); Serial.printf("[webSocketEvent] Waiting for commands from server ...\n"); } break; case WStype_TEXT: { Serial.printf("[webSocketEvent] get text: %s\n", payload);

if ARDUINOJSON_VERSION_MAJOR == 5

    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.parseObject((char*)payload);

endif

if ARDUINOJSON_VERSION_MAJOR == 6

    DynamicJsonDocument json(1024);
    deserializeJson(json, (char*) payload);      

endif

     String deviceId = json ["deviceId"];
    String action = json ["action"];

    if (action == "setPowerState") {
      // alexa, turn on tv ==> {"deviceId":"xx","action":"setPowerState","value":"ON"}
      String value = json ["value"];
      if (value == "ON") {
        turnOn(deviceId);
      } else {
        turnOff(deviceId);
      }
    } else if (action == "SetMute") {
      // alexa, mute tv ==> {"deviceId":"xxx","action":"SetMute","value":{"mute":true}}
      bool mute = json ["value"]["mute"];
      setMute(mute);
    } else if (action == "SetNetflix") {
      // alexa, mute tv ==> {"deviceId":"xxx","action":"SetMute","value":{"mute":true}}
      bool netflix = json ["value"]["netflix"];
      setNetflix(netflix);  
    } else if (action == "AdjustVolume") {
      // alexa, turn the volume down on tv by 20 ==> {"deviceId":"xxx","action":"AdjustVolume","value":{"volume":-20,"volumeDefault":false}}
      // alexa, lower the volume on tv ==> {"deviceId":"xx","action":"AdjustVolume","value":{"volume":-10,"volumeDefault":true}}
      const char* kcvolume = json ["value"]["volume"];
      bool kvdefault = json["value"]["volumeDefault"];
      int volume = atoi(kcvolume);
      adjustVolume(volume, kvdefault);
    }
    else if (action == "ChangeChannel") {
      //alexa, change channel to 200 on tv ==> {"deviceId":"xx","action":"ChangeChannel","value":{"channel":{},"channelMetadata":{"name":"CH9-200"}}}
      //alexa, change channel to pbs on tv ==> {"deviceId":"xx","action":"ChangeChannel","value":{"channel":{},"channelMetadata":{"name":"pbs"}}}
      String value = json ["value"]["channel"]["number"];
      setChannel(value);
    }
    else if (action == "SkipChannels") {
      //Alexa, next channel on tv ==>  {"deviceId":"xx","action":"SkipChannels","value":{"channelCount":1}}
      // Alexa may say Sorry, TV is not responding. but command works
      const char* kchannels = json ["value"]["channelCount"];
      int skip_ch = atoi(kchannels);
      skipChannel(skip_ch);
    }
    else if (action == "Previous" || action == "Play") {
      // alexa, previous on tv ==> {"deviceId":"xx","action":"Previous","value":{}}
      // alexa, resume tv ==> {"deviceId":"xx","action":"Play","value":{}}
      // Alexa, pause tv ==> says I dont know that one...
      // for others check https://developer.amazon.com/docs/device-apis/alexa-playbackcontroller.html
    }
    else if (action == "SelectInput") {
      // alexa, change the input to hdmi ==> {"deviceId":"xx","action":"","value":{"input":"HDMI"}}
      String value = json ["value"]["input"];
      Serial.println("ChangeChannel arrived with value:");
      Serial.println(value);
      setInput(value);
    }
  }
  break;
case WStype_BIN:
  Serial.printf("[webSocketEvent] get binary length: %u\n", length);
  break;
default: break;

} }

// If you are going to use a push button to on/off the switch manually, use this function to update the status on the server // so it will reflect on Alexa app. // eg: setPowerStateOnServer("deviceid", "ON")

// Call ONLY If status changed. DO NOT CALL THIS IN loop() and overload the server. void setPowerStateOnServer(String deviceId, String value) {

if ARDUINOJSON_VERSION_MAJOR == 5

DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.createObject();

endif

if ARDUINOJSON_VERSION_MAJOR == 6

DynamicJsonDocument root(1024);

endif

root["deviceId"] = deviceId; root["action"] = "setPowerState"; root["value"] = value; StreamString databuf;

if ARDUINOJSON_VERSION_MAJOR == 5

root.printTo(databuf);

endif

if ARDUINOJSON_VERSION_MAJOR == 6

serializeJson(root, databuf);

endif

webSocket.sendTXT(databuf); }