Bruke python til å skrive/hente data fra websider.

Dette er kun et lite notat til meg selv. Ifb et scenario i Switchking(SK) vil jeg ha data fra kWh telleren inn i SK. Dette kan jeg gjøre direkte fra SK, men jeg vil jobbe litt med tallene, regne ut snitt pr time, døgn , uke osv. Da har jeg valgt å bruke EventGhost (EG) til dette. EG kan kjøre python. Verdien fra kWh telleren min blir lagret i en MySQL database, jeg har en php fil som spytter ut nåværende forbruk i watt f.eks 2475 . (En snittmåling over de siste 30 sekunder)

I python gjør jeg følgende for å hente ut dette:


import urllib
url = ("http://server.no/kwh.php")
response = urllib.urlopen(url).read()
devicename = 'kWh'
eg.plugins.SwitchkingTellStick.DSSet('',devicename,response,0)

Den siste linjen oppdaterer datakilden med navn «kWh» i Switchking med verdien fra php filen. I dette enkle eksemplet har jeg ikke tatt med verdiene for dag, uke, måned osv.

For å oppdatere device direkte i Switchking kreves det en plugin til EventGhost, den finnes her:  http://eventghost-switchking-plugin.googlecode.com/files/eventghost-switchking-plugin.0.0.5.zip

Man også bruke dette til å sende data andre veien. F.eks om man skal ha en verdi fra python over til web.

I eksemplet nedenfor er det et php script som tar i mot verdier via GET. (variabler i adressen). Verdien som blir sendt er et tilfeldig tall mell 100 og 200.

Man kan selvsagt sende flere verdier samtidig. I php kan man deretter gjøre logiske beregninger, evaluere data  osv før det registreres i databasen.


import random
import urllib
value = str(random.randint(100, 200))
url = ("http://server.no/registrer.php?data=" +value)
web = urllib.urlopen(url).read()

Banzai 4G, overraskende bra.

En av bakdelene med å bo usentralt er dårlig bredbåndstilbud. Maks vi kan få her er ADSL på 3000/400. Da jeg så ble introdusert for Banzai sitt 4G nett (wimax) var jeg naturlignok noe skeptisk da jeg ble fortalt at jeg nå kunne regne med å få 4-5 Mbit trådløst. 3G dekningen her er ikke helt den beste, og jeg hadde liten tro på at Banzai/Nextnet hadde egne master, dvs dekningskartene vil være noenlunde like for disse teknologiene, så fremt basestasjonene er plassert likt.

Jeg valgte så å bestille et 4G abonnement  fra Banzai, det er jo som kjent angrerett på alt man kjøper fra nettet, så om dette ikke innfrir så er det bare å returnere.

Startpakken lå i posten etter noen dager og inneholdt en mobil router og brukerveiledning. Routeren er oppladbar og kan brukes hvor som helst så lenge du har dekning. Routeren har ingen LAN innganger, men den har WLAN og støtter inntil 8 tilkoblede klienter samtidig. Wifi interfacet på routeren er default satt til laveste sendestyrke, dette er nok gjort for å spare på batteriene, på bekostning av svært dårlig rekkevidde. Laptopen min rapportere 2/5 streker på signalindikatoren, og da var jeg i samme rom som routeren. Heldigvis kan man justere opp sendestyrken, jeg kommer tilbake til det om litt.

Routeren har en signal LED som lyser rødt, gult eller grønt avhengig av hvor godt signalet ditt er. Jeg startet med rødt, men etter å ha testet forskjellige plasseringer har jeg nå stabilt grønt lys. Første testene jeg kjørte på hastighet ha meg ca 3.5 Mbit/s, men etterhvert har jeg nå peaket 7.2 Mbit/s. Så raskt nett har jeg i grunn aldri drømt om å få her hjemme. Latency er typisk 50-60 ms, mot 8-9 ms på ADSL linjen. Dette merker man ikke med vanlig surfing. Spiller man over nett vil dette kunne være litt i meste laget.

Etter et par dager med testing ligger snitthastigheten min på 5.9/0.9 Mbit/s, noe jeg er fornøyd med. Jeg vurderer nå faktisk å kutte ut ADSL linjen.

Lenger opp skrev jeg om dårlig wlan rekkevidde på routeren. Dette kan man justere på inne på kontrollpanelet til routeren, som du finner her http://192.168.1.1 Beveg musepekeren over «LAN» og velg Wifi Settings. Midt på siden ser du nå Wifi Network Range, sett denne til Long og du får en merkbar økning i signalstyrken. Jeg vil samtidig anbefale at du endrer SSID. Vi har hatt flere tilfeller her til lands der ISP`er har vært for sløve med algoritmene som genererer nettverksnøkler. Slik at disse har man kunne kalkulerere seg frem til utifra SSIDen.

Routeren har et helt greit kontrollpanel der du finner alt det du forventer på en router i dag. Du kan selvsagt endre vanlige nettverksinstillinger som lokal ip adresse, dhcp range, dhcp lease, reserveringer osv. Her har du også mulighet til å sette opp MAC filtreringer, egendefinert ruting, portforwarding ( NAT ), evt sette en egen host i DMZ. Sistnevnte er ganske praktisk om du ønsker å tilknytte en egen brannmur/router i nettet ditt.

Alt i alt strålende fornøyd med denne løsningen, og venter nå spent på at de skal skur opp hastighetene sine. (Wimax støtter i teorien hastigheter opp mot 70-80 Mbit/s)

 

DS18B20 tempsensor og Arduino

For å enkelt kunne snakke med 1wire enheter fra en Arduino finnes det library (OneWire.h) for dette, det finnes her  http://www.arduino.cc/playground/Learning/OneWire Men denne er veldig generell mot 1wire, og ikke tilpasset tempsensorene noe særlig.

Jeg bruker DS18B20 sensorene,  og de krever en del kode for initieres, og for så å lese av verdiene.

For å lese ut temperaturen med OneWire.h biblioteket vil koden se slik ut:

#include 

// DS18S20 Temperature chip i/o
OneWire ds(5);  // on pin 10
byte inne[8] = { 0x28,0x2A,0xDE,0x5E,0x02,0x00,0x00,0x19 };
void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
}

void loop(void) {

  readTemp(inne);
}

void readTemp(byte* addr){

  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte data[12];

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      //Sendmail CRC
      return;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not

  ds.reset();
  ds.select(addr);
  ds.write(0xBE);         // Read Scratchpad
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8 ) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  if (SignBit) // If its negative
  {
     Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
     Serial.print("0");
  }
  Serial.println(Fract);

}

Altså veldig mye kode, samtidig som temperaturen blir gitt i form av to variabler, et heltall, og så desimalene for seg selv.

Men etter litt leting fant jeg et library som var egnet for tempsensorene. Det ligger også tilgjengelig på arduino.cc, men litt gjemt: DallasTemperature.h Legger ved dette biblioteket her, slik at det er tilgjenglig. Siste versjon kan til enhver tid hentes fra http://www.milesburton.com.

Et eksempel for å lese ut temp ved hjelp av DallasTemperature.h:

#include
#include
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress innetemp = { 0x28, 0xF0, 0x12, 0x5F, 0x02, 0x0 , 0x0, 0x9E };
void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(innetemp, 12);
}

float printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.println(tempC);
  return tempC;
}

void loop(void)
{
sensors.requestTemperatures(); // Send the command to get temperatures
float inne = printTemperature(innetemp); // Use a simple function to print out the data
Serial.print("INNE TEMP:");
Serial.println(inne);

}

Wattwatcher 0.2 – Nå med templogging og sms varsling

Fikk gjort om koden litt slik at den nå enkelt kan støtte flere kWh målere, samt at jeg nå har en 1wire port.  Dette lar meg logge temperaturer på sensorer(DS18B20) i hele huset på kun 1 ledningspar i en cat5 kabel. Kabelen kan ha en lengde på opptil 300m.

Les mer om 1Wire Templogging med Arduino

Jeg har også laget 3.5mm jack kontakter til LDR sensor, lcd og  1Wire nettet. Dette satt jeg på et custom  ProtoShield som nå kan stackes mellom Arduino og Ethernet shieldet.


Les mer

Lekt litt med Arduino – wattwatcher 0.1

Har lenge logget strømforbruk manuelt. Jeg byttet ut sikringsskap og strømmåler for en stund siden, den nye måleren har en pulsdiode, som pulserer 10.000 ganger pr kWh forbrukt strøm.  Dette kan man bruke til å logge hvor mye strøm man bruker.

Jeg har i det siste lekt litt med Sebastian Stenmarks «EKKO» (klikk for info) og dette vekket interessen for microkontrollere.

Det ene førte til det andre og så satt jeg med en stor pappeske fra Sparkfun. Deriblandt en rekke sensorer, arduino brett, og div utstyr som loddestasjon osv. Det begynte med en enkel krets som inkluderte en 10k resistor og en LDR. (light dependent resistor) Arduinoen ble programmert til å telle antall pulser, og sende verdiene serielt til pc`n samt vise de på en LCD skjerm.
Les mer