Arduino-somfy control met Telis-4, loop vast, zoek hulp
7 berichten
• Pagina 1 van 1
Arduino-somfy control met Telis-4, loop vast, zoek hulp
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:
De volledige code die ik gebruik
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
Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp
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 en dan loop ik 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.
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 en dan loop ik 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.
Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp
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"
Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp
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.
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.
Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp
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?
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?
Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp
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
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
Re: Arduino-somfy control met Telis-4, loop vast, zoek hulp
harry maak er aub een nieuw onderwerp van.
paul deelen
shooter@home.nl
shooter@home.nl
7 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 27 gasten