Sida 1 av 2

Hemautomation, egen smartphoneapp och PIC-http server

Postat: 16 juni 2014, 18:24:36
av squiz3r
Tja! Nu var det några år sedan jag var aktiv här sist, har suttit fast i terrängbilsmeckarträsket osv.. Nu har jag dock återfått suget och vill förverkliga mina hemautomationsplaner som jag har haft i många år..

Tanken är att börja med:
- Microchip pic-processor sittandes här hemma. Denna kör en enkel http-server och kommunicerar med sensorer och brytare.
- Effektmätning på strömmen in till lägenheten.
- NEXA-brytare till samtliga (eller i alla fall de flesta) lampor i huset.
- App till telefonen där lampor kan styras och elförbrukning avläsas.

För att göra projektet lite roligare och trigga mig till att spara på el så är min idé att göra en livssimulator i telefonen. En autonom "gubbe" bor i en omgivning. Om elförbrukningen är hög blir det dåligt klimat, översvämningar ont om mat osv. Inte bra för gubben som blir ledsen alltså. Istället för att bara vänta på att klimatet skall bli bättre när elförbrukningen går ner kan man snabba på det och "köpa" t.ex. en matbit till gubben mot att alla lampor i lägenheten slocknar i en timme.

Även denna mjukstarten blir ju ett ganska omfattande projekt, speciellt med tanke på att jag precis har kommit igång med app-programmering till android och inte har någon erfarenhet av varken webserver med PIC eller NEXA styrning. NEXA är väll om jag inte minns helt fel ett ganska enkelt protokoll på 433MHz och det finns nog många lösningar att titta på, så det löser man väll snabbt. App-programmeringen kommer ta mycket tid, men jag tror inte att det blir så svårt att lösa. Antar att det är rätt lätt att läsa av en databas eller dylikt på internet. Största delen blir kanske webservern med PIC? Finns ju några lösningar med PIC24 osv, har dock inte kollat noggrannare på dem än. Alternativet är kanske att köra med en beagleboard eller någon annan mini-PC. Skulle det spara mycket tid? Kanske finns det någon modul att koppla mellan PIC och ethernet för att skapa en enkel server?

Kanske är det lättare att inte göra PIC'en till en server utan låta den vara en klient som kopplar upp sig till mySQL på ett webhotell och sparar all data där?

Sen är det frågan hur man skall läsa av strömförbrukningen. Bor i en lägenhet så det kan inte bli några större operationer.. Någon slags induktiv mätning på var fas efter säkringarna? (Har 1-fas till spis, 1-fas till belysning och 1 fas till eluttag)

Idéer, tips och tankar tack!

Mvh. Daniel

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 16 juni 2014, 19:03:14
av LarryXz
Jag har en Raspberry Pi, med webbserver på, som kommunicerar med en Arduino Uno via USB.
Arduinon har RF modul som styr fjärrströmbrytare (Proove, Jula (kompatibel med Nexa)).
Har planer på att lägga till så jag kan se effektförbrukningen, men inte kommit på någon smidig lösning på det (som man också har råd med)
Det jag funderar på just nu är om man kan använda denna
http://www.ebay.com/itm/Non-invasive-AC ... 1051393934
eller
http://www.ebay.com/itm/SCT-013-000-0-1 ... 1100215194
Har även en liten Arduino(-kompatibel) Pro Mini som skickar temperaturdata till Unon som på begäran hämtas av Raspberryn.
Tid och temperatur visas på en display kopplad till Unon.
Kan sedan styra alla uttag och se temperaturen i en webapp från iPhonen.

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 18 juni 2014, 14:19:33
av squiz3r
Tog en tur till Kjell och Company och köpte mig en Raspberry Pi modell B och ett 16 gig klass 10 minneskort, så nu skall det bli kul! En väckarklocka står högt i prio också. Man ställer in tiden för alarm via appen i mobilen. 15 minuter innan larmtiden startar radion i hemmabioanläggningen (bredvid sängen) på låg volym. 10 minuter innan tänds första lampan i fönstret och volymen ökar lite. 5 minuter innan tänds andra lampan i fönstret och prick tänds taklampan. (Kanske skall radion då bytas ut mot en irriterande röst som ber mig att stiga upp?)

Annat att implementera senare är bland annat självbevattning till krukor och trädgårdsland. Automatiskt öppning och stängning av fönster beroende på temperaturer? Inbrottslarm. Och självklart rörelsedeckare i hela lägenheten som styr belysningen så att lampknappar blir ett minne blott! Har mycket att stå i nu :P

Edit: Verkar finns många olika operativsystem att installera på Raspberryn. Om jag vill skriva ett program som läser av sensorer via förslagsvis i2c och visar på en hemsida, är det då linux + apache + någon databas som gäller och sen programmera i PHP? Eller måste jag programmera i python för att komma åt GPIO? Tacksam för något tips eller länk så att jag kan hitta tutorials eller liknande. Verkar som att de flesta bara kör med färdiga servermjukvaror när de skall hemautomatisera med Rasberry..

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 18 juni 2014, 14:40:53
av Nerre
Jag har ingen koll på hur man bäst snackar med GPIO (det är nåt som står på min todo-lista att lära mig), men att köra linux på pajen är väl att rekommendera. Jag som är Debian-fan skulle väl peta in raspian eller vad det heter.

Lite snabbt googlande visar att man från php verkar kunna köra det här https://github.com/ronanguilloux/php-gpio

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 18 juni 2014, 14:53:10
av Wedge
WiringPi (C, och andra språk via wrappers) kan vara värt en titt, i synnerhet för folk som är vana vid Arduinokod.
http://wiringpi.com/

PHP för paj-IO-hantering lät trevligt. Sätter upp det på min TODO-lista :)

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 19 juni 2014, 12:53:10
av Dwight
Kul projektidé! När det gäller din elcentral så låter det som att du inte har 3 faser in i lägenheten utan bara 1 och sen har 3 st gruppsäkringar. Har jag förstått det rätt att du i din elcentral endast har 3 säkringar? Isåfall har du säkert 1 för spisen, antagligen runt 20A? 1 för belysning, 6 eller 10A? Samt en för uttag, 6 eller 10A? Detta är väldigt vanligt i lägenheter, och det kanske till och med förenklar dina idéer lite då det bara finns 1 fas att läsa av.

Sitter din elmätare i lägenheten? Om den gör det så kan det ju finnas möjlighet att använda pulsutgången från den för att hämta signal till din microprocessor och på så sätt läsa av aktuell förbrukning. Annars kanske det finns möjlighet att montera typ en sådan här:

http://elbutik.se/product.html/energima ... ry_id=1832

Den har en pulsutgång på 1000 pulser/ kWh som du skulle kunna använda. (Se bruksanvisningen på sidan). Kräver ju dock ett litet ingrepp i elcentralen. Säkert finns det andra metoder också, men det är mer än vad jag vet 8)

Ska bli spännande att följa detta! Kan också tipsa om www.mysensors.org som verkar intressant när det gäller hemautomation. Som jag förstår är projektet grundat av en forummedlem. Se mer i denna tråd:

http://elektronikforumet.com/forum/view ... =7&t=71547

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 19 juni 2014, 14:03:00
av squiz3r
Mycket möjligt att allt ligger på samma fas! 10A säkring till allt utom spisen som har 20A säkring precis som du säger. Har ingen elmätare inne i lägenheten, så pulsavläsning av LED är inte aktuellt. För att göra så lite påverkan som möjligt lutar det åt att använda en sån där delbar kärna som LarryXz länkade till innan. Om jag inte har helt fel så går sladdarna via en kopplingsdosa i taket efter säkringsskåpet så då är det ju lätt att koppla in sig där! Blir en billig lösning också eftersom en sån givare bara går på 50-100kr.

Har installerat Apache + PHP5, mySQL och vsftpd på Raspberryn nu. Dock har jag problem med rättigheterna på www-mappen..

Jag har kört kommandot "sudo chown -R pi /var/www" för att användaren pi skall få ägarrättigheten till mappen och om jag går in i xsystemet och kollar på mappen så står det att den har det och att alla har läs och skrivrättigheter. Men om jag loggar in på ftp kan jag ej öppna mappen. Det konstigaste är att om jag inloggad som "pi" kör "cd /var/www" så får jag bara svaret: -bash: cd: /var/www: åtkomst nekas

Vad kan vara fel? Hur fixar jag detta?

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 19 juni 2014, 15:22:08
av Dwight
Oj, sorry jag missade helt länken du fått till strömmätnings-grunkorna. Dom ser ju kalas ut, och då borde du ju kunde lösa resten med lite beräkningar i din PIC. Japp, du har enfas in till din lägenhet. Dock måste du antagligen in i elcentralen ändå eftersom spisgruppen med all säkerhet går direkt från elskåpet till spisen utan kopplingsdosa. Sen lär du ha ett antal kopplingsdosor i lägenheten för de andra två grupperna för belysning och uttag, dock lär du aldrig hitta båda i samma dosa (förhoppningsvis). Tror ändå det enklaste är att lyfta på locket till centralen och hänga på din amperemätare på fasledaren efter huvudbrytaren. Se till att använda kabel/tråd som är isolerad för högsta förekommande spänningen i centralen, dvs, i ditt fall 230V , gör ett litet jack i kanten på centralkåpan och peta ut kabeln. Se till att allt som är inne i centralen är välisolerat och att det inte finns någon risk att något skaver mot kanten på kapslingen. Sen ska det väl för sakens skull nämnas att detta arbete lär vara behörighetskrävande, men det visste du säkert redan 8)

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 19 juni 2014, 19:50:31
av squiz3r
Idag har det gått framåt en hel del faktiskt. Jag avinstallerade all servermjukvara och tog bort www mappen sen gjorde jag om allt och nu fungerar det i alla fall med www mappen, har dock fortfarande problem med att jag inte kan visa filer som ligger i undermappar även om jag ställer in rättigheten till 644 på både mappar och filer...

Men jag har i alla fall kopplat in en ds1820 temperatur sensor via 1-wire till Raspbarryn (enligt följande lånade schema).
Bild

Sen har jag gjort ett php-script som läser av temperaturen och skriver ut den till en xml fil tillsammans med tid och datum. Så nu sitter jag och klurar för att skriva en app till telefonen som läser av denna xml-filen.

Kod: Markera allt

<?php

// Set filetype to XML
header('Content-type: application/xml');

// Open temperaturesensor
$file = '/sys/bus/w1/devices/10-0008014c61ed/w1_slave';
// Read all text
$text = file($file);
// get the temperature
$temp = explode('=',$text[1]);
$temp = number_format($temp[1] / 1000, 2, '.', '');

// Write XML Structure
$writer = new XMLWriter();  
$writer->openURI('php://output');   
$writer->startDocument('1.0','UTF-8');   
$writer->startElement('temperature');  
	$writer->writeElement('value', $temp);  
	$writer->writeElement('date', date('y-m-d', time()));  
	$writer->writeElement('time', date('H:i', time()));  
$writer->endElement();      
$writer->endDocument();   
$writer->flush(); 
?>
Untitled.png

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 19 juni 2014, 20:38:36
av LittleFish
Satt med liknande problem igår när jag installerade wordpress på virtuell maskin. Denna länken löste det för mig, vet inte om det hjälper dig med? Håller aldrig på med Linux nästan.

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 19 juni 2014, 23:49:30
av squiz3r
Tack för länken! Skall ta och undersöka det imorgon.

Nu är jag klar med appen så långt så att den läser av temperaturen i rummet över internet (eller i alla fall över nätverket, har inte gjort någon port forwarding än). Såhär ser appen ut just nu. Temperaturen uppdateras med ett jämnt tidsintervall eller när man trycker på knappen.
Screenshot_2014-06-19-23-30-30.png
Ändrade på min XML-layout till:

Kod: Markera allt

<?xml version="1.0" encoding="UTF-8"?>
<temperatureSensor value="28.75" date="14-06-19" time="22:00"/>
Tanken är att utvidga det sen med fler sensorer och historik, typ såhär:

Kod: Markera allt

<temperatureSensor> 
   <kitchen>
      <readings value="28.75" date="14-06-19" time="22:40"/>
      <readings value="28.75" date="14-06-19" time="22:30"/>
      <readings value="28.75" date="14-06-19" time="22:20"/>
      <readings value="28.75" date="14-06-19" time="22:10"/>
      <readings value="28.75" date="14-06-19" time="22:00"/>
      .....
   </kitchen>
   <livingroom>
      <readings value="28.75" date="14-06-19" time="22:40"/>
      <readings value="28.75" date="14-06-19" time="22:30"/>
      <readings value="28.75" date="14-06-19" time="22:20"/>
      <readings value="28.75" date="14-06-19" time="22:10"/>
      <readings value="28.75" date="14-06-19" time="22:00"/>
      .....
   </livingroom>
</temperatureSensor> 
<humiditySensor> 
   <kitchen>
      <readings value="0.40" date="14-06-19" time="22:40"/>
      <readings value="0.40" date="14-06-19" time="22:30"/>
      <readings value="0.75" date="14-06-19" time="22:20"/>
      <readings value="0.45" date="14-06-19" time="22:10"/>
      <readings value="0.35" date="14-06-19" time="22:00"/>
      .....
   </kitchen>
</humiditySensor>
Koden till telefonen ser ut som följande:

Kod: Markera allt

package com.example.hometemperature;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.graphics.PorterDuff;

public class MainActivity extends ActionBarActivity {
	
	private static final String TAG = "Home Temperature";
	
	public static final String SERVER_URL = "http://192.168.0.12/";
	public static final String QUERY_FILE = "temperatur.php";
	public static final String QUERY_URL = SERVER_URL + QUERY_FILE;
	
	LinearLayout container;
	Button updateBtn;
	TextView temp1Tv;
	TextView temp1Tv2;
	AsyncDownloader downloader;
	Bitmap bg;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	
        super.onCreate(savedInstanceState);
        
        container = new LinearLayout(this);
        container.setOrientation(LinearLayout.VERTICAL);
        container.setPadding(30, 30, 30, 30);
        container.setBackgroundResource(R.drawable.bg);
        
        updateBtn = new Button(this);
        updateBtn.setOnClickListener(updateBtnListener);
        updateBtn.setText("Update");

        temp1Tv = new TextView(this);
        temp1Tv2 = new TextView(this);

        container.addView(updateBtn);
        container.addView(temp1Tv);   
        container.addView(temp1Tv2);        

        temp1Tv.setText("");
        temp1Tv.setBackgroundColor(Color.WHITE);
        temp1Tv.setTextSize(35);
        temp1Tv2.setText("");
        temp1Tv2.setBackgroundColor(Color.WHITE);
        temp1Tv2.setTextSize(25);
        
        
        downloader = new AsyncDownloader();
        
		new Timer().scheduleAtFixedRate(update, 10, 2000);
        
        setContentView(container);
        
       
    }
    
    TimerTask update = new TimerTask(){ // If timer interrupted, execute update if not already in progress.
		@Override
		public void run() {
			if (downloader.getStatus() != AsyncTask.Status.RUNNING){
				downloader = new AsyncDownloader(); // A task can only be executed one...
				downloader.execute();
			}
		}
    };
    
    View.OnClickListener updateBtnListener = new View.OnClickListener() { // If button was clicked, execute update if not already in progress.
        @Override
        public void onClick(View v) {
			if (downloader.getStatus() != AsyncTask.Status.RUNNING){
				downloader = new AsyncDownloader(); // A task can only be executed one...
				downloader.execute();
			}
        }
    };
    
    private class AsyncDownloader extends AsyncTask<Object, String, Integer> {

		@Override
		protected Integer doInBackground(Object... params) {
			XmlPullParser receivedData = tryDownloadingXmlData();
			int recordsFound = tryParsingXmlData(receivedData);
			return recordsFound;
		}

		private XmlPullParser tryDownloadingXmlData() {
			try {
				URL xmlUrl = new URL(QUERY_URL);
				XmlPullParser receivedData = XmlPullParserFactory.newInstance().newPullParser();
				receivedData.setInput(xmlUrl.openStream(), null);
				return receivedData;
			} catch (XmlPullParserException e) {
				Log.e(TAG, "tryDownloadingXmlData Exception:", e);				
			} catch (IOException e) {
				Log.e(TAG, "tryDownloadingXmlData Exception:", e);				
			}
			return null;
		}
		
		private int tryParsingXmlData(XmlPullParser receivedData) {
			if (receivedData != null){
				try {
					return processReceivedData(receivedData);
				} catch (XmlPullParserException e) {
					Log.e(TAG, "tryParsingXmlData Exception:", e);				
				} catch (IOException e) {
					Log.e(TAG, "tryDownloadingXmlData Exception:", e);				
				}
			}
			return 0;
		}

		private int processReceivedData(XmlPullParser receivedData) throws XmlPullParserException, IOException {
			int eventType = -1;
			int recordsFound = 0;
			
			// Find values in the XML records
			String value = "";
			String date = "";
			String time = "";
			
			while (eventType != XmlResourceParser.END_DOCUMENT) {
				String tagName = receivedData.getName();
				
				switch (eventType) {
				case XmlResourceParser.START_TAG:
					if (tagName.equals("temperatureSensor")){
						value = receivedData.getAttributeValue(null, "value");
						date = receivedData.getAttributeValue(null, "date");
						time = receivedData.getAttributeValue(null, "time");
					}
					break;
				case XmlResourceParser.END_TAG:
					if (tagName.equals("temperatureSensor")){
						//Log.i(TAG, "Data: " + value + date + time );
						recordsFound ++;
						publishProgress(value, date, time); // Send values to the main thread.
					}
					break;
				}
				eventType = receivedData.next();
			}
			if (recordsFound == 0) {
				publishProgress();
			}
			return recordsFound;
		}	

		@Override
		protected void onProgressUpdate(String... values) {
			if (values.length == 0) {
				Log.i(TAG, "No data downloaded");
			} else {
				String value = values[0];
				String date = values[1];
				String time = values[2];
				
				temp1Tv.setText(value + (char) 0x00B0 + "C");
				temp1Tv2.setText("on " + date + " " + time);
			}
			
			super.onProgressUpdate(values);
		}		   	
    }
    
    public static Bitmap getBitmapFromAsset(Context context, String filePath) {
        AssetManager assetManager = context.getAssets();

        InputStream istr;
        Bitmap bitmap = null;
        try {
            istr = assetManager.open(filePath);
            bitmap = BitmapFactory.decodeStream(istr);
        } catch (IOException e) {
            Log.e(TAG, "EXCEPTION ON LOAD BITMAP", e);
        }

        return bitmap;
    }
}

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 21 juni 2014, 16:38:54
av squiz3r
Nu har jag ett pythonscript, körs på Raspbarryn så fort den startar, som tar en temperaturmätning var tionde sekund och kallar på en php-fil som sparar mätvärdet i en MySQL databas. Sen har jag en php-fil som presenterar det i en graf med hjälp google charts.
(Nej, jag har inte sååå varmt här inne... Det måste vara denna tempsensorn som är trasig. I och för sig sitter den direkt på raspbarryn så det blir kanske lite varmare där men inte så mycket tycker jag.. Får se när jag kopplar in fler om de visar annorlunda!)
Untitled.png
Python scriptet på servern:

Kod: Markera allt

import urllib2
import os
import time

# Adresses for the write-to-database php file
URL = "http://localhost/addSensorReadings.php"
GET1 = "?zone="
GET2 = "&value="

## ENABLE GPIO IN THE /etc/rc.local SCRIPT
## ALSO ADD /home/pi/readSensors.py SO THIS SCRIPT STARTS 
## EVERY TIME RPI STARTS

# Adress to the therometers
BASE_DIR = '/sys/bus/w1/devices/'
###ALL_DIR = BASE_DIR + "w1_bus_master1/w1_master_slaves/"
###DEVICE_ALL = glob.glob(ALL_DIR)
###DEVICE_ID_LIVINGROOM = DEVICE_ALL[0]
DEVICE_ID_LIVINGROOM = '10-0008014c61ed'
TOP_DIR = '/w1_slave'
DEVICE_LIVINGROOM = BASE_DIR + DEVICE_ID_LIVINGROOM + TOP_DIR


# Read lines from file
def readTempRaw():
    f = open(DEVICE_LIVINGROOM, 'r')
    lines = f.readlines()
    f.close()
    return lines


# Extract temperature from lines
def readTemp():
    lines = readTempRaw()
    while lines[0].strip()[-3:] != 'YES': # Ensure temp sensor is read correct
        time.sleep(0.2)
        lies = readTempRaw()
    indexOfEq = lines[1].find('t=')
    if indexOfEq != -1:
        temp = float(lines[1][indexOfEq + 2 :])/1000.00
        return temp


# Main loop
while True:
    # Read temp
    tempLivingroom = readTemp();
    #Print it on screan
    #print(tempLivingroom)
    # Insert it into MYSQL database
    response = urllib2.urlopen(URL + GET1 + "Livingroom" + GET2 + str(tempLivingroom))
    s = response.read()
    # Check if insertion was sucessfull
    #if s == b'Sucess':
        #print("Sucess!")
    #else:
        #print("Failed to insert into database")
    # Sleep for 10 seconds
    time.sleep(10)
PHP-koden för att spara i databas:

Kod: Markera allt

<?php
$TABLE_NAME = "readings";
$con = mysqli_connect('localhost', '***', '***', 'sensors');

if (mysqli_connect_errno()) {
    echo "Failed to connect to mysql: " .  mysqli_connect_errno();
}

$zone = $_GET["zone"];
$value = $_GET["value"];

if ($zone == "") {
    echo "Error: Zone is not set";
}else if ($value == "") {
    echo "Error: Value is not set";
}else {
	$query = "INSERT INTO " . $TABLE_NAME . " (zone, value) VALUES ('$zone', '$value')";
	 $ok = mysqli_query($con, $query);
	echo $ok==1?"Sucess":"Failed";
}
mysqli_close($con);

?>
PHP-filen som presenterar i grafen: (Dock kan bara grafen visa data från en sensor än så länge. Skall fixa så den kan rita upp alla samtidigt sen)

Kod: Markera allt

<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
                   '/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
if (isset($_GET['from']))
    $from = preg_replace($patterns, $replace, $_GET['from']);
else
    $from = "";
if (isset($_GET['to']))
    $to = preg_replace($patterns, $replace, $_GET['to']);
else
    $to = "";

// String for html output
$str1 = "";

// Connect to server
$con = mysqli_connect('localhost', '***', '***', 'sensors');

if (mysqli_connect_errno()) {
    $str1 = "Failed to connect to mysql: " .  mysqli_connect_errno();
}

// Look up which sensors are saved
$query = "SELECT DISTINCT(zone) AS zone FROM readings ORDER BY zone";
$result = mysqli_query($con, $query);
$sensors = array();
while ($row = mysqli_fetch_array($result))
    $sensors[] = $row['zone'];

$str1 .= ("<table style='border:0px;'><tr><td><table style='width: 300px; padding:10px; border:1px solid #3D3D3D;'><tr><td><b>Found " . mysqli_num_rows($result) . " sensor(s)</b></td></tr>");
foreach ($sensors as $sensor) {
    $str1 .= "<tr><td>&nbsp;&nbsp;&nbsp;- " . $sensor . "</td></tr>";
}
$str1 .=("</table>");

// Table to store everything for graph..
if ($from == "")
    $queryFrom = " datetime >= '" . date('Y-m-d H:m:s', strtotime('-1 hour')) . "'";
else
    $queryFrom = " datetime >= '" . date('Y-m-d H:m:s', strtotime($from)) . "'";
if ($to == "")
    $queryTo = "";
else
    $queryTo = " AND datetime <= '" . date('Y-m-d H:m:s', strtotime($to)) . "'";
$query = "SELECT * FROM readings WHERE" . $queryFrom . $queryTo . " ORDER BY datetime DESC";
$result = mysqli_query($con, $query);
$num_plotted_times = mysqli_num_rows($result);
$last_read_temp = 999;
$table = array();
$i = 0;
while($row = mysqli_fetch_array($result)){
    // Data table
    //$table[$i] = array();
    $table[$i][0] = (string)$row['datetime'];
    $table[$i][1] = (double)$row['value'];
    $i ++;
    if ($i == 1)
        $last_read_temp = $row['value'];
}
$table = array_reverse($table);

// Find min temperature in intervall
$query = "SELECT MIN(value) AS min FROM readings WHERE" . $queryFrom . $queryTo;
$result = mysqli_query($con, $query);
$row = mysqli_fetch_array($result);
$min_temp = $row['min'];
// Find max temperature in intervall
$query = "SELECT MAX(value) AS max FROM readings WHERE" . $queryFrom . $queryTo;
$result = mysqli_query($con, $query);
$row = mysqli_fetch_array($result);
$max_temp = $row['max'];
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Home Tempereture</title>
    
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
    
    var handle=setTimeout(function(){window.location.reload(1);}, 10000);
     
    // Load the Visualization API and the piechart package.
    google.load('visualization', '1', {'packages':['corechart']});
     
    // Set a callback to run when the Google Visualization API is loaded.
    google.setOnLoadCallback(drawChart);
     
    function drawChart() {
    // Create our data table out of JSON data loaded from server.
      var data = new google.visualization.DataTable();
      data.addColumn('string', 'datetime');
        data.addColumn('number', '<?php echo $sensor; ?>');
    data.addRows(<?php echo json_encode($table); ?>);
       var options = {
        'height':500
       };
    // Instantiate and draw our chart, passing in some options.
    // Do not forget to check your div ID
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
    chart.draw(data, options);
    }
    </script>
 </head>
 <body>  
 <center>
 <input type="checkbox" name="refresh" value="refresh" onclick="if(this.checked){handle=setTimeout(function(){window.location.reload(1);}, 10000)}else{clearTimeout(handle)}" checked> Dynamic page refresh
 <form name="input" action="index.php" method="get">
Show measurements from: <input type="text" name="from"> 
to: <input type="text" name="to"> <input type="submit" value="Submit">
</form></center>
 <div id="chart_div" style="width:100%"></div>
<?php
// How many sensors where found?
echo "<center>" . $str1 . "</td><td>";
echo "<table style='padding:10px; border:0px;'><tr><td>";
echo "Last read temperature: <b>" . number_format($last_read_temp,1) . "&deg;C</b>"; 
echo "</br>Min temperature in interval: <b>" . number_format($min_temp,1) . "&deg;C</b>"; 
echo "</br>Max temperature in interval: <b>" . number_format($max_temp,1) . "&deg;C</b>"; 
echo "</td></tr></table></td></tr></table>";

$query = "SELECT COUNT(*) AS count FROM readings"; // Check how many readings..
$result = mysqli_query($con, $query);
$row = mysqli_fetch_array($result);
echo "Plotted " . $num_plotted_times . " out of " . $row['count'];

echo ("</center>");
echo ("</body>");
echo ("</html>");

mysqli_close($con);

?>

Kanske dags att flytta denna tråden till projektdelen?

//Daniel

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 21 juni 2014, 17:52:16
av GFEF
Kontolera el-nätets leverantörens hemsida.
Borde gå att hämta din el-mätarens visning där.

I dag borde timavläsning el vara införd av nästa alla el-nätets leverantörer.

http://teknikdebatt.se/debatt/timavlasn ... a-elkunder

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 21 juni 2014, 21:05:33
av squiz3r
Det är i och för sig sant att jag kan se min förbrukning om jag loggar in på elnätets hemsida, men jag vet inte om det går att få ut på något sätt så att jag kan få ner det till Raspberryn? Känns ju svårt i och med att där är inloggning och såvidare.

Nu har jag forwardat portarna och skaffat dynDNS hos noip.com så att jag kommer åt Raspberryn från internet.

Har utvidgat både webinterfacet och androidappen nu också så att jag kan styra en lysdiod samt att jag hela tiden får uppdaterad information om ifall pinnen är hög eller ej (så att man ser på appen tex om man släcker lysdioden från datorn).
Screenshot.png
PHP-filen som genererar XML koden styr också lysdioden nu. Så här ser den koden ut:

Kod: Markera allt

<?php

// Set filetype to XML
header('Content-type: application/xml');


// Controll LED
if (isset($_GET['led']))
    $led = $_GET['led'];
else
    $led = "";
system('gpio -g mode 7 out'); // Set LED IO to output
if($led == "1")
    system('gpio -g write 7 1'); // Turn on LED
else if ($led == "0")
    system('gpio -g write 7 0'); // turn off LED
$readLed = "";
exec("gpio -g read 7", $readLed);
$strLed = implode('', $readLed);

// Open temperaturesensor
$file = '/sys/bus/w1/devices/10-0008014c61ed/w1_slave';
// Read all text
$text = file($file);
// get the temperature
$temp = explode('=',$text[1]);
$temp = number_format($temp[1] / 1000, 2, '.', '');

// Write XML Structure
$writer = new XMLWriter();  
$writer->openURI('php://output');   
$writer->startDocument('1.0','UTF-8'); 
$writer->startElement('records');  
    $writer->startElement('temperatureSensor');  
    	$writer->writeAttribute('value', $temp);  
    	$writer->writeAttribute('date', date('y-m-d', time()));  
    	$writer->writeAttribute('time', date('H:i', time()));  
    $writer->endElement();   
    $writer->startElement('led');  
    	$writer->writeAttribute('value', $strLed);
    $writer->endElement();   
$writer->endElement(); 
$writer->endDocument();   
$writer->flush(); 
?>
I appen lade jag bara till två knappar och ett textfält sen gjorde jag om min bakgrundsprocess så att jag kunde skicka med en textsträng som skickas med i adressen till PHP/XML-filen. Sen utvidgade jag den så att den läser av de nya taggarna i filen också. Ser ut såhär nu:

Kod: Markera allt

<records>
    <temperatureSensor value="27.63" date="14-06-21" time="21:01"/>
    <led value="1"/>
</records>

Re: Hemautomation, egen smartphoneapp och PIC-http server

Postat: 21 juni 2014, 21:40:11
av Andax
Apropå elmätare och raspberry pi så läser jag av blinket på elmätaren och skickar sedan in pulsen på en pinne på RPi. Mha wiringPi biblioteket har jag sedan gjort en liten C-app som tidstämplar varje puls mycket noggrant och skriver ner på fil. Då kan jag se den momentana förbrukningen. Ser t.ex. när motorer kör igång eller hur spisen slår på och av hela tiden för att reglera värmen...
Här är min tråd: http://elektronikforumet.com/forum/view ... =3&t=66389