Generellt alt som har med data og teknologi å gjøre.

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()

Bruk pcen til fjernstyrt overvåkning (webcamxp+dropbox)

Du har kanskje lest historien om Macbookeieren som overvåket «tyven»? Han hadde installert et program for å laste opp bilder fra webcammet. Det samme kan gjøres med en windows basert pc.

De aller fleste har i dag et webcam innebygget i sin laptop. Dette kan man enkelt sette opp til å ta bilder/film ved gitte intervaller. WebcamXP er et eksempel på programvare som gjør dette mulig. Dette krever imidlertid en FTP server, eller en epostadresse å sende bildene til. Helt greit i grunn, men FTP server er det ikke alle som har, og eposten vil man kanskje ha fri for slikt. Jeg vil hvertfall unngå å fylle opp min innboks flere hundre Mb i uka med bilder.

Det er her dropbox kommer inn i bildet. Dropbox er en «cloud» tjeneste der du får tilgang til et lagringsområde på internett. Via dropbox programvaren kobles dette området opp mot en mappe på din pc. Dette integreres 100% med mappestrukturen på maskinen din. Kun et lite grønt symbol på mappeikonet viser at dette er en synkronisert mappe. Alt du nå lagrer i denne mappen og undermapper vil automatisk lastes opp mot dropbox. Du får også apps til iPhone og Android som lar deg synke innhold på tvers av telefoner og pcer. Kjekt om bildene fra mobilkameraet er tilgjengelig på pcen din uten å måtte laste de opp via kabel/epost?

Så til poenget. Når du har webcamXP oppe å kjører, så sett den til å lagre bilde fra webcam i en undermappe i din dropbox mappe. Installer dropbox klienten på en annen maskin, og du vil nå hele tiden se hva som foregår der laptopen din er. Forutsatt at den har internettilgang, og at programvaren kjører. For å sikre deg at webcampXP kjøres så bruk valget «kjør som service» under installasjonen. Da vil programmet stare opp i bakgrunnen samtidig med windows.

Et siste tips er å fjerne popup meldingene fra dropbox. Da vil en evt fremmed ikke bli gjort oppmerksom på at dropbox er installert.  Høyreklikk på dropbox ikonet nede i systemtray ( nederst i høyre hjørne der du har klokka) velg Preferences, på General tabben fjern krysset for «Show desktop notifications»

Banzai 4G router – gjennomgang

Tenkte jeg skulle gå igjennom litt basics når det gjelder modemet som leveres fra Banzai.

Har fått lekt litt med denne saken de siste dagene og funnet ut litt fun facts.
Den er produsert av koreanske Infomark, Modellen heter IMW-C610W, med kallenavnet «Biscuit».  Routeren har følgende specs:
Les mer

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)

 

Symantec BESR – Recovery point set is disabled

The other day I run into a problem whilst reconfiguring backup jobs on a server with Symantec Backup Exec System Recovery 2010 (BESR).
I had deleted all backup jobs, and was about to create the new ones. Then i noticed that i could not select the «Create a recovery point set» option, I was only allowed to chose «Independent recovery point.
So i tried to restart the service, -didnt work. Rebooted the server, – didnt work.

After a lot of digging I found a post on Symantec support forum. It appears that BESR is storing information about the backup jobs history and schedules located in .pqh and . files in the following folder:
\Documents and Settings\All Users\Application Data\Symantec\Backup Exec System Recovery\History and \Schedule.

When theese files are present, the BESR manager will assume that it allready exist a recovery point set. In my case there was no .pqj files in the /schedule/ folder, so I only deleted the .pqh files in the /history/ folder. Then i restarted the service, and problem was solved.

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

MySQL og dato, part II

Kalenderen vår er ikke lett å forholde seg til programatisk.
Heldigvis finnes det gode funksjoner innebygget i de fleste utviklingsspråk for å jobbe med datoer.

I prosjektet med [link] dataloggeren for strømforbruket mitt [/link] så lagrer jeg en ny rad i en MySQL tabell en gang i minuttet. Når jeg så skal hente ut grafer så vil dette bli for mange rader, som igjen vil bety for mange datapunkter i grafen. Vi trenger derfor tilføre litt logikk inn i queryen.

Les mer

Datofunksjoner i MySQL

Fant dette hos techotopia, poster det her kun for min egen del, slik at det jeg vet hvor jeg har det neste gang jeg trenger dette. Og det kan jo tenkes at andre også har bruk for dette.

Funksjon Beskrivelse
ADDDATE() Adds date
ADDTIME() Adds time
CONVERT_TZ() Convert from one timezone to another
CURDATE() Returns the current date
CURTIME() Returns the current system time
DATE_ADD() Add two dates
DATE_FORMAT() Format date as specified
DATE_SUB() Subtract two dates
DATE() Extract the date part of a date or datetime expression
DATEDIFF() Subtract two dates
DAYNAME() Returns the name of the weekday
DAYOFMONTH() Returns the day of the month (1-31)
DAYOFWEEK() Returns the weekday index of the argument
DAYOFYEAR() Returns the day of the year (1-366)
EXTRACT Extract part of a date
FROM_DAYS() Convert a day number to a date
FROM_UNIXTIME() Format date as a UNIX timestamp
GET_FORMAT() Returns a date format string
HOUR() Extract the hour
LAST_DAY Returns the last day of the month for the argument
MAKEDATE() Create a date from the year and day of year
MAKETIME MAKETIME()
MICROSECOND() Returns the microseconds from argument
MINUTE() Returns the minute from the argument
MONTH() Returns the month from the date passed
MONTHNAME() Returns the name of the month
NOW() Returns the current date and time
PERIOD_ADD() Add a period to a year-month
PERIOD_DIFF() Returns the number of months between two periods
QUARTER() Returns the quarter from a date passed as an argument
SEC_TO_TIME() Converts seconds to ‘HH:MM:SS’ format
SECOND() Returns the second (0-59)
STR_TO_DATE() Convert a string to a date
SUBTIME() Subtract times
SYSDATE() Returns the time at which the function executes
TIME_FORMAT() Format as time
TIME_TO_SEC() Returns the argument converted to seconds
TIME() Extract the time portion of the expression passed as an argument
TIMEDIFF() Subtract time
TIMESTAMP() With a single argument, this function returns the Date or the Datetime expression. With two arguments, the sum of the arguments is returned
TIMESTAMPADD() Add an interval to a datetime expression
TIMESTAMPDIFF() Subtract an interval from a datetime expression
TO_DAYS() Returns the date argument converted to days
UNIX_TIMESTAMP() Returns a UNIX timestamp to a format acceptable to MySQL
UTC_DATE() Returns the current Universal Time (UTC) date
UTC_TIME() Returns the current Universal Time (UTC time
UTC_TIMESTAMP() Returns the current Universal Time (UTC) date and time
WEEK() Returns the week number
WEEKDAY() Returns the weekday index
WEEKOFYEAR() Returns the calendar week of the date (1-53)
YEAR() Returns the year
YEARWEEK() Returns the year and week

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