Electro hacks / mods / reparaties

Zipato Zipabox teardown

Door ThinkPad op dinsdag 23 februari 2016 21:04 - Reacties (3)
CategorieŽn: Domotica, Electronica, Views: 3.678

Het kloppend hart van de domotica in mijn woning is de pricewatch: Zipato Zipabox Smart Home Controller

Als echte Tweaker ben ik altijd wel benieuwd wat er nou qua hardware wordt gebruikt in bepaalde producten. Ik bekeek de Zipabox eens en zag dat er geen 'warranty void' stickertjes ofzo werden gebruikt, alleen twee schroefjes. Die losgedraaid en ik kon het apparaatje zo openmaken, de twee helften konden zo uitelkaar worden gepakt.

Wat mij als eerste opviel is dat er een klein luidsprekertje in het apparaat zit. Ik heb er nog nooit geluid uit horen komen. Ben benieuwd waar deze voor gebruikt kan worden? Misschien voor de alarmfunctie van de Zipabox (betaalde feature).

Voorkant van de printplaat:
http://tweakers.net/ext/f/z5cb1MR9x8oGJwOZGHGCQfQ6/full.jpg

Achterkant van de printplaat:
http://tweakers.net/ext/f/3oTWoKK1R2KUfZUffCBAFQJj/full.jpg

De belangrijkste chips op de PCB:
  • LPC3250FET296 - Een ARM-processor van NXP, met een max. kloksnelheid van 266Mhz
  • K9F1G08U0C - 16M NAND Flash-memory van Samsung
  • 2x de K4S561632D-UC75 - 256Mbit SDRAM RAM-geheugen chip van Samsung
  • SD3502A-CNE3 - Z-Wave transceiver van Sigma Designs
  • 25PE20VP - Serial Flash geheugen van STMicroelectronics
  • TUSB2046B - USB-hub van Texas Instruments
  • OTG4E - USB-OTG Full-speed Transceiver van STMicroelectronics
  • MAX5556 - Low-Cost Stereo Audio DAC van Maxim Integrated
  • LM25576 - Step-Down (Buck) Converter van Texas Instruments
  • NXP 8631 0406 - Hier kan ik zo niks over vinden, ik vermoed dat het een audio-versterkertje is
Het geheel wordt gevoed via een externe 12V 1.5A adapter. Besturing loopt via de cloudservers van Zipato.

De USB-componenten zoals de hub (TUSB2046B) vind ik wel apart, zou dit betekenen dat de uitbreidingsmodules zoals de 433Mhz module, P1-module etc eigenlijk gewoon USB-apparaten zijn? Het aansluiten van deze modules verloopt via een soort PCIe-x1 connector. De Zipabox heeft zowel links als rechts een male variant (stuk PCB wat uitsteekt) hiervan, een uitbreidingsmodule heeft een female variant gelijk aan een PCI-Express x1 slot op een moederbord.

Ik heb voor de Zipabox ook nog de Zipabox 433Mhz uitbreidingsmodule gekocht, hiermee kun je 433Mhz apparaten zoals KlikAanKlikUit stekkers aansturen. Deze module heb ik ook even opengemaakt. Het RF-gedeelte wordt afgehandeld door de CC1101 chip van Texas Instruments. Verder zitten er op de 433Mhz module nog een PIC18F25K22 (High Performance RISC CPU) en een 25080D (8-Kb SPI Serial CMOS EEPROM).

http://tweakers.net/ext/f/FJrW3jri8Rmblo0WOxdznUwr/full.jpg

Een Nmap van de Zipabox laat het volgende zien:
root@vm:~# nmap 192.168.1.125

Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-23 20:05 CET
Nmap scan report for 192.168.1.125
Host is up (0.0032s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy
MAC Address: 00:00:00:00:00:00 (Microchip Technology)

Nmap done: 1 IP address (1 host up) scanned in 1.76 seconds
root@vm:~#

Het MAC-adres heb ik even weggehaald ;)

Op poort 22 draait inderdaad een SSH-server:
login as:

Echter ik weet de credentials niet, dus kom er niet in ;)
Op poort 8080 draait een webservice, als ik die open in m'n browser zie ik alleen:
404 Not Found

No context found for request



Als extra bonus nog wat warmtebeeldfoto's, gemaakt met een FLIR One (Android)

Voorkant van de PCB:
http://tweakers.net/ext/f/RpOuoUsak4JvjCEfvUO3TwbB/full.jpg

Achterkant van de PCB:
http://tweakers.net/ext/f/cTXHEtCvWK0lqR4DryVhIZkl/full.jpg

Wat opvalt is dat na het aansluiten van de 433Mhz-module er een component erg warm (76,1 įC) wordt:
http://tweakers.net/ext/f/qous1MVufNrgP8LZpdE6vR7e/full.jpg

Detailfoto (85 įC !):
http://tweakers.net/ext/f/nRBmToU6uNEuGLsAKVLNp067/full.jpg

Het lijkt erop dat dit de MAX5556 is, maar het is lastig te pinpointen.

Hoe dit kan weet ik niet, de Zipabox en de 433Mhz module lijken echter prima te functioneren.

Uitlezen van de slimme meter P1-poort met een Arduino en waarden opslaan in MySQL-database

Door ThinkPad op dinsdag 19 augustus 2014 12:53 - Reacties (34)
CategorieŽn: Electronica, Energiebesparing, Views: 64.821

Zo, het is alweer een tijdje geleden dat ik een blogpost heb geschreven (vorige was in januari 2014 over het nut van een pompschakelaar voor je vloerverwarming. Energiebesparing much?)

Vandaag eentje over het uitlezen van een slimme energiemeter met een Arduino en het opslaan van de informatie in een MySQL-database.

Inhoudsopgave
Inleiding
Monitoren energieverbruik
Slimme meter
De oplossing
Arduino, PHP, MySQL-code
Hardware
Grafisch maken van de data
Gasverbruik uploaden naar Mindergas.nl
Todo list
Het eindresultaat

Inleiding
Ik ben de laatste tijd bezig geweest met het omlaag brengen van m'n energieverbruik. Toen ik samen met m'n vriendin in deze woning trok (nov. '13) heb ik gelijk overal LED-lampen ingedraaid en gezorgd dat de apparaten die veel energie gebruiken zoveel mogelijk A+ of beter zijn. Elektraverbruik is daarmee al best goed, we zitten op ~140 kWh per maand met z'n tweeŽn.

Gasverbruik heb ik ook zoveel mogelijk terug proberen te dringen, door gelijk toen ik hier kwam wonen de CV-ketel te tunen en de radiatoren waterzijdig inregelen.

Monitoren energieverbruik
Volgende stap was het monitoren van m'n energieverbruik, dit ging echter wat lastig. M'n woning (huurwoning uit 1988) beschikte nog over een ouderwetse draaischijf kWh-meter (1987) Deze viel nog wel uit te lezen door met een TCRT5000 IR-sensor te kijken wanneer de zwarte streep voorbij kwam. De gasmeter was echter zo oud (1987) dat deze 0,0 uitleesmogelijkheden had. Geen reflecterend vakje op het telwerk, geen magnetisch veld voor een reedcontact, NIKS.

Slimme meter
Daarom heb ik besloten om een slimme meter aan te vragen via prioriteitsplaatsing. Je betaalt dan §72,60 en dan wordt er een slimme elektra- en gasmeter bij je geplaatst.

Over de voor- en nadelen, privacy etc. van de slimme meter ga ik het hier niet hebben. Dat moet ieder voor zichzelf beslissen, en is genoeg informatie over te vinden op internet. Als je nu nog een oude draaischijfmeter hebt hangen en je hebt/wilt zonnepanelen dan kun je beter bij je huidige meter blijven omdat het salderen veel gunstiger is. Ik heb/wil geen zonnepanelen (want: huurflatje), en voor mij biedt de slimme meter een hoop mogelijkheden voor het nauwkeurig bijhouden van m'n energieverbruik.

Voordeel van de slimme meter is dat je je energieverbruik veel beter inzichtelijk kunt krijgen. De meter heeft namelijk een P1-poort waarover de meetgegevens via een seriŽle verbinding worden uitgestuurd. Deze poort kun je dan uitlezen met een commercieel product, of zelf iets bouwen. Mijn voorkeur ging uit naar het laatste. Ik ben niet vies van een beetje hobbyen, en een commerciŽle oplossing is vaak nogal aan de prijs (~§100).

Je kunt ook je slimme meter gratis op afstand laten uitlezen, bijvoorbeeld via Enelogic. Nadeel is echter dat je geen live verbruik hebt en je kunt pas een dag later het verbruik van afgelopen dag zien. Ook kun je niet zelf bij de data, een beetje lekker klooien met query's (hoe vaak zit m'n verbruik boven de XX watt, hoeveel kWh gebruik ik gemiddeld per dag?) is er dus niet bij.

De oplossing
Er zijn al een hoop hobbyisten die mij zijn voorgegaan hiermee. Vaak wordt er dan naar een Raspberry Pi gegrepen. Leuk, maar in mijn ogen redelijk overkill (een Raspberry draait een Linux omgeving, terwijl ik alleen wat waarden uit een serieel ontvangen bericht wil halen, wat ook prima met een Arduino kan). Ik wilde daarom graag iets bouwen met Arduino gezien de leuke prijs hiervan. Ik heb al een NAS (Synology DS114) draaien waar ook al een webserver + MySQL-database op draait. Een plek om de ontvangen data op te slaan was er dus al.

Voor een Arduino Duemilanove en een W5100 Ethernet shield was ik op eBay samen zo'n 18 euro kwijt. De helft van wat een Raspberry Pi kost :) Dan nog wat klein spul (RJ11 connector, stukje snoer, transistor) wat <3 euro heeft gekost.

Arduino code
Op basis van bestaande Arduino code heb ik een sketch gemaakt die de P1-poort van de slimme meter uitleest en de waarden in een MySQL-database op m'n NAS opslaat.

De basis was deze code. Die heb ik aangepast om tot onderstaande code te komen (met dank aan mede-tweakers die mij in m'n topic geholpen hebben!)


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* Arduino 'slimme meter' P1-port reader.
 
 This sketch reads data from a Dutch smart meter that is equipped with a P1-port.
 Connect 'RTS' from meter to Arduino pin 5
 Connect 'GND' from meter to Arduino GND
 Connect 'RxD' from meter to Arduino pin 0 (RX)
 
 Baudrate 115200, 8N1.
 BS170 transistor & 10k resistor is needed to make data readable if meter spits out inverted data
 
 A .php file is requested (with consumption numbers in the GET request) every minute (interval set at line #52)
 created by 'ThinkPad' @ Tweakers.net, september 2014
 
 http://gathering.tweakers.net/forum/list_messages/1601301
 */

#include <AltSoftSerial.h>
#include <SPI.h>
#include <Ethernet.h>
// AltSoftSerial always uses these pins:
//
// Board          Transmit  Receive   PWM Unusable
// -----          --------  -------   ------------
// Teensy 2.0         9        10       (none)
// Teensy++ 2.0      25         4       26, 27
// Arduino Uno        9         8         10
// Arduino Mega      46        48       44, 45
// Wiring-S           5         6          4
// Sanguino          13        14         12

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0x30, 0x32, 0x31};
IPAddress ip(192,168,4,7);
IPAddress server(192,168,4,4);
EthernetClient client;

const int requestPin =  5;         
char input; // incoming serial data (byte)
bool readnextLine = false;
#define BUFSIZE 75
char buffer[BUFSIZE]; //Buffer for serial data to find \n .
int bufpos = 0;
long mEVLT = 0; //Meter reading Electrics - consumption low tariff
long mEVHT = 0; //Meter reading Electrics - consumption high tariff
long mEAV = 0;  //Meter reading Electrics - Actual consumption
long mG = 0;   //Meter reading Gas

long lastTime = 0;        // will store last time 
long interval = 60000;           // interval at which to blink (milliseconds)

void setup() {
  Serial.begin(115200);
  delay(1000);
  Ethernet.begin(mac, ip);
  delay(1000);
  pinMode(4, OUTPUT);                  // SD select pin
  digitalWrite(4, HIGH);               // Explicitly disable SD

  //Set RTS pin high, so smart meter will start sending telegrams
  pinMode(requestPin, OUTPUT);
  digitalWrite(requestPin, HIGH);
}

void loop() {

  decodeTelegram();

  if(millis() - lastTime > interval) {
    lastTime = millis();   
    //send data to PHP/MySQL
    httpRequest();
    //Reset variables to zero for next run
    mEVLT = 0;
    mEVHT = 0;
    mEAV = 0;
    mG = 0;
    //Stop Ethernet
    client.stop();
  }
} //Einde loop

void decodeTelegram() {
  long tl = 0;
  long tld =0;

  if (Serial.available()) {
    input = Serial.read();
    char inChar = (char)input;
    // Fill buffer up to and including a new line (\n)
    buffer[bufpos] = input&127;
    bufpos++;

    if (input == '\n') { // We received a new line (data up to \n)
      if (sscanf(buffer,"1-0:1.8.1(%ld.%ld" ,&tl, &tld)==2){
        tl *= 1000;
        tl += tld;
        mEVLT = tl;
      }

      // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
      if (sscanf(buffer,"1-0:1.8.2(%ld.%ld" ,&tl, &tld)==2){
        tl *= 1000;
        tl += tld;
        mEVHT = tl;
      }

      // 1-0:1.7.0 = Electricity consumption actual usage (DSMR v4.0)
      if (sscanf(buffer,"1-0:1.7.0(%ld.%ld" ,&tl , &tld) == 2)
      { 
        mEAV = (tl*1000)+tld;
      }

      // 0-1:24.2.1 = Gas (DSMR v4.0) on Kaifa MA105 meter
      if (strncmp(buffer, "0-1:24.2.1", strlen("0-1:24.2.1")) == 0) {
        if (sscanf(strrchr(buffer, '(') + 1, "%d.%d", &tl, &tld) == 2) {
          mG = (tl*1000)+tld; 
        }
      }

      // Empty buffer again (whole array)
      for (int i=0; i<75; i++)
      { 
        buffer[i] = 0;
      }
      bufpos = 0;
    }
  } //Einde 'if AltSerial.available'
} //Einde 'decodeTelegram()' functie

void httpRequest() {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    client.print("GET /www/slimmemeter/p1.php?mEVLT=");
    client.print(mEVLT);
    client.print("&mEVHT=");
    client.print(mEVHT);
    client.print("&mEAV=");
    client.print(mEAV);
    client.print("&mG=");
    client.print(mG);
    client.println(" HTTP/1.1");
    client.println("Host: 192.168.4.4");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    //Request complete; empty recieve buffer
    while (client.available()) { //data available
      char c = client.read(); //gets byte from ethernet buffer
    }
    client.println();
  } 
  else {
    client.stop();
  }
}


Pas indien gewenst het MAC-adres en IP-adres van de Arduino aan (regel 32 & 33). Ook wil je waarschijnlijk het IP-adres van het apparaat waar je MySQL op draait aanpassen (regel 34 & 142).

Het resultaat van bovenstaande sketch is dat er zodra een telegram binnenkomt bij de Arduino, hij de interessante waarden hieruit haalt en daarna elke minuut het PHP bestand op m'n NAS aanroept via een GET-request. In de URL staan de verbruikscijfers uit het P1-telegram.

Oorspronkelijk had ik de sketch zo gebouwd dat van elk telegram wat binnenkwam op de Arduino de waarden werden weggeschreven naar de database. De slimme meter spuugt echter iedere 10 sec. een nieuw telegram uit. Dit zorgt voor enorm veel data (8.640 rijen per dag, 3,15 miljoen per jaar!). Een interval van 1 minuut is ook prima, dat gebruiken veel commerciŽle uitleesoplossingen ook. Mocht je wel willen dat voor elk telegram (elke 10sec dus) de waarden worden weggeschreven, dan kun je de originele code nog terugvinden hier: http://pastebin.com/N7jHBTDu

Let er overigens op dat als je de code upload naar de Arduino, je de hardware van pin 0 loskoppelt. Anders gaan zaken conflicteren met elkaar. Na het uploaden van de sketch kun je het weer aansluiten. Ik heb zelf een 'shield' gemaakt d.m.v. gaatjesprint en header-pinnen. Het shield kan ik zo van de Arduino af trekken en na uploaden er weer op prikken.

Het PHP bestand bevat de volgende code:
p1.php

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
error_reporting(E_ALL);

//Connect to database
$MyUsername = "p1logger";  // enter your username for mysql
$MyPassword = "p1logger";  // enter your password for mysql
$MyHostname = "localhost";      // this is usually "localhost" unless your database resides on a different server

$dbh = mysql_pconnect($MyHostname , $MyUsername, $MyPassword);
$selected = mysql_select_db("p1",$dbh);

//Waardes van vorige wegschrijf actie ophalen
$query = mysql_query("SELECT laag_tarief, hoog_tarief, huidig_verbruik, gas FROM `readings` ORDER BY `readings`.`time`  DESC LIMIT 1");
$row = mysql_fetch_array($query);
$previous_laag_tarief = $row[0];
$previous_hoog_tarief = $row[1];
$previous_huidig = $row[2];
$previous_gas = $row[3];
$min_vermogen = 0;
$max_vermogen = 230*25; //Maximale vermogen = 230V * vermogen hoofdzekering (1x25A)

//Alle opgehaalde variabelen op type 'INTEGER' zetten ivm vergelijken zometeen
settype($previous_elektra, "integer");
settype($previous_huidig, "integer");
settype($previous_gas, "integer");

//GET variabelen naar andere variabele schrijven
$mEVLT = $_GET["mEVLT"];
$mEVHT = $_GET["mEVHT"];
$mEAV = $_GET["mEAV"];
$mG = $_GET["mG"];

//GET variabelen op 'integer' zetten
settype($mEVLT, "integer");
settype($mEVHT, "integer");
settype($mEAV, "integer");
settype($mG, "integer");


//Checken of binnengekomen standen voldoen aan eisen (meterstand = hoger dan vorige, huidig verbruik > minimale vermogen, kleiner dan maximale vermogen) om incorrecte waarden te negeren
if (
    $mEVLT >= $previous_laag_tarief
    && $mEVHT >= $previous_hoog_tarief 
    && $mG >= $previous_gas //Inkomende meterstand moet groter zijn dan vorige meterstand
    && $mG <= ($mG + 6000) //Gasmeter is type 'G6', which stands for max. 6m3/hour. So value can never be bigger than value + 6000
    && $mEAV >= $min_vermogen //Huidig verbruik moet groter zijn dan minimale verbruik (nachtverbruik)
    && $mEAV <= $max_vermogen //Huidig verbruik moet kleiner zijn dan max. vermogen 1fase aansluiting
    ) 
{ 
    $SQL = "INSERT INTO p1.readings (id, time, laag_tarief, hoog_tarief, huidig_verbruik, gas) VALUES (NULL, NULL, '".$mEVLT."', '".$mEVHT."', '".$mEAV."', '".$mG."')";     
    mysql_query($SQL);
}
else { 

    //Foutieve waarden wegschrijven naar tabel voor latere debugging
    $SQL = "INSERT INTO p1.faulty_readings (id, time, laag_tarief, hoog_tarief, huidig_verbruik, gas) VALUES (NULL, NULL, '".$mEVLT."', '".$mEVHT."', '".$mEAV."', '".$mG."')";    
    mysql_query($SQL);
}


?>


Let niet op de PHP code, dit is erg ranzig bij elkaar gehackt. Het werkt voor mij i.i.g. wel. Het zorgt ervoor dat incorrecte waarden zoveel mogelijk worden genegeerd.
Heb je een beter idee dan hoor ik dat graag.

De database (p1) heeft ťťn tabel ('readings'), welke er als volgt uitziet:

code:
1
2
3
4
5
6
7
8
9
10
+-----------------+-----------+------+-----+-------------------+----------------+
| Field           | Type      | Null | Key | Default           | Extra          |
+-----------------+-----------+------+-----+-------------------+----------------+
| id              | int(11)   | NO   | PRI | NULL              | auto_increment |
| time            | timestamp | NO   |     | CURRENT_TIMESTAMP |                |
| laag_tarief     | int(11)   | NO   |     | NULL              |                |
| hoog_tarief     | int(11)   | NO   |     | NULL              |                |
| huidig_verbruik | int(4)    | NO   |     | NULL              |                |
| gas             | int(11)   | NO   |     | NULL              |                |
+-----------------+-----------+------+-----+-------------------+----------------+



Hardware

De hardware is niet heel moeilijk:
Je prikt het Ethernetshield op de Arduino en sluit een kabel vanaf de slimme meter op je Arduino aan.
De P1-poort van de slimme meter gebruikt eigenlijk gewoon een RJ11 telefoonconnector. Je kunt hiervoor eenvoudig zelf een kabel maken. De pinout vind je hier.

De kabel sluit je op de volgende manier op je Arduino aan:

code:
1
2
3
4
5
6
7
+--------------+---------+
| Slimme meter | Arduino |
+--------------+---------+
| RTS (2)      | D5      |
| GND (3)      | GND     |
| RxD (5)      | 0 (RX)  |
+--------------+---------+



Mijn meter (Kaifa MA105) spuugt de data echter geÔnverteerd uit, dus ik moest nog een oplossing maken met een transistor (BS170) en een 10kΩ weerstand. Ook spuugt mijn meter de data uit met 115200 baud i.p.v. 9600. Start/stop bits is 8N1 bij mijn meter. Als jouw meter 7N1 gebruikt zul je dat even weer in moeten bouwen a.d.h.v. de voorbeeldsketch waar ik bovenaan naar link.

Om de data weer terug te inverteren moet je een hardware oplossing maken. Dit kan zoals hierboven genoemd met een simpele transistor (BC547 of BS170) en een weerstand van 10kΩ (schema).

Grafisch maken van de data
Nu de Arduino aan het loggen is wil je natuurlijk ook zien wat je energieverbruik is. Een tabel vol met cijfertjes zegt je waarschijnlijk weinig. Ik heb voor mijzelf een opzetje gemaakt met Highcharts. Met Highcharts kun je vrij eenvoudig grafieken genereren. De grafieken zijn ook op mobiele devices vrij aardig te bekijken.

Ik heb verschillende grafieken:
  • Eentje voor een lijngrafiek van het verbruik (per minuut). Die kun je hier vinden
  • Eentje met staafdiagrammen van het verbruik (elektra & gas) van de huidige maand. Die kun je hier vinden. Deze pagina heeft nog een andere pagina nodig om de data op te halen, die pagina kun je hier vinden.
De code zal vast niet heel netjes zijn opgesteld (ik ben geen fulltime programmeur, puur hobby dit) maar voor mijn doeleinde werkt het prima. Ook is alleen het huidige elektraverbruik zichtbaar. Gasverbruik doe ik nog niks mee.

Gasverbruik uploaden naar Mindergas.nl
Ik hield voorheen altijd handmatig mijn gasverbruik bij via www.mindergas.nl . Mindergas heeft ook een API om meterstanden te uploaden. Nu met deze P1-uitleesmogelijkheid upload ik elke avond automatisch de meterstand naar Mindergas. De code hiervoor kun je vinden in dit topic: http://gathering.tweakers...message/42816734#42816734

Todo list
- Kijken of ik een watchdog kan implementeren. Hoewel de Arduino nu al meer dan drie maanden zonder storingen de gegevens logt, wil ik de sketch zo maken dat hij 24/7/365 kan loggen zonder menselijk ingrijpen. Automatisch resetten bij vastlopen zou dan handig zijn.

Ik ben dit nog aan het uitzoeken, discussie daarover loopt in het topic. Opmerkingen of verbeteringen mbt de Arduino code ook graag daar plaatsen. Reacties op de PHP/MySQL/grafiek mogen hier, dat staat los van de Arduino sketch.

Eindresultaat
http://tweakers.net/ext/f/AIQRc0zbKr4XlOCbQOPrCMRo/full.png

http://tweakers.net/ext/f/bFrCsu0yazzKHc8dgVKlZOk5/full.png

Disclaimer:
Ik ben niet verantwoordelijk voor schade aan je slimme meter, jezelf, je Arduino of andere zaken betrokken in dit project. Uitvoeren op eigen risico!


Een reactie als het goed werkt zou ik waarderen. Verwacht overigens geen hulp als je het niet aan de praat krijgt. Heb helaas geen tijd om inhoudelijke hulp te verlenen. Het is puur bedoeld als opstapje en om de mogelijkheden van een Arduino en wat PHP & MySQL & Highcharts aan te tonen.

Server status stoplicht met Arduino

Door ThinkPad op maandag 29 april 2013 22:13 - Reacties (8)
Categorie: Electronica, Views: 4.963

Inleiding
Ik heb al een tijdje het pakket "PRTG" draaien. Dit is een handig pakket om diverse apparaten mee te monitoren. Ik heb het programma ingesteld naar wens, en een notificatie ingesteld zodat ik een mailtje krijgt als er iets mis is.

Voor elk apparaat dat je monitored kun je triggers instellen, zo heb ik bijv. een trigger ingesteld dat er een waarschuwing moet worden geven als een bepaalde SMB share van m'n fileserver offline is (anders kan de rest van het gezin geen film kijken haha :+ ). Of een trigger die continu naar poort 1723 van m'n VPN virtuele machine luistert, om te kijken of m'n VPN verbinding nog online is. Of een trigger die kijkt of de Crashplan service op een bepaalde VM nog draait, en indien dat niet zo is; automatisch herstart. Mocht het dan nog niet werken > alarm.

Het leuke van PRTG is dat de mogelijkheden eindeloos zijn. Je kunt op heel veel manieren informatie opvragen, en mocht jouw functionaliteit er niet tussen zitten dan zou je zelf een PHP scriptje o.i.d. kunnen maken, en dmv een HTTP sensor de informatie daarvan opvragen.
Oke, maar je had het over Arduino? Hoe/wat dan?
Terug naar het project: Notificaties kreeg ik dus al via de mail. Ik ben sindskort echter ook wat beginnen te spelen met Arduino, en het leek mij wel leuk om in ťťn oogopslag te kunnen zien hoe mijn apparatuur er voor staat. PRTG kent van zichzelf al 3 categorien: OK, Warning, Critical. Dit valt natuurlijk prima te vertalen naar een stoplicht! (Groen, Oranje, Rood). Ik heb eventjes op Marktplaats gekeken voor een echt stoplicht, maar dan praat je over een unit van een meter hoog, dat werd mij toch iets te gek :D

Vandaar dat ik dit heb gemaakt, dit komt in een hoek van m'n kamer te hangen, en zo kan ik ook zonder een PC scherm voor m'n neus te hebben, zien hoe m'n apparatuur er voor staat.
De hardware
De hardware is eigenlijk best simpel:
  • 1x een Arduino Nano
  • 3x TIP120 NPN transistor
  • 1x ENC28J60 Ethernet shield
  • 3x LED Indicator Pilot Signal Light Lamp 12V
  • 1x voeding voor het geheel
  • 1x Lasdoos om het geheel netjes in weg te werken
  • 3x 100-220 Ohm weerstanden om tussen Arduino en transistoren te plaatsen
Meeste komt vanuit China via eBay, voor een habbekrats.

Het hardware verhaal is niet heel interessant om te vertellen, het is eigenlijk gewoon dit schema: https://learn.adafruit.com/assets/2693 maar dan met een losse voeding voor de LEDs. De grijze draad naar de Arduino gebruik ik dus niet, deze komt rechtstreeks vanaf mijn voeding. Denk erom dat je de GND van de voeding ook aan de GND van de Arduino aansluit, anders werkt het niet.
Werking van het geheel
Het idee is dat PRTG een bepaalde URL aanroept op de Arduino met een bepaalde GET parameter. De Arduino zal vervolgens actie ondernemen, en de desbetreffende LED inschakelen. Bij het opstarten van de Arduino laat hij 1 voor 1 alle lampen even branden zodat je weet dat ze alle 3 nog werken ;) Daarna springt hij standaard op groen, totdat hij een verzoek binnenkrijgt.
Instellen van de triggers/notificaties
Het aanmaken van een trigger in PRTG is simpel, ga hiervoor naar "Setup" > "Account instellingen " > "Notificaties"

Daar maken we voor elke 'state' een notificatie aan:

Naam notificatieGebruikte URL
Arduino stoplicht state=criticalhttp://<arduino_ip>/?state=critical
Arduino stoplicht state=warninghttp://<arduino_ip>/?state=warning
Arduino stoplicht state=okhttp://<arduino_ip>/?state=ok


Daarna kunnen we voor een apparaat, of een hele groep de notificaties instellen, ik heb dit als volgt gedaan voor de groep waar al mijn apparaten zich in bevinden:
  • Als sensor is Fout voor 60 seconden, voer uit Arduino stoplicht state=critical
  • Als conditie blijft bestaan voor 300 seconden, voer uit Arduino stoplicht state=critical en herhaal elke 1 minuten
  • Als conditie verdwijnt, voer uit Arduino stoplicht state=ok
Hierna maak je nog een trigger, ditmaal voor 'warning', maar uiteraard stel je dan in de bovenste 2 regels 'warning' in, ipv 'critical' ;) Ik heb er voor gekozen om de trigger elke minuut te herhalen, mocht de Arduino z'n voeding kwijtraken dan springt hij binnen een minuut weer op de juiste status (anders zou hij op groen blijven staan)

Je kunt bij het aanmaken van de notificaties ook gelijk een test doen, probeer dit even, anders heb je nog niks aan dit hele verhaal :+
Eindresultaat
Arduino stoplicht
Klik voor groter


Arduino stoplicht
Klik voor groter

Totale kosten waren rond de 19 euro. Arduino rond de 10 euro, lampjes 5 euro, netwerkmodule 4 euro. En dan nog wat klein spul zoals bedrading, lasdoos etc.
To-do list/wish list
  • Op dit moment schakel ik de stroom gewoon uit 's avonds, misschien dat ik daar nog wat anders op ga verzinnen, al werkt het voor nu prima. Geen idee of het kwaad kan voor de Arduino namelijk
  • Het script werkt nu nog maar een kant op, het werkt alleen als de PRTG server impulsen blijft sturen. Ik wil het nog zo maken dat de Arduino de PRTG server ook om de minuut een ping stuurt, en als dat niet lukt > rode lamp aan
Arduino CODE: http://pastebin.com/QNY4Sxib
Mijn dank gaat uit naar foekie01 voor het meedenken: http://gathering.tweakers...message/40168331#40168331

Je hebt ook de ENC28J60 library nodig, die kun je hier vinden: http://jeelabs.net/projects/ethercard/wiki

ThinkPad T30 accu laden in een ThinkPad uit de T4x serie onmogelijk? Nee hoor!

Door ThinkPad op vrijdag 17 juni 2011 12:27 - Reacties (4)
Categorie: Electronica, Views: 4.204

Mijn vader had nog een accu liggen van een ThinkPad T30. Ik mocht de accu hebben.

Ik heb geen ThinkPad T30, en m'n vader ook niet (meer). Ik was benieuwd naar de gezondheid van de accu, omdat ik hem open wou slopen en de lithium cellen wou gaan gebruiken in de X41 Tablet die ik toen had (is er uiteindelijk niet meer van gekomen, maar goed).

Ik moest hem dus op de een of andere manier aan m'n ThinkPad T40 hangen zodat ik met de IBM Battery MaxiMiser de battery health kon uitlezen.

Ik begon met het vergelijken van de accu aansluitingen, en tot mijn verbazing waren deze (bijna) identiek. Ze hadden allebei de plus en min pool op dezelfde plek zitten. Ik heb het er toen maar op gewaagd en begon met het solderen van een verloopkabeltje.

In een 15" T4x laptop zit een soort converterboardje tussen het moederbord en de Ultrabay (omdat de 15" laptops iets breder zijn dan de 14" ). Dit converterboardje heeft dezelfde aansluiting als de accu, en kon ik dus mooi gebruiken aangezien ik er toch nog eentje had liggen van een kapotte T42.

Het converterboardje heeft een male en female aansluiting, en aangezien ik ze beiden nodig had heb ik met de Dremel het printplaatje in 2en geslepen. Daarna een kabeltje tussen beide connectoren gesoldeerd, en m'n 'verlengkabel' was klaar.
Foto:
http://tweakers.net/ext/f/6rxtpUgLqX098OV71zwI91e7/thumb.jpg
Klik voor groter formaat

Natuurlijk eerst proberen met de accu uit m'n T40 zelf, en dat werkte prima. Toen met bibberende knietjes, en de vrees dat er zometeen misschien een hele boel rook zou onstaan, de T30 accu er aangehangen, en TADAAAA het werkte, het oplaad lampje (batterijtje onderaan scherm) ging branden :D
Foto:
http://tweakers.net/ext/f/qGxFzS0R4NgGrdPvxcqTykjc/thumb.jpg
Klik voor groter formaat

Om te verifieren dat de accu uitgelezen kon worden startte ik IBM Battery MaxiMiser op, en ik kon alle accu details uitlezen 8) Ik kon ook het serienummer zien in dat programma, en het serienummer klopte met wat op de accu stond.

Bewijsfoto:
http://tweakers.net/ext/f/Y0ei4QRnLrwJeTE3sYQWdL1X/thumb.jpg
Klik voor groter formaat

02K7072 = typenummer van een T30 accu

Ik kon de T40 laptop ook gewoon laten werken zonder netstroom op alleen de T30 accu. Erg praktisch is het niet, zo'n accu die erbuiten hangt, maar wel gaaf dat het werkte.

Het is inmiddels al een tijdje geleden dat ik deze mod heb uitgevoerd, ik heb de T30 accu inmiddels al niet meer

Laat weten wat je van deze blogpost vind door te stemmen
http://codecaster.nl/got/rmb/star1.gifhttp://codecaster.nl/got/rmb/star2.gifhttp://codecaster.nl/got/rmb/star3.gifhttp://codecaster.nl/got/rmb/star4.gifhttp://codecaster.nl/got/rmb/star5.gifhttp://codecaster.nl/got/rmb/stats.gif
Met dank aan CodeCaster

fixen van een Samsung 203B met defecte backlight.

Door ThinkPad op vrijdag 3 september 2010 20:51 - Reacties (24)
Categorie: Electronica, Views: 9.226

Zoals gewoonlijk zat ik op V&A te neuzen voor leuk spul, tot ik vorige week ineens een Samsung 203B in defecte staat langs zag komen.

Volgens de aanbieder was de backlight defect.

Omdat ik al eerder TFT schermen heb gerepareerd en dit scherm er voor een leuk prijsje op stond, en het ook nog eens een interessant schermpje is (20", DVI, VGA) durfde ik de gok wel te nemen.

Zo gezegd zo gedaan, en een paar dagen later stond de doos met daarin de monitor op m'n deurmat.

Natuurlijk direct aansluiten, maar er gebeurde weinig. Dus ik m'n DealExtreme mega-awesome uberbright zaklamp erbij gepakt, en daarmee scheen ik op het scherm. Toen zag ik vaag staan: "Check monitor cable". Hij deed het dus wel *O*

Toen het scherm opengeschroefd, en toen kwam ik 5 defecte elco's tegen.

Ik wist dat ze defect waren omdat de bovenkant bij alle 5 bol stond.

De elco's waar het om ging:
4x 820uF 25V
1x 330uF 25V

http://tweakers.net/ext/f/lJWT0dBOEn3CgM5VhfnyoRzr/thumb.jpg
De rood omcirkelde elco's heb ik vervangen. Dit is een foto van eentje met goede elco's ;)

Omdat ik al eens eerder een TFT scherm had gefixt die hetzelfde probleem had (bolle elco's) wist ik nog een goed adresje voor goedkope en goede elco's. Namelijk "De Duitser" (zo noem ik hem :P ).

Op woensdag om 0:43 de 4 elco's besteld, en vanmiddag (vrijdag) lagen ze op de mat. Prima service dus.

Die er gelijk ingesoldeerd, maar hij deed het nogsteeds niet :-( Toen ging ik eens kijken op internet en daar bleek dat de zekering ook nog wel eens springt. Na even zoeken (de zekering ziet eruit als een groene weerstand) de zekering gevonden, die even losgesoldeerd (anders kun je niet betrouwbaar meten), en m'n multimeter zei dat hij oneindig mat. Dus ik om te testen de zekering even vervangen door een stukje draad (ik had nog mooie stukjes over, namelijk de rest stukjes van de pootjes van de elco's )

Monitor gedeeltelijk weer in elkaar gedraaid en..... *trom geroffel*

HIJ DOET HET _O_ *O*

Laat weten wat je van deze blogpost vind door te stemmen
http://codecaster.nl/got/rmb/star1.gifhttp://codecaster.nl/got/rmb/star2.gifhttp://codecaster.nl/got/rmb/star3.gifhttp://codecaster.nl/got/rmb/star4.gifhttp://codecaster.nl/got/rmb/star5.gifhttp://codecaster.nl/got/rmb/stats.gif
Met dank aan CodeCaster