Arduino http klient til Homeseer brug.

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Hej.

Så fik jeg endelig lavet en fungerende web klient til Homeseer brug.

Jeg har brugt følgende stumper.

Arduino Uno: http://www.let-elektronik.dk/arduino-uno-r3.html

Arduino ENC28J60 Ethernet Module: http://www.geeetech.com/arduino-enc28j6 ... p-263.html

Arduino 5V Relay Module: http://www.dealextreme.com/p/arduino-5v ... 54?item=16

Som strømforsyning bruger jeg USB Power Adapter/Charger for iPhone 4 http://www.dealextreme.com/p/usb-power- ... plug-48615 . Jeg har nogle 0,5A udgaver, men de kan ikke trække en Arduino med net, så det er nød til at være en 1A.

Jeg bruger en del ebay efterhånden, så det er nok en lidt billigere ebay udgave af de samme kina stumper.

Jeg har brugt jcw ethercard https://github.com/jcw/ethercard efter forslag fra Hauge på chat.

Der er en irriterende fejl, der gør at det første tryk på en kontakt efter en pause falder ud. Det gik der en del tid med. Det kan omgåes ved at sætte serveren ind som default gateway. Jeg har skrevet til mail adressen i eksemplet om fejlen, så må vi se, om der kommer noget ud af det.

Jeg skal bruge klienten til postmelder og ringeklokke melder.

En kontakt tænder en diode og aktiverer et virtuelt device på Homeseer, når post lemmen bliver åbnet, en anden slukker begge dele, når lågen i postkasse bliver åbnet, en tredie aktiverer et relæ og et virtuelt device, den kommer ind mellem ringe trykket og klokken, så jeg kan sniffe trykket.

På Homeseer siden har jeg brugt hamster.asp. En ekstremt simpel stump asp kode, som Hauge viste mig på chat. (Hamster delen må Hauge selv forklare. :-) ) Man kan også fint bruge rover til at modtage URLen på Homeseer, men jeg skal ikke bruge svaret til noget, og synes derfor det virker smartest at undgå en masse svar trafik.

Det gode ved opsætningen er at den kan bruges til rigtig meget. Under testen tænder/slukker den f.eks. en Z-Wave styret lampe. :-) Så hvis man har rør til svagstrøm, kan det f.eks. bruges med et Fuga svagstrømstryk som en måde at få Fuga aktivering af Homeseer. (Måske lidt bøvlet, men hvad. :-) )

Nu mangler jeg "bare" nogle skrue terminaler, jeg har bestilt på ebay. Ulempen ved den måde at handle er en leveringstid på ca. 3 uger, og så "lidt" gravearbejde. Jeg har 6 meter jord ud til postkassen. Men jeg slipper for batterier udendørs.

I øjeblikket ser det sådan ud. :-)
DSCN4192_lille.jpg
DSCN4192_lille.jpg (33.55 KiB) Vist 10634 gange
Hamster.asp

Kode: Vælg alt

 <%enhed = Request.QueryString.item("enhed")
funktion = Request.QueryString.item("funktion")
hs.execx10 enhed, funktion %>
Doernode

Kode: Vælg alt

/* Baseret på getStaticIP.ino demo der følger med jcw-ethercard. https://github.com/jcw/ethercard
2010-11-27 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

2012-05-20 MHN

Der er desværre et problem med at pakkerne bliver sendt til gateways MAC i starten. Det giver nogle spøjse fejl. 
Derfor er gateway nød til at være sat til serveres IP for at undgå fejl med de først pakker.

*/
#include <EtherCard.h>

#define REQUEST_RATE 5000 // milliseconds   Bliver brugt til at sikre, der kun sendes et REQ hvert 5 sekund.

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x31,0x33 }; // ethernet interface mac address
static byte myip[] = { 192,168,x,x }; // ethernet interface ip address
static byte mymask[] = { 255,255,255,0 }; // ethernet interface mask
static byte gwip[] = { 192,168,x,x }; // gateway ip address.  Virker ikke ordentligt, der tabes pakker i starten af sessionen, som et grimt fiks sættes serverens ip ind her.

static byte hisip[] = { 192,168,x,x }; // remote website ip address and port
char website[] PROGMEM = "server.domain.dk"; // remote website name  PROGMEM gemmer i indbygget Flash i stedet for indbygget SRAM

byte Ethernet::buffer[300];   // a very small tcp/ip buffer is enough here
static long timer;

const int postindkast = 4;     // Postkasse indkast magnet kontakt pin nummer
const int postlaage = 5;     // Postkasse låge magnet kontakt pin nummer
const int doertryk = 6;     // Dørklokke trykknap den originale trykknap pin nummer
const int postled =  2;      // Der er post markering  grøn LED pin nummer
const int doerklokke =  3;      // Dørklokker ringer  relæ der styrer den originale klokke pin nummer

// called when the client request is complete  //Til debug formål. 
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  Serial.println((const char*) Ethernet::buffer + off);
}

void setup () {
  Serial.begin(57600);  //opsæt seriel port til debug formål.
  Serial.println("\n[Doernode]");  //debug brug
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller"); //debug brug

  ether.staticSetup(myip, gwip);  //Ip og MAC sat ovenfor
  
  ether.copyIp(ether.hisip, hisip); 
  ether.printIp("Server: ", ether.hisip);  // Må vaere til debug brug.

  pinMode(postled, OUTPUT);    
  pinMode(doerklokke, OUTPUT);  
  pinMode(postindkast, INPUT);  //opsæt input og output benene.
  pinMode(postlaage, INPUT);
  pinMode(doertryk, INPUT);
  
  timer = - REQUEST_RATE; // start timing out right away 
}

void loop () {
  
  ether.packetLoop(ether.packetReceive());
     
    if (digitalRead(postindkast) == HIGH) {  
      
     digitalWrite(postled, HIGH);  //Tænd "der er post" LED
     if (millis() > timer + REQUEST_RATE) {
      timer = millis();
      Serial.println("\n>>> REQ1");  //debug brug
      ether.browseUrl(PSTR("/hamster.asp?"), "enhed=v2&funktion=on", website, my_result_cb); 
   } 
    }
    if (digitalRead(postlaage) == HIGH) {   
     digitalWrite(postled, LOW);  // //Sluk "der er post" LED  
     if (millis() > timer + REQUEST_RATE) {
      timer = millis();
      Serial.println("\n>>> REQ");  //debug brug
      ether.browseUrl(PSTR("/hamster.asp?"), "enhed=v2&funktion=off", website, my_result_cb);  
   } 
    }
    if (digitalRead(doertryk) == HIGH) { 
     digitalWrite(doerklokke, HIGH);  // tænd relæ, start ring med dørklokken
     delay(1000); //Hold relæet 1 sekund for at sikre klokken ringer. Der må så ikke komme post i det sekund, men mon ikke det går. :-) 
     digitalWrite(doerklokke, LOW);  // sluk relæ, stop ring med dørklokken  
     if (millis() > timer + REQUEST_RATE) {
      timer = millis();
      Serial.println("\n>>> REQ");  //debug brug
      ether.browseUrl(PSTR("/hamster.asp?"), "enhed=v1&funktion=on", website, my_result_cb);   
    } 
     }
}

Mvh
Morten

Brugeravatar
Bri_Jac
Indlæg: 1024
Tilmeldt: 05 nov 2008, 21:48
Geografisk sted: Bunkeflostrand

Re: Arduino http klient til Homeseer brug.

Indlæg af Bri_Jac »

Ser godt ud :D

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Her er min dørnode i loddet udgave:
DSCN4197_lille.jpg
DSCN4197_lille.jpg (21.29 KiB) Vist 10598 gange
Så mangler der en kasse og en masse kabling. :-)
Mvh
Morten

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Øv det ser ikke ud til net libet er stabilt. :-(

Når der ikke er sket noget et par dage svigter nettet. Dørklokken ringer godt nok, og den har været en tur over Arduinoen, så Arduinoen kører, men der sker ikke noget på Homeseer.

Er der nogen, der har en genial ide til stabil drift af et ENC28J60 modul?
Mvh
Morten

zwbob
Indlæg: 10
Tilmeldt: 11 jun 2012, 22:02

Re: Arduino http klient til Homeseer brug.

Indlæg af zwbob »

Morten H. Nielsen skrev:Øv det ser ikke ud til net libet er stabilt. :-(

Når der ikke er sket noget et par dage svigter nettet. Dørklokken ringer godt nok, og den har været en tur over Arduinoen, så Arduinoen kører, men der sker ikke noget på Homeseer.

Er der nogen, der har en genial ide til stabil drift af et ENC28J60 modul?
Hej

Første post :)

Har desværre endnu ikke prøvet at arbejde med Ardoino. Ej heller homeseer.
Men går og kraftigt overvejer noget elmåler LED pulsopsamling via Ardoino med ethernet!!

Jeg har derfor læst meget interesseret med, så først og fremmest tak for dit detaljerede indlæg, selvom du ikke har det til at køre stabilt...
Har desværre (selvfølgelig) ikke nogen forkromet løsning på dit problem.
Her er dog hvad jeg ville gøre:

1. Finde og teste andre lib. Eller google om der er nogen andre med samme problem, og om de har fået det løst.
2. Når 1. prioritet er udtømt, så ville jeg forsøge med lappe workaround:
Jeg vil holde gang i http snakken ”hele tiden”.
Den kunne fx sende en simpel ”hallåååå-jeg-lever” pakke, 2 eller 3 gange i minuttet, hvilket ville fylde absolut intet på et ethernet.
Homeseer skulle så tælle op i en endeløs loop på fx 0 – 255 ”AliveCounter”.
Det samme gør Ardoino for hver success pakke.
En anden stump kode i homeseer kan så holde øje med om denne ”AliveCounter” går i stå, og hvis den gør, så sender den en status mail om at ringeklokke http link er gået i stå.

Dette skulle vi gerne undgå, så samtidig med denne overordnede overvågning i Homeseer, skal Ardoino også holde øje med om ”AliveCounter” i Ardoino går i stå.
Og hvis den går i stå, så skal den genstarte kommunikation på ethernet porten.

Håber det hjælper og giver lidt mening... :)

zwbob
Indlæg: 10
Tilmeldt: 11 jun 2012, 22:02

Re: Arduino http klient til Homeseer brug.

Indlæg af zwbob »

Hej Morten

Brugeren nkildal ser ud til at have løst ethernet problematikken.
viewtopic.php?f=3&t=1311&start=15#p6272
Som jeg forstår det, så er der en indbygget watchdog funktion, som kan reset hele arduino boarded.
Så hvis der findes en indbygget funktion, der bare skal enables, så er det da noget nemmere (men ikke nødvendigvis bedre) end at kode sin egen watchdog... :)

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Hej og velkommen til. :-)

Første forsøg bliver at "bruge" http ca. hvert 5. minut. Senere skal jeg i gang med at lede efter en bedre løsning.

Men lige nu har jeg meget mere legetøj end tid. :-) Så jeg prøver den nemme men beskidte måde først. Jeg skal "bare lige" have lagt coden på. Det er blevet noget mere bøvlet, efter den er kommet op at hænge. Jeg skal have lagt Arduino softwaren på en bærbar, og af en eller anden grud vil det ikke køre på min lille atom. :-|

Jeg skal da have kigget på Nicolais løsning. Tak for henvisningen til den, det var gået hen over hovedet på mig.
Mvh
Morten

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Hmm det ser ud til Nicolais opsætning ryger af nettet, selvom den sender data hele tiden. Så der er vist ikke meget fremtid i mine 5 minutters planer. :-|
Mvh
Morten

zwbob
Indlæg: 10
Tilmeldt: 11 jun 2012, 22:02

Re: Arduino http klient til Homeseer brug.

Indlæg af zwbob »

Nej - du må igang med watch dog...
Kode stump fra Nicolai:

Kode: Vælg alt

  // setup WDT
  // Needed because buggy ethernet shield sometimes make Arduino freeze :-(
  wdt_enable(WDTO_8S);
  wdt_reset();
Herefter kaldes wdt_reset i main loop.

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Tja men kræver det ikke, at Arduinoen er gået ned?

Jeg har en Arduino, der kører men ikke kan komme på nettet.
Mvh
Morten

zwbob
Indlæg: 10
Tilmeldt: 11 jun 2012, 22:02

Re: Arduino http klient til Homeseer brug.

Indlæg af zwbob »

Hvis du med jævne mellemrum laver et test http kald, og resetter watchdog hvis det går godt.
Så vil watchdog timeout når den er "hoppet af nettet" og reset Arduino.
Går ud fra at den kommer på nettet igen efter watchdog har udført reset?

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Måske en mulighed. Men det kræver lidt tænke arbejde. :-)

Jeg har ikke prøvet soft boot. Den kommer fint på nettet efter en hard boot.

Lige lidt oplysninger, hvis andre roder med det samme.

Den er faktisk på nettet. Den sender en pakke, men da den ikke reagerer på svaret på den pakke, bliver der aldrig skabt en forbidelse.
Mvh
Morten

zwbob
Indlæg: 10
Tilmeldt: 11 jun 2012, 22:02

Re: Arduino http klient til Homeseer brug.

Indlæg af zwbob »

Den sender en pakke.... - Hvordan konkluderer du egentlig det?
Fra wireshark sniffer?
Eller fra dit serial debug output lige inden du kalder ether.browseUrl?

Morten H. Nielsen
Indlæg: 6266
Tilmeldt: 20 mar 2008, 23:02
Geografisk sted: Danmark

Re: Arduino http klient til Homeseer brug.

Indlæg af Morten H. Nielsen »

Jeg bruger Wireshark på serveren.

Der kommer en pakke frem, serveren svarer på den pakke, men Arduinoen svarer ikke på svaret.
Mvh
Morten

zwbob
Indlæg: 10
Tilmeldt: 11 jun 2012, 22:02

Re: Arduino http klient til Homeseer brug.

Indlæg af zwbob »

OK - det er jo selvfølgelig lidt træls, men der sker jo ikke rigtig noget andet end lidt debug output i din callback, så det burde vel ikke være noget problem i denne konstruktion?
Har du husket at sætte retur code 200 (ok) i dit http reply?

Besvar