add sources

master
Peter Babič 4 years ago
parent a9d3ab68f0
commit 28b3a21126
  1. 196
      ESP8266/esp.ino
  2. 103
      gchart/index.html
  3. 3836
      openwrt/config
  4. 34
      openwrt/files/etc/conf.d/30-cgi.conf
  5. 36
      openwrt/files/etc/config/dhcp
  6. 15
      openwrt/files/etc/config/network
  7. 25
      openwrt/files/etc/config/system
  8. 321
      openwrt/files/etc/php.ini
  9. 103
      openwrt/files/www/index.php

@ -0,0 +1,196 @@
#include <SPI.h>
const int slavePIN = 4;
// set up the speed, data order and data mode
SPISettings settingsSPI(1000000, MSBFIRST, SPI_MODE3);
const int VOLTAGE_SCALE = 675; //680
const float CURRENT_SCALE = 31.5; //250
const int RMS_VOLTAGE_ADDRESS = 0x2C;
const int RMS_CURRENT_ADDRESS = 0x3F;
const int STATUS_BITS = 0x1A;
// Include the ESP8266 WiFi library. (Works a lot like the
// Arduino WiFi library.)
#include <ESP8266WiFi.h>
// Include the SparkFun Phant library.
#include <Phant.h>
//////////////////////
// WiFi Definitions //
//////////////////////
const char WiFiSSID[] = "****SSID****";
const char WiFiPSK[] = "****PASS****";
/////////////////////
// Pin Definitions //
/////////////////////
const int LED_PIN = 2; // Thing's onboard, green LED
////////////////
// Phant Keys //
////////////////
const char PhantHost[] = "data.sparkfun.com";
const char PublicKey[] = "2J8dEzMvpGhoAXg3zy6E";
const char PrivateKey[] = "GPpYDNwBjgFn1aEvprM8";
/////////////////
// Post Timing //
/////////////////
const unsigned long postRate = 10000;
unsigned long lastPost = 0;
#include "RunningMedian.h"
const int sampleCount = 11;
RunningMedian voltageSamples = RunningMedian(sampleCount);
RunningMedian currentSamples = RunningMedian(sampleCount);
void setup() {
Serial.begin(115200);
// pinMode(DIGITAL_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
connectWiFi();
Serial.begin(115200);
// set the Slave Select Pins as outputs:
pinMode (slavePIN, OUTPUT);
digitalWrite (slavePIN, HIGH);
// initialize SPI:
SPI.begin();
}
void loop()
{
if (lastPost + postRate <= millis())
{
if (postToPhant())
lastPost = millis();
else
delay(100);
}
}
int32_t readSPI(uint8_t address) {
uint8_t val0, val1, val2;
int32_t result;
// read three bytes from device A
SPI.beginTransaction(settingsSPI);
digitalWrite (slavePIN, LOW);
// reading only, so data sent does not matter
SPI.transfer(0x01);
SPI.transfer(address << 2);
val0 = SPI.transfer(0);
val1 = SPI.transfer(0);
val2 = SPI.transfer(0);
digitalWrite (slavePIN, HIGH);
SPI.endTransaction();
result = (val0 << 8) | val1;
result = (result << 8) | val2;
return result;
}
void connectWiFi()
{
byte ledStatus = LOW;
// Set WiFi mode to station (as opposed to AP or AP_STA)
WiFi.mode(WIFI_STA);
// WiFI.begin([ssid], [passkey]) initiates a WiFI connection
// to the stated [ssid], using the [passkey] as a WPA, WPA2,
// or WEP passphrase.
WiFi.begin(WiFiSSID, WiFiPSK);
// Use the WiFi.status() function to check if the ESP8266
// is connected to a WiFi network.
while (WiFi.status() != WL_CONNECTED)
{
// Blink the LED
digitalWrite(LED_PIN, ledStatus); // Write LED high/low
ledStatus = (ledStatus == HIGH) ? LOW : HIGH;
// Delays allow the ESP8266 to perform critical tasks
// defined outside of the sketch. These tasks include
// setting up, and maintaining, a WiFi connection.
delay(100);
// Potentially infinite loops are generally dangerous.
// Add delays -- allowing the processor to perform other
// tasks -- wherever possible.
}
}
int postToPhant()
{
// LED turns on when we enter, it'll go off when we
// successfully post.
digitalWrite(LED_PIN, HIGH);
// Declare an object from the Phant library - phant
Phant phant(PhantHost, PublicKey, PrivateKey);
for (int i = 1; i <= sampleCount; i++) {
while (1) {
// Wait for DRDY
if (bitRead(readSPI(STATUS_BITS), 23))
break;
}
voltageSamples.add((readSPI(RMS_VOLTAGE_ADDRESS)/pow(2, 23)) * VOLTAGE_SCALE);
currentSamples.add((readSPI(RMS_CURRENT_ADDRESS)/pow(2, 23)) * CURRENT_SCALE);
delay(20);
}
phant.add("voltage", voltageSamples.getMedian());
phant.add("current", currentSamples.getMedian());
// Now connect to data.sparkfun.com, and post our data:
WiFiClient client;
const int httpPort = 80;
if (!client.connect(PhantHost, httpPort))
{
// If we fail to connect, return 0.
return 0;
}
// If we successfully connected, print our Phant post:
client.print(phant.post());
// Read all the lines of the reply from server and print them to Serial
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line); // Trying to avoid using serial
}
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
return 1; // Return success
}

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<!-- EXTERNAL LIBS-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://www.google.com/jsapi"></script>
<!-- EXAMPLE SCRIPT -->
<script>
// onload callback
function drawChart() {
// var volt, amp;
var public_key = '2J8dEzMvpGhoAXg3zy6E';
// JSONP request
var jsonData = $.ajax({
url: 'https://data.sparkfun.com/output/' + public_key + '.json',
data: {
'gte': {
// 'timestamp': 'now - 1 day',
'timestamp': 'now - 186 hour',
'current': 0.05,
'voltage': 200,
},
'lte': {
'timestamp': 'now - 174 hour',
},
},
cache: true,
dataType: 'jsonp',
});
jsonData.done(function (results) {
var data = new google.visualization.DataTable();
data.addColumn('datetime', 'Time');
data.addColumn('number', 'RMS Voltage [V]');
data.addColumn('number', 'RMS Current [A]');
$.each(results, function (i, row) {
var date = (new Date(row.timestamp));
var voltage = parseFloat(row.voltage);
var current = parseFloat(row.current);
// The last measurement
if (i == 0) {
var va = voltage * current;
// console.log(voltage + " V; " + current + " A; " + va + " VA; @ " + date);
$('#va').html("Last measured apparent power: <strong>" + va.toFixed(4) + " VA</strong>");
}
data.addRow([date, voltage, current]);
});
var chart = new google.visualization.LineChart($('#chart').get(0));
chart.draw(data, {
// title: 'ESP8266 Thing Example Stream',
hAxis: {format: 'HH:mm:ss'},
vAxes:[
{title: 'Voltage (blue)', maxValue: 255}, // Left axis
{title: 'Current (red)'} // Right axis
],
series:[
{targetAxisIndex:0},
{targetAxisIndex:1}
],
});
$('#relay').visible();
});
}
// load chart lib
google.load('visualization', '1', {
packages: ['corechart']
});
// call drawChart once google charts is loaded
google.setOnLoadCallback(drawChart);
</script>
</head>
<body>
<div id="chart" style="width: 100%;"></div>
<div id="va" style="font-size: 3em; margin: 0 100px; "></div>
<div id="relay" style="visibility: hidden; font-size: 2em; margin: 50px 100px; ">
<stron>Relay: </stron><input type="button" value="Turn OFF" />
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,34 @@
#######################################################################
##
## CGI modules
## ---------------
##
## http://www.lighttpd.net/documentation/cgi.html
##
server.modules += ( "mod_cgi" )
##
## Plain old CGI handling
##
## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
cgi.assign = ( ".pl" => "/usr/bin/perl",
".cgi" => "/usr/bin/perl",
".rb" => "/usr/bin/ruby",
".erb" => "/usr/bin/eruby",
".py" => "/usr/bin/python",
".php" => "/usr/bin/php-cgi" )
##
## to get the old cgi-bin behavior of apache
##
## Note: make sure that mod_alias is loaded if you uncomment the
## next line. (see modules.conf)
##
#alias.url += ( "/cgi-bin" => server_root + "/cgi-bin" )
#$HTTP["url"] =~ "^/cgi-bin" {
# cgi.assign = ( "" => "" )
#}
##
#######################################################################

@ -0,0 +1,36 @@
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.auto'
option localservice '1'
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv6 'server'
option ra 'server'
option ignore '1'
config dhcp 'wan'
option interface 'wan'
option ignore '1'
config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'

@ -0,0 +1,15 @@
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd78:9aef:9e52::/48'
config interface 'lan'
option ifname 'eth0 eth1'
option type 'bridge'
option proto 'dhcp'

@ -0,0 +1,25 @@
config system
option hostname 'OpenWrt'
option timezone 'CET-1CEST'
config timeserver 'ntp'
list server '0.openwrt.pool.ntp.org'
list server '1.openwrt.pool.ntp.org'
list server '2.openwrt.pool.ntp.org'
list server '3.openwrt.pool.ntp.org'
option enabled '1'
option enable_server '0'
config led 'led_lan'
option name 'LAN'
option sysfs 'gl-connect:green:lan'
option trigger 'netdev'
option dev 'eth1'
option mode 'link tx rx'
config led 'led_wlan'
option name 'WLAN'
option sysfs 'gl-connect:red:wlan'
option trigger 'phy0tpt'

@ -0,0 +1,321 @@
[PHP]
zend.ze1_compatibility_mode = Off
; Language Options
engine = On
;short_open_tag = Off
precision = 12
y2k_compliance = On
output_buffering = Off
;output_handler =
zlib.output_compression = Off
;zlib.output_compression_level = -1
;zlib.output_handler =
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 100
;open_basedir =
disable_functions =
disable_classes =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
; <span style="color: ???????"> would work.
;highlight.string = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
;highlight.bg = #FFFFFF
;highlight.default = #0000BB
;highlight.html = #000000
;ignore_user_abort = On
;realpath_cache_size = 16k
;realpath_cache_ttl = 120
; Miscellaneous
expose_php = On
; Resource Limits
max_execution_time = 30 ; Maximum execution time of each script, in seconds.
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data.
;max_input_nesting_level = 64
memory_limit = 8M ; Maximum amount of memory a script may consume.
; Error handling and logging
; Error Level Constants:
; E_ALL - All errors and warnings (includes E_STRICT as of PHP 6.0.0)
; E_ERROR - fatal run-time errors
; E_RECOVERABLE_ERROR - almost fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it's automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
; and forward compatibility of your code
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
; E_DEPRECATED - warn about code that will not work in future versions
; of PHP
; E_USER_DEPRECATED - user-generated deprecation warnings
;
; Common Values:
; E_ALL & ~E_NOTICE (Show all errors, except for notices and coding standards warnings.)
; E_ALL & ~E_NOTICE | E_STRICT (Show all errors, except for notices)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; E_ALL | E_STRICT (Show all errors, warnings and notices including coding standards.)
; Default Value: E_ALL & ~E_NOTICE
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT
display_errors = On
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
;report_zend_debug = 0
track_errors = Off
;html_errors = Off
;docref_root = "/phpmanual/"
;docref_ext = .html
;error_prepend_string = "<font color=#ff0000>"
;error_append_string = "</font>"
; Log errors to specified file.
;error_log = /var/log/php_errors.log
; Log errors to syslog.
;error_log = syslog
; Data Handling
;arg_separator.output = "&amp;"
;arg_separator.input = ";&"
variables_order = "EGPCS"
request_order = "GP"
register_globals = Off
register_long_arrays = Off
register_argc_argv = On
auto_globals_jit = On
post_max_size = 8M
;magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
;always_populate_raw_post_data = On
; Paths and Directories
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
doc_root = "/www"
user_dir =
extension_dir = "/usr/lib/php"
enable_dl = On
;cgi.force_redirect = 1
;cgi.nph = 1
;cgi.redirect_status_env = ;
cgi.fix_pathinfo=1
;fastcgi.impersonate = 1;
;fastcgi.logging = 0
;cgi.rfc2616_headers = 0
; File Uploads
file_uploads = On
upload_tmp_dir = "/tmp"
upload_max_filesize = 2M
max_file_uploads = 20
; Fopen wrappers
allow_url_fopen = On
allow_url_include = Off
;from="john@doe.com"
;user_agent="PHP"
default_socket_timeout = 60
;auto_detect_line_endings = Off
; Dynamic Extensions
;extension=ctype.so
;extension=curl.so
;extension=dom.so
;extension=exif.so
;extension=ftp.so
;extension=gd.so
;extension=gmp.so
;extension=hash.so
;extension=iconv.so
;extension=json.so
;extension=ldap.so
;extension=mbstring.so
;extension=mcrypt.so
;extension=mysql.so
;extension=openssl.so
;extension=pcre.so
;extension=pdo.so
;extension=pdo-mysql.so
;extension=pdo-pgsql.so
;extension=pdo_sqlite.so
;extension=pgsql.so
;extension=session.so
;extension=soap.so
;extension=sockets.so
;extension=sqlite.so
;extension=sqlite3.so
;extension=tokenizer.so
;extension=xml.so
;extension=xmlreader.so
;extension=xmlwriter.so
; Module Settings
[APC]
apc.enabled = 1
apc.shm_segments = 1 ;The number of shared memory segments to allocate for the compiler cache.
apc.shm_size = 4M ;The size of each shared memory segment.
[Date]
date.timezone = 'Europe/Bratislava'
;date.default_latitude = 31.7667
;date.default_longitude = 35.2333
;date.sunrise_zenith = 90.583333
;date.sunset_zenith = 90.583333
[filter]
;filter.default = unsafe_raw
;filter.default_flags =
[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1
[sqlite]
;sqlite.assoc_case = 0
[sqlite3]
;sqlite3.extension_dir =
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[MySQL]
mysql.allow_local_infile = On
mysql.allow_persistent = On
mysql.cache_size = 2000
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Session]
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
;session.cookie_secure =
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
session.bug_compat_42 = On
session.bug_compat_warn = On
session.referer_check =
session.entropy_length = 0
;session.entropy_file = /dev/urandom
session.entropy_file =
;session.entropy_length = 16
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="
[mbstring]
;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
;mbstring.func_overload = 0
;mbstring.strict_detection = Off
;mbstring.http_output_conv_mimetype=
;mbstring.script_encoding=
[gd]
;gd.jpeg_ignore_warning = 0
[exif]
;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel = JIS
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
;sysvshm.init_mem = 10000
[ldap]
ldap.max_links = -1
[mcrypt]
;mcrypt.algorithms_dir=
;mcrypt.modes_dir=
[opcache]
;opcache.memory_consumption=8 ; 8M is the allowed minimum
;opcache.interned_strings_buffer=1
opcache.max_accelerated_files=200 ; 200 is the allowed minimum
;opcache.revalidate_freq=60
;opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.enable=1
;opcache.log_verbosity_level=4

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<!-- EXTERNAL LIBS-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://www.google.com/jsapi"></script>
<!-- EXAMPLE SCRIPT -->
<script>
// onload callback
function drawChart() {
// var volt, amp;
var public_key = '2J8dEzMvpGhoAXg3zy6E';
// JSONP request
var jsonData = $.ajax({
url: 'https://data.sparkfun.com/output/' + public_key + '.json',
data: {
'gte': {
// 'timestamp': 'now - 1 day',
'timestamp': 'now - 186 hour',
'current': 0.05,
'voltage': 200,
},
'lte': {
'timestamp': 'now - 174 hour',
},
},
cache: true,
dataType: 'jsonp',
});
jsonData.done(function (results) {
var data = new google.visualization.DataTable();
data.addColumn('datetime', 'Time');
data.addColumn('number', 'RMS Voltage [V]');
data.addColumn('number', 'RMS Current [A]');
$.each(results, function (i, row) {
var date = (new Date(row.timestamp));
var voltage = parseFloat(row.voltage);
var current = parseFloat(row.current);
// The last measurement
if (i == 0) {
var va = voltage * current;
// console.log(voltage + " V; " + current + " A; " + va + " VA; @ " + date);
$('#va').html("Last measured apparent power: <strong>" + va.toFixed(4) + " VA</strong>");
}
data.addRow([date, voltage, current]);
});
var chart = new google.visualization.LineChart($('#chart').get(0));
chart.draw(data, {
// title: 'ESP8266 Thing Example Stream',
hAxis: {format: 'HH:mm:ss'},
vAxes:[
{title: 'Voltage (blue)', maxValue: 255}, // Left axis
{title: 'Current (red)'} // Right axis
],
series:[
{targetAxisIndex:0},
{targetAxisIndex:1}
],
});
$('#relay').visible();
});
}
// load chart lib
google.load('visualization', '1', {
packages: ['corechart']
});
// call drawChart once google charts is loaded
google.setOnLoadCallback(drawChart);
</script>
</head>
<body>
<div id="chart" style="width: 100%;"></div>
<div id="va" style="font-size: 3em; margin: 0 100px; "></div>
<div id="relay" style="visibility: hidden; font-size: 2em; margin: 50px 100px; ">
<stron>Relay: </stron><input type="button" value="Turn OFF" />
</div>
</body>
</html>
Loading…
Cancel
Save