Three Channel WiFi Relay / Thermostat Board

Revision for “Three Channel WiFi Relay / Thermostat Board” created on April 11, 2015 @ 11:11:11

Title
Three Channel WiFi Relay / Thermostat Board
Content
&nbsp; <h1>Three Channel WiFi Relay / Thermostat Board</h1> The Three Channel WiFi Relay / Thermostat Board is a open software/hardware multi-purpose relay board based on the <a href="https://espressif.com/en/products/esp8266/" target="_blank">ESP8266</a> WiFi SoC. It can control up to three AC or DC loads over the Internet using web UI or MQTT. <a href="http://harizanov.com/wp-content/uploads/2015/02/oshw-logo-100-px.png"><img class="aligncenter size-full wp-image-3972" src="http://harizanov.com/wp-content/uploads/2015/02/oshw-logo-100-px.png" alt="oshw-logo-100-px" width="95" height="100" /></a> <hr /> <h2> Highlights</h2> <ul> <li>Powered by the popular <a href="https://espressif.com/en/products/esp8266/" target="_blank">ESP8266 </a>WiFi SoC</li> <li>On-board power supply unit (optional)</li> <li>Up to three <a href="http://www.te.com/catalog/pn/en/3-1393239-6" target="_blank">high quality 10A relays</a> for switching AC or DC loads (see DC switching notes)</li> <li>Built-in web server with mobile device friendly UI and HTTP API to control the relays</li> <li> <ul> <li>Thermostat function with weekly scheduling</li> <li>Manual relay control via the UI</li> </ul> </li> <li><a href="http://en.wikipedia.org/wiki/MQTT" target="_blank">MQTT </a>support</li> <li><a href="http://en.wikipedia.org/wiki/Network_Time_Protocol" target="_blank">NTP</a> for network time and scheduling functionality</li> <li>Web server settings, including HTTP port and basic HTTP authentication setup</li> <li>Broadcast relay/sensor data using HTTP GET to services like <a href="https://thingspeak.com/" target="_blank">ThingSpeak</a> or <a href="http://emoncms.org" target="_blank">emonCMS</a> <ul> <li>Integration with ThingSpeak for charting/analytics visualization</li> </ul> </li> <li>Temperature sensor support (one of them, not both at the same time) <ul> <li><a href="http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" target="_blank">DS18B20</a>, supports multiple sensors</li> <li><a href="https://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf" target="_blank">DHT22 (AM2302)</a></li> </ul> </li> </ul> <strong><span style="color: #ff0000;">NOTE: The board connects to and controls high voltage, knowledge and attention is required when installing it. It is recommended to use the compatible enclosure to prevent electrical shock.</span></strong> <hr /> <h2>Board schematic &amp; layout</h2> Three Channel WiFi Relay/Thermostat Board schematic and board layout files are available on <a href="https://github.com/mharizanov/ESP8266_Relay_Board/" target="_blank">GitHub</a> [gallery columns="2" size="medium" ids="3730,3729"] The PCB is 2mm thick with 35 micron foil. [gallery columns="2" size="medium" ids="3760,3759"] [gallery size="large" ids="3869,3868,3867"] <hr /> <h2>Firmware</h2> The latest firmware is available on <a href="https://github.com/mharizanov/ESP8266_Relay_Board" target="_blank">Github</a>. Firmware can be update using a *<strong>3.3V</strong>* FTDI cable, check the dedicated section of this WIKI. <hr /> &nbsp; <h2>Enclosure</h2> The PCB is designed to fit in a high quality DIN rail-friendly <a href="http://www.bernic.dk/" target="_blank">enclosure</a>. It is highly recommend to use the enclosure to protect yourself from electrical shock. Knock-out entries on the side lid allow custom configuration on the outputs: [gallery size="medium" ids="3767,3771,3769,3772,3768,3770"] <hr /> <h2> Powering it up</h2> <ul> <li>The board can be powered as follows <ul> <li>Through the <a href="http://www.farnell.com/datasheets/1855725.pdf" target="_blank">on-board power supply</a> module, if installed</li> <li>Via the USB plug</li> <li>Via the DC power terminal next to the USB plug (7-10V DC)</li> <li>Via the FTDI header using a <strong>3.3</strong>V Logic Level FTDI cable (it still supplies 5V to the power pin)</li> </ul> </li> <li>Mind the live and neutral markings on the board, make sure Live wire connects to the <strong>L</strong> side of the screw terminal:<a href="http://harizanov.com/wp-content/uploads/2015/02/esp8266_relay_board_brd_in.png"><img class="alignnone wp-image-3731 size-large" src="http://harizanov.com/wp-content/uploads/2015/02/esp8266_relay_board_brd_in-1024x345.png" alt="esp8266_relay_board_brd_in" width="700" height="236" /></a></li> </ul> <span style="color: #ff0000;">NOTE:</span> <span style="color: #ff0000;">When connected to AC, handle the board with extreme care. Bottom and top of the high side of the board will be live and accidental touch may result in injury or death.</span> <span style="color: #993300;"> </span> <hr /> <h2> Connecting AC loads</h2> Loads can be connected to the screw terminals next to the relays, please mind connecting Live and Neutral lines respectively. NOTE: The relays are rated 10A, however I'd rather not utilize all three of them at maximum load, as that would cause 30A current to flow through the source AC screw terminal &nbsp; <hr /> <h2> Connecting DC loads</h2> The board can be used for DC load switching, if the power supply unit is <span style="text-decoration: underline;">not populated</span> on the board. Power the board from the USB connector or DC input. Connect positive to the L and negative to the N side of the screw terminal. <hr /> <h2> Configuring the board</h2> The board's parameters are configured through web UI. Upon first boot, the board will enter Access Point mode and you will be able to see it as such by scanning the WiFi networks. The Access Point name would start with "ESP_" followed by the access point MAC address. There will be no security or password. The access point will be switched off after a successful connection to the wireless network. <a href="http://harizanov.com/wp-content/uploads/2014/11/AP-mode.png"><img class="alignnone size-full wp-image-3511" src="http://harizanov.com/wp-content/uploads/2014/11/AP-mode.png" alt="AP mode" width="324" height="270" /></a> &nbsp; If the board does not show up, you may manually force the board into AP mode by pressing and holding the button labeled "GPIO0" for 3 seconds and then releasing it. NOTE: Mind the high voltage side of the board while doing so!! Once connected to the access point, navigate your browser to <strong>http://192.168.4.1,</strong> if all worked well, this should take you to the main menu. Please note that some mobile phones will detect that the WiFi connection does not provide Internet and fall back to GSM data network. Make sure to disable mobile data so that your browser still uses that access point. &nbsp; <hr /> <h2>Main Menu</h2> The main menu provides links to the respective sub-menus <a href="http://harizanov.com/wp-content/uploads/2015/02/index-tpl.png"><img class="alignnone size-medium wp-image-3745" src="http://harizanov.com/wp-content/uploads/2015/02/index-tpl-296x300.png" alt="index-tpl" width="296" height="300" /></a> <hr /> <h2> WiFi connection setup</h2> The WiFi connection menu lets you connect to your WiFi network. It will scan for the available networks and prompt you to chose it. Select the network, type in the network key and choose whether to use dynamic IP through DHCP or static IP address. Using <span style="text-decoration: underline;">static IP address makes most sense</span>, as you would be able to access the board by its known IP address. <a href="http://harizanov.com/wp-content/uploads/2015/02/config-wifi-wifi-tpl.png"><img class="alignnone size-medium wp-image-3737" src="http://harizanov.com/wp-content/uploads/2015/02/config-wifi-wifi-tpl-150x300.png" alt="WiFi settings menu" width="150" height="300" /></a> You will need to set up port forwarding if you wish to access the relay board from outside the network. &nbsp; I use the following linux command to find the IP address of the ESP8266 modules connected to my network: <pre><strong>sudo arp-scan –retry 7 –quiet –localnet –interface=wlan0 | grep -s -i 18:fe:34</strong></pre> <hr /> <h2> Sensor Settings</h2> Sensor settings menu allows you to enable one of the two possible sensor daemons, DS18B20 or DHT22 (not both at the same time). <a href="http://harizanov.com/wp-content/uploads/2015/02/config-sensor-tpl1.png"><img class="alignnone size-full wp-image-3830" src="http://harizanov.com/wp-content/uploads/2015/02/config-sensor-tpl1.png" alt="config-sensor-tpl" width="435" height="293" /></a> &nbsp; Multiple DS18B20 temperature sensors may be attached, thermostat function will use the one with smallest address. The humidistat function can be enabled by choosing the humidity readout of DHT22 as input to the thermostat. Temperature/humidity is checked every 30 seconds (hardcoded). NOTE: Soldering the sensors directly on the board is not recommended as the PSU and the ESP8266 disperse heat and if the sensor is soldered on the PCB directly, there will be heat transfer and falsely high readings. For best results use wires and have the sensor outside the enclosure. <hr /> <h2> Relay Settings</h2> This menu allows you to put a custom name to the relays e.g. "Boiler", "TRV" etc Second function is to implement relay "latching" i.e. preserve last relay state upon restarting/power loss recovery. NOTE: Be careful with the function as it may energize the relay upon starting up the board if its last state was ON. <a href="http://harizanov.com/wp-content/uploads/2015/02/config-relay-tpl.png"><img class="alignnone size-medium wp-image-3739" src="http://harizanov.com/wp-content/uploads/2015/02/config-relay-tpl-300x201.png" alt="config-relay-tpl" width="300" height="201" /></a> &nbsp; Relay 1 name is used as zone name in the thermostat control page. <hr /> <h2> NTP settings</h2> Network Time Protocol settings enable the NTP function; Must be enabled when using the thermostat scheduler function so that the relay knows the current date and time and act upon the schedule accordingly. NTP provides GMT time, add negative or positive offset accordingly. <a href="http://harizanov.com/wp-content/uploads/2015/02/config-ntp-tpl.png"><img class="alignnone size-medium wp-image-3740" src="http://harizanov.com/wp-content/uploads/2015/02/config-ntp-tpl-300x199.png" alt="config-ntp-tpl" width="300" height="199" /></a> <hr /> <h2>Broadcast settings</h2> This function allows the board to "broadcast" its basic state via HTTP GET. <a href="http://harizanov.com/wp-content/uploads/2015/02/config-broadcastd-tpl.png"><img class="alignnone size-medium wp-image-3742" src="http://harizanov.com/wp-content/uploads/2015/02/config-broadcastd-tpl-300x199.png" alt="config-broadcastd-tpl" width="300" height="199" /></a> &nbsp; As example, the URL for <a href="http://thingspeak.com" target="_blank">thingspeak</a> posting is formatted as follows: <pre>/update?key=***<strong>APIKEY</strong>***&amp;field1=%d&amp;field2=%d&amp;field3=%d&amp;field4=%s&amp;field5=%s&amp;field6=%s</pre> ..and the board will sprintf relay 1 state, relay 2 state, relay 3 state, DS18B20 reading, DHT22 temperature reading, DHT22 humidity reading for the respective field. Example broadcast URL string for <a href="http://emoncms.org" target="_blank">emoncms</a>: <pre>/input/post.json?json={relay1:%d,relay2:%d,relay3:%d,ds18b20:%s,dht22t:%s,dht22h:%s}&amp;node=21&amp;apikey=***<strong>APIKEY</strong>***</pre> NOTE: HTTPS / secure ports will not work &nbsp; <hr /> <h2> MQTT settings</h2> MQTT settings allows enabling and configuring MQTT for the board. The board can subscribe itself to MQTT topic and control the relays from that topic. It will publish temperature and humidity (DHT22) data to respective topics as well. NOTE:<span style="text-decoration: underline;"> SSL<strong> does not</strong> currently work</span> due to heap size issues when enabled. <a href="http://harizanov.com/wp-content/uploads/2015/02/config-mqtt-tpl.png"><img class="alignnone size-medium wp-image-3744" src="http://harizanov.com/wp-content/uploads/2015/02/config-mqtt-tpl-246x300.png" alt="config-mqtt-tpl" width="246" height="300" /></a> &nbsp; Example of using <a href="http://mosquitto.org/man/mosquitto_pub-1.html" target="_blank">mosquitto_pub </a>to turn the relays on/off <pre>mosquitto_pub -d -t esp_009F8B46/out/relay/1 -m 1</pre> <pre>mosquitto_pub -d -t esp_009F8B46/out/relay/1 -m 0</pre> <hr /> <h2>Relay control UI</h2> The relays can be controlled via a simple mobile device friendly UI. Just click on the On/Off button to change their state. Relay names are set via the Relay Settings menu. <a href="http://harizanov.com/wp-content/uploads/2015/02/control-relay-html.png"><img class=" size-full wp-image-3800 aligncenter" src="http://harizanov.com/wp-content/uploads/2015/02/control-relay-html.png" alt="control-relay-html" width="435" height="427" /></a> &nbsp; <hr /> <h2> Thermostat/Humidistat function</h2> Thermostat function allows setting manual setpoint or using weekly schedule. NTP time must be enabled when using schedule. Thermostat code only controls relay №1. The schedule is adjusted by moving the slides to the left or right, these represent schedule blocks on a 24 hour scale. Block boundaries can be moved, blocks can be merged or split into more detailed schedule blocks. Each block has setpoint, color represents the setpoint value (yellow-orangish-red). Thermostat will not function until it is in "ON" state. Manually setting the setpoint will switch to "Manual" mode. Switching off the thermostat function will force off relay 1. Cooling mode will invert relay logic, I plan to use that for controlling fan coils in cooling mode during the summer. Setpoint changes color to RED when relay 1 is activated and black when relay 1 is off. <a href="http://harizanov.com/wp-content/uploads/2015/02/control-thermostat-html2.png"><img class=" wp-image-3750 size-full aligncenter" src="http://harizanov.com/wp-content/uploads/2015/02/control-thermostat-html2.png" alt="control-thermostat-html2" width="419" height="691" /></a> &nbsp; Humidifier function, enabled via the 'Sensor settings' menu: &nbsp; &nbsp; <a href="http://harizanov.com/wp-content/uploads/2015/02/humidifier.png"><img class=" wp-image-3832 aligncenter" src="http://harizanov.com/wp-content/uploads/2015/02/humidifier.png" alt="humidifier" width="458" height="625" /></a> <hr /> &nbsp; <h2> Thingspeak report integration</h2> If broadcasting to <a href="http://thingspeak.com" target="_blank">thingspeak</a>, a report that is using JavaScript to fetch data from thingspeak and render it is available <a href="http://harizanov.com/wp-content/uploads/2015/02/control-thingspeak-html.png"><img class="aligncenter wp-image-3751 size-full" src="http://harizanov.com/wp-content/uploads/2015/02/control-thingspeak-html.png" alt="control-thingspeak-html" width="951" height="653" /></a> <hr /> <h2> Firmware update</h2> To change firmware, set the programming switch to "PGM" position and attach *<span style="text-decoration: underline;"><strong>3.3V*</strong></span> FTDI cable with GND (black wire) towards the USB plug: <a href="http://harizanov.com/wp-content/uploads/2015/02/esp8266-board-firmware-update-mode.jpg"><img class="alignnone size-medium wp-image-3762" src="http://harizanov.com/wp-content/uploads/2015/02/esp8266-board-firmware-update-mode-300x225.jpg" alt="esp8266 board firmware update mode" width="300" height="225" /></a> Firmware update tools <p style="padding-left: 30px;"><a href="https://drive.google.com/folderview?id=0B3dUKfqzZnlwRXBnV2NzUUNJUms&amp;usp=sharing&amp;tid=0B3dUKfqzZnlwRXhBTmlhaTROTmM" target="_blank">Windows</a></p> <p style="padding-left: 30px;"><a href="https://raw.githubusercontent.com/themadinventor/esptool/master/esptool.py" target="_blank">Python </a>under Linux</p> Use the default baud 115200; <pre>sudo ./esptool.py --port /dev/ttyUSB0 write_flash 0x00000 firmware/0x00000.bin sudo ./esptool.py --port /dev/ttyUSB0 write_flash 0x40000 firmware/0x40000.bin sudo ./esptool.py --port /dev/ttyUSB0 write_flash 0x12000 webpages.espfs sudo ./esptool.py --port /dev/ttyUSB0 write_flash 0x3C000 blank.bin</pre> Also see the <a href="https://github.com/esp8266/esp8266-wiki/wiki/Uploading" target="_blank">ESP8266 WiKi</a> for more details on uploading code. Do not forget to flip back the PGM switch to the right side when done, or the code won't start and the module will be stuck on bootloader mode. &nbsp; <hr /> <h2>About</h2> Provides firmware version and free heap size information <a href="http://harizanov.com/wp-content/uploads/2015/02/about-tpl.png"><img class="alignnone size-medium wp-image-3746" src="http://harizanov.com/wp-content/uploads/2015/02/about-tpl-300x220.png" alt="about-tpl" width="300" height="220" /></a> <hr /> <h2>HTTP API</h2> Relays can be controlled via the UI or using HTTP GET requests Example: <pre>http://RELAYADDRESS/control/relay.cgi?relay1=1&amp;relay2=0&amp;relay3=1</pre> The above HTTP request will switch relays 1 and 3 ON and set relay 2 to OFF. If security was enabled, you will need to provide means for HTTP Basic authentication. The current relay states can be retrieved using the following request <pre>http://RELAYADDRESS/control/relay.cgi?state</pre> This returns a JSON string with the current relay states and their names (set via the UI): <pre>{"relay1": 0 ,"relay1name":"Boiler", "relay2": 0 ,"relay2name":"Relay 2", "relay3": 0 ,"relay3name":"Relay 3" }</pre> The following API provides temperature sensor readout on top of the relay state: <pre>http://RELAYADDRESS/control/state.cgi</pre> Returns: <pre>{ "relay1": "0", "relay2": "0", "relay3": "0", "DHT22temperature": "N/A", "DHT22humidity": "N/A", "DS18B20temperature": "58.87" }</pre> Using the HTTP API example in Python <pre class="brush: python">#!/usr/bin/python#!/usr/bin/python import urllib2, base64, json, time from urllib2 import Request, urlopen, URLError, HTTPError username="admin" password="pass2" DEVICE1="192.168.1.25" def getData (request): base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') request.add_header("Authorization", "Basic %s" % base64string) try: result = urllib2.urlopen(request) except HTTPError as e: print 'The server couldn\'t fulfill the request.' print 'Error code: ', e.code return -1 except URLError as e: print 'We failed to reach a server.' print 'Reason: ', e.reason return -1 else: return result.read().strip() def getRelayState(device, relaynum): request = urllib2.Request("http://"+device+"/control/state.cgi") result = getData(request) data = json.loads(result) return data["relay"+str(relaynum)] def setRelayState(device, relaynum, state): request = urllib2.Request("http://"+device+"/control/relay.cgi?relay"+str(relaynum)+"="+str(state)) result = getData(request) return result def getDS18B20Reading(device): request = urllib2.Request("http://"+device+"/control/state.cgi") result = getData(request) data = json.loads(result) return data["DS18B20temperature"] print "Relay 1 state is: " + getRelayState(DEVICE1,1) print "DS18B20 temperature sensor reading is: " + getDS18B20Reading(DEVICE1) print "Turning relay 1 on" setRelayState(DEVICE1,1,1) time.sleep(5) print "Turning relay 1 off" setRelayState(DEVICE1,1,0) </pre> <hr /> &nbsp; <h2> Buy one</h2> The project is available to purchase from my shop. [product id="3785"] &nbsp; <hr /> <h2>Credits</h2> I have used the code from the following sources for this project <ul> <li>The <a href="http://www.esp8266.com/viewtopic.php?f=6&amp;t=376" target="_blank">ESP-HTTPD</a> project by Jeroen, beerware license</li> <li>The <a href="https://github.com/tuanpmt/esp_mqtt" target="_blank">ESP-MQTT</a> project by Tuan PM, MIT license</li> <li>JSON <a href="https://bitbucket.org/zserge/jsmn/wiki/Home" target="_blank">jsmn </a>library, Z Serge, MIT license</li> <li><a href="https://github.com/emoncms/development/tree/master/experimental/control/open_thermostat_scheduler" target="_blank">Open heating controller/thermostat</a> scheduler by Trystan Lea</li> <li>..ping me if I missed something/someone</li> </ul> &nbsp; <hr /> <h2>License</h2> This project is licensed under <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/" rel="license">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License</a>. <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/" rel="license"><img style="border-width: 0;" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="Creative Commons License" /></a> &nbsp; Please get in <a href="http://harizanov.com/about/" target="_blank">contact </a>with me, if you would like to use the code for a commercial project. &nbsp; <hr /> <h2>Donations</h2> If this code helps you in your non-commercial project and you would like to buy me a beer or dinner, it will be greatly appreciated :-) <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"><input name="cmd" type="hidden" value="_s-xclick" /> <input name="encrypted" type="hidden" value="-----BEGIN PKCS7-----MIIHNwYJKoZIhvcNAQcEoIIHKDCCByQCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYDApx3vKDwVOFa0nKhkw99Jn4BJdDYwWn24seVoqrX6Q/l80PDvWkywl0S112rGPEf3YnwNWqKVAR+dk4bZ87hC2XTZDY3f7/NQcQ5yHK2v98kjs4V/p9SJhvBBjqlrLyBUHLtP8UbvjwAjGF1JjfEnHNDeWORVEcI8BL0JiHv1SjELMAkGBSsOAwIaBQAwgbQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIXCw2zRShQYWAgZBuvG10z8n7r6iRNCKZ6d/UsMDphEfF4D3SjqlTC594fj8ACZvccciIZty8tMT4LObj1TpGPy2SC7B1PAJDvnirfdSeyD1OiNcvqjmekFBnoXgMTH+uTcSKZNOu5b+xkbdDmx4erxsQeEac7lc/migBJMSJYHwg8cAthWzTjrGz2YRp4N81lyPn7D4SY/urJeOgggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNTAyMjExNjIwMjdaMCMGCSqGSIb3DQEJBDEWBBSWC4IjW1T377bciufWyXck4PjMPzANBgkqhkiG9w0BAQEFAASBgFa66GCdzx9IRJlQev0Or+DjaLTG81z7cBUDQs/fMd9z6NjRw5hUKnbo4kmz24oSb1kLquDS+akjpI44DM7CJTjvHQhCJg47Pco0ZKGhO2d0zvaIuED+iLOITcPLDgbqMfdot3L4gJcSeCJi1ACkcL1gae2j+WBoPcCI7mWxCetR-----END PKCS7----- " /> <input alt="PayPal - The safer, easier way to pay online!" name="submit" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" type="image" /> <img src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" alt="" width="1" height="1" border="0" /></form>
Excerpt


OldNewDate CreatedAuthorActions
April 11, 2015 @ 11:11:11 Martin
April 11, 2015 @ 11:10:54 [Autosave] Martin
April 11, 2015 @ 10:54:34 Martin
April 11, 2015 @ 09:53:25 Martin
April 9, 2015 @ 09:06:07 Martin
April 8, 2015 @ 10:06:03 Martin
April 8, 2015 @ 10:00:06 Martin
April 6, 2015 @ 10:39:04 Martin
April 6, 2015 @ 10:37:57 Martin
April 6, 2015 @ 10:33:55 Martin
April 6, 2015 @ 10:32:50 Martin
April 6, 2015 @ 10:30:13 Martin
April 6, 2015 @ 10:18:41 Martin
April 6, 2015 @ 10:13:30 Martin
April 6, 2015 @ 10:11:42 Martin
March 31, 2015 @ 13:35:09 Martin
March 31, 2015 @ 10:40:29 Martin
March 28, 2015 @ 18:58:22 Martin
March 28, 2015 @ 18:33:28 Martin
March 28, 2015 @ 18:32:32 Martin
March 25, 2015 @ 20:01:40 Martin
March 24, 2015 @ 08:19:43 Martin
March 17, 2015 @ 19:51:27 Martin
March 17, 2015 @ 17:31:29 Martin
March 17, 2015 @ 17:27:53 Martin
March 17, 2015 @ 17:15:16 Martin
March 17, 2015 @ 17:13:08 Martin
March 8, 2015 @ 08:25:10 Martin
March 8, 2015 @ 08:15:05 Martin
February 27, 2015 @ 08:16:28 Martin
February 27, 2015 @ 08:16:12 Martin
February 27, 2015 @ 07:50:09 Martin
February 26, 2015 @ 12:43:42 Martin
February 24, 2015 @ 12:32:21 Martin
February 24, 2015 @ 11:55:37 Martin
February 24, 2015 @ 09:44:26 Martin
February 24, 2015 @ 09:03:53 Martin
February 24, 2015 @ 08:50:54 Martin
February 21, 2015 @ 21:06:23 Martin
February 21, 2015 @ 21:00:27 Martin
February 21, 2015 @ 20:44:24 Martin
February 21, 2015 @ 20:30:29 Martin
February 21, 2015 @ 18:17:15 Martin
February 21, 2015 @ 10:00:08 Martin
February 21, 2015 @ 09:54:44 Martin