Arduino-somfy control met Telis-4, loop vast, zoek hulp

Arduino specifieke Software
Berichten: 3
Geregistreerd: 15 Okt 2019, 20:52

Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor hoeby » 15 Okt 2019, 21:03

Ben bezig met een stukje home-domotica.
Daarbij wil ik de jaloezieën van somfy kunnen bedienen.
Heb daarvoor een script gevonden welke een somfy telis afstandsbediening bedient. Daarbij leest deze de LED's van het geselecteerde kanaal, alvorens het bediencommando te geven. Dit werkt allemaal, zover het maar 1 bediencommando is. Dit op basis van HTTP met de internet shield-2 op de arduino

Wat ik graag zou willen is het volgende.
Ik geef commando om kanaal 1 te bedienen. Dan wordt kanaal 1 ook bedient, maar vervolgens springt hij automatisch 1 kanaal verder en bedient deze ook.

Ik heb een case A aangemaakt.
Maar deze geeft alleen het eerste commando, niet de codering die eronder bij geschreven is.
Weet iemand wat ik fout doe?

Het gaat dit stuk wat ik toegevoegd heb:
Code: Alles selecteren
             case 'a': press_button(SOMFY_BUTTON_DOWN);
                          ichx=cmd[1]-'1'+2;
       
                         // select the channel
                         if (ichx>=1 && ichx<=5){     
                           if(select_channel(ichx)){
                            press_button(SOMFY_BUTTON_DOWN); break;
                           }
                         }


De volledige code die ik gebruik
Code: Alles selecteren
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet2.h>

// digital pin numbers for LED connections
#define SOMFY_LED1_APIN 17
#define SOMFY_LED2_APIN 16
#define SOMFY_LED3_APIN 15
#define SOMFY_LED4_APIN 14

// digital pin numbers for button connections
#define SOMFY_BUTTON_UP   6
#define SOMFY_BUTTON_DOWN 8
#define SOMFY_BUTTON_MY   7
#define SOMFY_BUTTON_MENU 9

// Ethernet setup
byte mac[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
IPAddress ip(XXX,XXX,XXX,XXX); // IP address
EthernetServer server(XX);  // create a server at port XX

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pins as an output.
  pinMode(SOMFY_BUTTON_UP,   OUTPUT);
  pinMode(SOMFY_BUTTON_DOWN, OUTPUT);
  pinMode(SOMFY_BUTTON_MY,   OUTPUT);
  pinMode(SOMFY_BUTTON_MENU, OUTPUT);
 
  // delay setup to prevent digital outs to go high during serial initialization
  delay(1000);
   
  Ethernet.begin(mac, ip);  // initialize Ethernet device
  server.begin();           // start to listen for clients

  Serial.begin(9600); // set up Serial library at 9600 bps
  Serial.println("Arduino started!");
}

// function to press a button on the remote
int press_button(int button){
  digitalWrite(button, HIGH);
  delay(150);
  digitalWrite(button, LOW);
}

// function to get the current channel on the remote
// LEDs need to be blinking, i.e. channel selection button must have been pressed
int get_channel(){
 
  int sel_channel=0;  // the current channel
  int iLED1=1;        // status LED1: 1=OFF, 0=ON
  int iLED2=1;        // status LED2: 1=OFF, 0=ON
  int iLED3=1;        // status LED3: 1=OFF, 0=ON
  int iLED4=1;        // status LED4: 1=OFF, 0=ON
  int iLEDs;          // status LED1-4 in a byte
 
  // read the LEDs from the remote and determine the current channel
  // make sure we detect a blinking LED, they go on and off for about 70ms
  // the body of the loop takes <1ms, so check every 10ms during 100ms to capture a full cycle
  // time1=millis();
  for (int i=0; i<10; i++){
    iLED1 &= digitalRead(SOMFY_LED1_APIN);
    iLED2 &= digitalRead(SOMFY_LED2_APIN);
    iLED3 &= digitalRead(SOMFY_LED3_APIN);
    iLED4 &= digitalRead(SOMFY_LED4_APIN);
    delay(10);
  }
 
  iLEDs = iLED4<<3 | iLED3<<2 | iLED2<<1 | iLED1;
  switch(iLEDs){
    case 14: sel_channel=1; break; // LED1, channel 1 selected
    case 13: sel_channel=2; break; // LED2, channel 2 selected
    case 11: sel_channel=3; break; // LED3, channel 3 selected
    case 7:  sel_channel=4; break; // LED4, channel 4 selected
    case 0:  sel_channel=5; break; // ALL,  channel 5 selected
   
    default:  sel_channel=0;       // no LEDs are blinking
  }
 
  return sel_channel;
}

// function to select a channel on the remote
// return true if succeeded
// return false if something has gone wrong
bool select_channel(int ch){
 
  int curr;    // current channel
  int prev=-1; // previous channel
  int t=0;     // counter, if after 10 channel reads after button press the channel is not OK, something is wrong
 
  // while the current channel is not equal to channel 'ch' go to the next channel by pressing the channel select button
  // the button is only pressed when the previous channel selection changed, because get_channel
  while((curr=get_channel())!=ch && t<10){
    t++;
    if (prev<0 || (curr!=prev && curr>0)){
      press_button(SOMFY_BUTTON_MENU);
      prev=curr;
      t=0;
    }
  }
 
  return t<10 || curr==ch;
}

bool select_channelt(int cht){
 
  int currt;    // current channel
  int prevt=-1; // previous channel
  int tt=0;     // counter, if after 10 channel reads after button press the channel is not OK, something is wrong
 
  // while the current channel is not equal to channel 'ch' go to the next channel by pressing the channel select button
  // the button is only pressed when the previous channel selection changed, because get_channel
  while((currt=get_channel())!=cht && tt<10){
    tt++;
    if (prevt<0 || (currt!=prevt && currt>0)){
      press_button(SOMFY_BUTTON_MENU);
      prevt=currt;
      tt=0;
    }
  }
 
  return tt<10 || currt==cht;
}

// get the URL command send by the web client
int get_url_cmd(EthernetClient client, char *s, int n){
// get the command from the client, max 'n' chars after "GET /"
// store the command in buffer 's'
 
  int len; // number of characters read

  // find GET
  s[0]=0;
  if (client.find("GET /")){                 
    // read max 10 chars as command
    len=client.readBytesUntil(' ',s,n);
    s[len]=0;
  }               
}

// process the URL command send by the web client
int process_cmd(char* cmd){
// do something with the 'cmd' received from the client
//
// A command consists of max 3 characters:
//
//  SOMFY CHANNEL COMMAND:
//
//      c<channel><action>
//         
//        <channel>: number between 1-5
//        <action>:  'u' for up
//                   'd' for down
//                   's' for stop
//         
//  example: "c2u" sends an up command to the Somfy remote on channel 2

char ich;  // the channel to select
char ichx;  // the channel to select
   
if (strlen(cmd)==3){
 
  switch (cmd[0]){           
    case 'c': // Somfy channel command
       // get the channel number
       ich=cmd[1]-'1'+1;
       
       // select the channel
       if (ich>=1 && ich<=5){     
         if(select_channel(ich)){
       
           // perform the action
           switch(cmd[2]){
             case 'u': press_button(SOMFY_BUTTON_UP);   break;
             case 'd': press_button(SOMFY_BUTTON_DOWN); break;       
             case 's': press_button(SOMFY_BUTTON_MY);   break;     
             case 'a': press_button(SOMFY_BUTTON_DOWN);
                          ichx=cmd[1]-'1'+2;
       
                         // select the channel
                         if (ichx>=1 && ichx<=5){     
                           if(select_channel(ichx)){
                            press_button(SOMFY_BUTTON_DOWN); break;
                           }
                         }
             default: ;
            }
          }
          else{
           //Serial.println("Channel selection failed!");
          }
        }
        break;
                   
    default:
     ;
  }
 }
}

// send a HTML page back to the web client
int return_page(EthernetClient client, char *s){
  //respond to the client
 
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE html>");
  client.println("<html>");
  client.println("<head>");
  client.println("<title>Arduino Web Page</title>");
  client.println("</head>");
  client.println("<body>");
  client.println("<h1>Hello from Arduino!</h1>");
  client.println("<p>A web page from the Arduino server</p>");
  client.print("<p>");
  client.print(s);
  client.println("</p>");
  client.println("</body>");
  client.println("</html>");
}

// the main loop
void loop(){
 
  char cmd[5]; // buffer to store the command from web client
 
  EthernetClient client = server.available();  // try to get client
 
  if (client) {  // got client?
    while (client.connected()) {
      if (client.available()) {   // client data available to read
       
        get_url_cmd(client, cmd, 3);
        process_cmd(cmd);
        return_page(client,cmd);
             
        break; // abort while loop 
      }
    }
     
    delay(1);      // give the web browser time to receive the data
    client.stop(); // close the connection   
  }
}


Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor Koepel » 16 Okt 2019, 00:41

Hallo.

Waar heb je zulke slechte code gevonden ?

Iemand heeft een bestaande sketch voor een webpagina gepakt, en dat uitgebreid met Somfy dingen. De globale indeling, de structuur en de uitwerking van sketch zijn wat mij betreft onvoldoende. Er is geen gestroomlijnde manier om er iets aan toe te voegen.
Dus als je vraagt: "Wat moet ik dan doen", dan kijk ik :shock: en dan loop ik :mrgreen: aan, want dat weet ik ook niet :?

Met jouw 'a' ga je naar volgende kanaal, maar voordat de 'a' wordt uitgevoerd is er al een select_channel(ich) die de knoppen al heeft bedient om bij het kanaal terecht te komen. Nu wil je weer de knoppen gaan bedienen terwijl de Somfy nog op een bepaald kanaal stond.

Berichten: 3
Geregistreerd: 15 Okt 2019, 20:52

Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor hoeby » 16 Okt 2019, 08:43

Koepel schreef:Waar heb je zulke slechte code gevonden ?


Deze heb ik uit een blog gevonden.
Omdat ik op zoek was naar somfy control, toen kwam ik dit script tegen en leek me aan te sluiten bij wat ik zocht.

Voor een niet programmeur, lijkt de code best netjes in elkaar te zitten.
Maar heb je wel tips of tricks om me op weg te helpen. Dat hoeft niet perse in deze code, kan ook een tip zijn van "kijk hier of daar eens naar"

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor Koepel » 16 Okt 2019, 09:40

Ik weet niet precies hoe de bediening van de Somfy gaat, dus ik kan ook niet zomaar iets toevoegen aan de sketch.

De blog heb ik kunnen vinden: http://somfy-domotica.blogspot.com/.

Wat je wilt bereiken, kun je dat op een andere manier doen ?
Bijvoorbeeld een commando geven via ethernet, dan een pauze, dan een commando voor het volgende kanaal, enzovoorts.

Berichten: 3
Geregistreerd: 15 Okt 2019, 20:52

Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor hoeby » 16 Okt 2019, 17:42

Dat is inderdaad de blog waar ik het vandaan gehaald heb.

Wat is het doel:
De arduino stuurt de knoppen van de somfy afstandsbediening, door de outputs van de arduino
De afstandsbediening heeft 4 kanalen. Door de LED's op de inputs van de arduino te koppen, weet de arduino welk kanaal gekozen is.
Als je via HTTP een commando kan geven aan de arduino welke kanaal deze moet gaan aansturen en dan open/dicht/favoriet knop bedienen.
Maar het hoeft niet altijd te zijn dat je eerst kanaal 1 wilt, dan 2 etc. Dit kan willekeurig zijn. Ook het open/dicht/favoriet kan willekeurig zijn.

Heb je tips naar een pagina voor jouw voorbeeld, waar ik informatie kan vinden?

Berichten: 34
Geregistreerd: 04 Nov 2018, 11:11
Woonplaats: Delfzijl

Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor HarvdLaan » 19 Jan 2021, 17:31

Ik ben al een tijdje bezig met het uitlezen " proberen " van de afstandsbediening van de zonnewering.
De bedoeling is vrij simpel in eerste instantie.
Tijdens de vakantie bij teveel zon de zonnewering naar beneden.
Het lukt mij wel om de codes uit te lezen van een Perel afstandsbediening van een paar stopcontacten.
Bij de Somfy Telis 4 , patio RTS komt er niets uit. Beide zijn 433 MHz aan de nieuwe aangeboden exemplaren te zien .
Wat mij verontrust is dat bij de type aanduiding ook
GI224L2 !
Andere frequentie?
Wie kan mij op het juiste spoor zetten?

Groet
Harry

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp

Berichtdoor shooter » 20 Jan 2021, 16:47

harry maak er aub een nieuw onderwerp van.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 35 gasten