Alle Beiträge von rortner

AirPi-Daemon Startscript

Der AirPi-Daemon „airpi.py“ von Tom Hartley (siehe https://github.com/tomhartley/AirPi) lässt sich mit folgendem Shell-Script leichter starten und stoppen. Das Script startet airpi.py im Hintergrund und leitet alle stderr und stdout Ausgaben in ein Logfile um.

Start und Stop des AirPi-Daemons:

airpid.sh start
airpid.sh stop

airpid.sh

#!/bin/bash

### BEGIN INIT INFO
# Provides:          airpid.sh
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: AirPi Weather Station Daemon
# Description:       This service is used to read sensor data from AirPi and upload to Xively.com
### END INIT INFO

case "$1" in
  start)
    echo "Starting AirPi Daemon"
    ## cd into airpi directory to make sure all files are found
    cd /home/pi/workspace/AirPi;
    ## start airpi.py using script for unbuffered output and redirect output to logfile
    script -c "sudo python airpi.py" >> airpi.log 2>&1 &
  ;;
  stop)
    echo "Stopping AirPi Daemon"
    ## serach for airpi.py process and stop it using kill
    sudo kill `pgrep -f airpi.py`
  ;;
  *)
    echo "Usage: /etc/init.d/airpi.sh start|stop"
    exit 1
  ;;
esac

exit 0

Wichtig ist, dass airpi.py mit sudo unter Root laufen muss!

Ein Blick in das laufende Logfile von airpi.py lässt zB: tail -f sensor.log zu:

tail -f sensor.log 

Success: Loaded sensor plugin BMP085-temp
Success: Loaded sensor plugin BMP085-pres
Success: Loaded sensor plugin BMP085-alt
Success: Loaded sensor plugin MCP3008
Success: Loaded sensor plugin DHT22
Success: Loaded sensor plugin DHT22-temp
Success: Loaded sensor plugin LDR
Success: Loaded sensor plugin LDR_LUX
Success: Loaded sensor plugin TGS2600
Success: Loaded sensor plugin MiCS-2710
Success: Loaded sensor plugin MiCS-5525
Success: Loaded sensor plugin Mic
Success: Loaded output plugin Print
Success: Loaded output plugin Xively
...

Autostart vom AirPi-Daemon

sudo nano /etc/rc.local

Durch Hinzufügen folgender Zeile, wird der AirPi-Daemon nach jedem Reboot automatisch gestartet:

/home/pi/workspace/AirPi/airpid.sh

Liniendiagramm aus Xively-Daten mit Highcharts

Liniendiagramm 1

<script src="http//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://code.highcharts.com/stock/highstock.js"></script>

<div id="chart1" style="height: 300px;"></div>

<script>
jQuery(function() {
    feedid = '******';
    key = '******';
    channel = 'Air_Temperature';
    interval = 900;
    days = 7;

    start_date = new Date();
    start_date.setHours(start_date.getHours() - 24*days); 

    // load data from xively feed
	jQuery.getJSON('http://api.xively.com/v2/feeds/'+feedid+'/datastreams/'+channel+'.json?start='+start_date+'&interval='+interval+'?key='+key, function(data) {
        var xively_datapoints = data.datapoints;
        var chartdata = [];
        // convert data format from xively to highcharts
        for (i = 0; i < xively_datapoints.length; i++) {
            chartdata.push([
                Date.parse(xively_datapoints[i].at),
                parseFloat(xively_datapoints[i].value)
            ]);
        }

		// create the chart using highcharts line diagram
		jQuery('#chart1').highcharts('StockChart', {
			rangeSelector : { selected : 1 },
			 exporting: {
                    chartOptions:{
	                   yAxis: { labels: { style: { color: '#000', fontSize: '14px'} } }
		            }
             },
			series : [{
				name : channel,
				data : chartdata,
				tooltip: { valueDecimals: 2 }
			}]
		});
	});
});
</script>

Liniendiagramm 2

 

<script src="http//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://code.highcharts.com/stock/highstock.js"></script>

<div id="chart2" style="height: 300px;"></div>

<script>
jQuery(function() {
    feedid = '******';
    key = '*****';
    channel = 'Air_Temperature';
    interval = 900;
    days = 7;

    start_date = new Date();
    start_date.setHours(start_date.getHours() - 24*days); 

    // load data from xively feed
    jQuery.getJSON('http://api.xively.com/v2/feeds/'+feedid+'/datastreams/'+channel+'.json?start='+start_date+'&interval='+interval+'?key='+key, function(data) {
		var xively_datapoints = data.datapoints;
		var chartdata = [];
		// convert data format from xively to highcharts
		for (i = 0; i < xively_datapoints.length; i++) {
			chartdata.push([
				Date.parse(xively_datapoints[i].at),
				parseFloat(xively_datapoints[i].value)
			]);
		}
			// create the chart using highcharts line diagram
		jQuery('#chart2').highcharts({
			title: {
				text: 'Aktuelle Temperatur',
				x: -20
			},
			subtitle: {
				text: 'Quelle: Xively.com',
				x: -20
			},
                        xAxis: {
                          type: 'datetime',
                        },
			yAxis: {
				title: {
						text: 'Temperatur (C)',
				},
				plotLines: [{
						value: 0,
						width: 1,
						color: '#808080',
				}]
			},
			tooltip: {
				valueSuffix: 'C',
			},
			series: [{
				name: channel,
				data: chartdata,
				tooltip: { valueDecimals: 2 },
			}],
		});

	});
});

Anzeige von Xively-Daten mit Google Charts

Anzeige von Xively-Daten mit Hilfe von Google-Charts „Gauge“:

<script src="https://www.google.com/jsapi?ext.js"></script>

<script>
var feedid = "*****";
var key = "*****";
var chart_data;

google.load('visualization', '1', {packages:['gauge']});
google.setOnLoadCallback(initChart);

function loadData(chart, options, channel_name) {
    var p;     // variable for the data point
    jQuery.getJSON('https://api.xively.com/v2/feeds/'+feedid+'/datastreams/'+channel_name+'.json?&key='+key+'&callback=?', function(data) {
        p = data.current_value;
        if (p) {
            console.log(channel_name+': '+p);
            console.log(data);
            p = (p/1);
            chart_data.setValue(0, 0, data.unit.symbol);
            // chart_data.setValue(0, 0, channel_name);
            chart_data.setValue(0, 1, p);
            console.log(chart_data);
            chart.draw(chart_data, options);
        }
    });
}

function initChart() {
    chart_data = new google.visualization.DataTable();
    chart_data.addColumn('string', 'Label');
    chart_data.addColumn('number', 'Value');
    chart_data.addRows(1);

    // Air_Temperature
    chart_air_temperature = new google.visualization.Gauge(document.getElementById('chart_air_temperature'));
    options = {
        width: 200, height: 200,
        redColor: 'lightblue', redFrom: -20, redTo: 0,
        yellowColor: 'lightred', yellowFrom: 40, yellowTo: 60,
        greenColor: 'lightgreen', greenFrom: 18, greenTo: 25,
        min: -20, max: 60,
        majorTicks: [-20, -10, "0", 10, 20, 30, 40, 50, 60],
        minorTicks: 10,
        animation: {duration: 400, easing: 'out',},
    };
    loadData(chart_air_temperature, options, 'Air_Temperature');
    setInterval(function() { loadData(chart_air_temperature, options, 'Air_Temperature'); }, 15000);

    // Relative_Humidity
    chart_relative_humidity = new google.visualization.Gauge(document.getElementById('chart_relative_humidity'));
    options2 = {
        width: 200, height: 200,
        yellowColor: 'lightblue', yellowFrom: 0, yellowTo: 40,
        greenColor: 'lightgreen', greenFrom: 40, greenTo: 70,
        redColor: 'lightred', redFrom: 70, redTo: 100,
        min: 0, max: 100,
        majorTicks: ["0", 10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
        minorTicks: 5,
        animation: {duration: 400, easing: 'out',},
    };
    loadData(chart_relative_humidity, options2, 'Relative_Humidity');
    setInterval(function() { loadData(chart_relative_humidity, options2, 'Relative_Humidity'); }, 15000);
}
</script>

Anzeige von Xively-Daten mit Highcharts

Anzeige von Xively.com-Daten auf einer Webseite mit Hilfe von Highcharts und JQuery:

<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/highcharts-more.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>

Temperatur-Anzeige

<script>
jQuery( document ).ready(function( $ ) {
    var feedid = "*****";
    var key = "*****";
    
    // Air Temperature
    $('#chart_air_temperature').highcharts({
        chart: {
            type: 'gauge',
            alignTicks: false,
            plotBackgroundColor: null,
            plotBackgroundImage: null,
            plotBorderWidth: 0,
            plotShadow: false,
        },
        title: { text: 'Air Temperature' },
        pane: { startAngle: -150, endAngle: 150 },            
        yAxis: [{
            min: -20, max: 60,
            tickPosition: 'outside',
            minorTickPosition: 'outside',
            lineColor: '#339', tickColor: '#339', minorTickColor: '#339',
            offset: -20,
            labels: { distance: 12, rotation: 'auto' },
            tickLength: 5, minorTickLength: 5, lineWidth: 2,
            endOnTick: true,
            plotBands: [
                { color: 'lightblue', from: -20, to: 0, innerRadius: '30%', outerRadius: '40%' },
                { color: 'lightgreen', from: 18, to: 25, innerRadius: '30%', outerRadius: '40%' },
                { color: '#ff9999', from: 38, to: 60, innerRadius: '30%', outerRadius: '40%' }],
        }, {
            min: -20 * 1.8 + 32, max: 60 * 1.8 + 32,
            lineColor: '#933', tickColor: '#933', minorTickColor: '#933',
            tickLength: 5, minorTickLength: 5, lineWidth: 2,
            labels: { distance: -20, rotation: 'auto' },
            offset: -30,
            endOnTick: false,
        }],
        series: [{
            name: 'Air_Temperature',
            data: [0], // start value
            dataLabels: {
                formatter: function () {
                    var c = this.y;
                    var f = c * 1.8 + 32;
                    return ''+c+'C/'+f+'F';
                },
                backgroundColor: {
                    linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
                    stops: [ [0, '#DDD'], [1, '#FFF'] ]
                }
            },
            tooltip: { valueSuffix: 'C' }
        }]
    
    },
    function(chart) {
        setInterval(function() {
            $.getJSON('http://api.xively.com/v2/feeds/'+feedid+'/datastreams/Air_Temperature.json?key='+key, function(data) {
                var value = Math.round(data.current_value);
                var point = chart.series[0].points[0];
                point.update(value);
             });
        }, 3000);
    });
});
</script>

Anzeige der Lautstärke

<script>
jQuery( document ).ready(function( $ ) {
    var feedid = "*****";
    var key = "*****";

    
    // Volume
    $('#chart_volume').highcharts({
        chart: {
            type: 'gauge',
            plotBorderWidth: 1,
            plotBackgroundColor: {
                linearGradient: { x1: 0, y1: 0,  x2: 0, y2: 1 },
                stops: [ [0, '#FFF4C6'], [0.3, '#FFFFFF'], [1, '#FFF4C6'] ]
            },
            plotBackgroundImage: null,
            height: 200
        },
        title: { text: 'VU meter' },
        pane: [{
            startAngle: -45, endAngle: 45,
            background: null,
            center: ['50%', '145%'],
            size: 300
        }],                       
        yAxis: [{
            min: -20,
            max: 1000,
            minorTickPosition: 'outside',
            tickPosition: 'outside',
            labels: {
                rotation: 'auto',
                distance: 20
            },
            plotBands: [{
                color: '#C02316', from: 500, to: 1000,
                innerRadius: '100%', outerRadius: '105%'
            }],
            pane: 0,
            title: {
                text: 'VU Mono',
                y: -40
            }
        },],  
        plotOptions: {
            gauge: {
                dataLabels: {
                    enabled: false
                },
                dial: {
                    radius: '100%'
                }
            }
        },
        series: [{
            data: [-20],
            yAxis: 0
        }]
    
    },
    
    // Let the music play
    function(chart) {
        setInterval(function() {
            $.getJSON('http://api.xively.com/v2/feeds/'+feedid+'/datastreams/Volume.json?key='+key, function(data) {
                var value = Math.round(data.current_value);
                // console.log(value);
                var point = chart.series[0].points[0];
                point.update(value, false);
                chart.redraw();
            });
        }, 500);
        
    });
});
</script>

AirPi Wetterwerte Salzburg Stadt

Die obigen Diagramme zeigen die mit AirPi v1.4 und Raspberry Pi ermittelten Umweltdaten wie Temperatur (°C), Relative Luftfeuchtigkeit (%), Luftdruck (hPa), Kohlenstoffmonoxid (CO), Stickstoffdioxid (NO2), und Rauchgase sowie die Beleuchtungsstärke (Lux) und der Umgebungslärm. Die Grafiken werden aus den Sensor-Daten dynamisch über die API von Xively.com mit Hilfe der JavaScript-Library Highcharts generiert.

Die dargestellten Werte der Gas-Sensoren wurden nicht mit der vorherrschenden Temperatur korrigiert – auch die Umrechnung „ppm“ erfolgte nur mit geschätzten Werten! Zeiträume in denen keine Daten zur Verfügung stehen, werden als durchgehende Linien dargestellt.

Diagramm-Beispiele:

AirPi

AirPi v1.4 mit Raspberry Pi (Model B) Wetterstation
Standort: Salzburg Stadt, Österreich
Latitude: 47.7672099412293
Longitude: 13.0753720089843
Höhe: 430 m ü. d. Meer, 7 m ü. d. Boden

Aktuelle Unwetterwarnungen für Österreich

AirPi Wetterstation mit Raspberry Pi

AirPi v1.4“ ist eine mit Umwelt-Sensoren bestückte Zusatzplatine, für den Raspberry Pi, der so zu einer Wetterstation erweitert wird, oder zur Raumklima-Überwachung verwendet werden kann. AirPi wurde von Alyssa Dayan und Tom Hartley aus England im Rahmen eines Projektes an der Westminster School entwickelt. Die offizielle Projekt-Webseite ist: http://airpi.es/

airpi_14

Der Beitrag beschreibt den Zusammebau des AirPi-Bausatzes und die Einrichtung eines Raspberry Pi als unabhängige Wetterstation, die Anbindung an Xively.com zur Messdaten Dokumentation und die Auswertung und grafische Darstellung der Messwerte im Web.

AirPi Wetterstation mit Raspberry Pi weiterlesen

Raspberry Pi Webcam: An der Salzach

Life-Webcam: An der Salzach
Life-Webcam: An der Salzach mit Au-Wald Richtung Süd-Westen auf den Untersberg bei Salzburg

Raspberry Pi – Webcam
Raspberry Pi (Model B+)
Kameramodul v1.3: 5-MPixel-Sensor (2592 x 1944 Pixel)
Aktualisierung: ~10min
Standort: Salzburg-Süd/Elsbethen, an der Salzach
Blickrichtung: SW, Richtung Untersberg

Raspberry Pi Webcam

Die Raspberry Pi Webcam ist eine kleine 5M Pixel HD-Kamera, die auf einer kleinen Zusatzplatine geliefert wird und über ein Flachbandkabel an die CSI Schnittstelle des Raspberry Pi angeschlossen wird.

IMG_1236
IMG_1235

Technische Daten

  • 5MP Omnivision 5647 Camera Modul
  • Kompatibilität zu Raspberry Pi Model A und Model B
  • Fotoauflösung: 2592 x 1944 p
  • 1080p HD Videoaufnahme @ 30fps, 720p @ 60fps und 640x480p @60/90
  • Anschluss: 15-pin MIPI Camera Serial Interface (CSI)
  • Abmessungen: 12,2 x 9,4 x 3 cm
  • Gewicht: 18 g
  • Preis: ca 20,- EUR (Pi-Cam bei Amazon*)
  • Alternative: NoIR Pi-Cam ohne IR-Filter für Nachtaufnahmen (NoIR-Cam bei Amazon*)
Raspberry Pi Webcam weiterlesen

Raspberry Pi Display

Von Watterott ist ein kleines 2.83″ Farb-Touch-Display erhältlich, das einfachen auf den GPIO-Port eines Raspberry Pi’s aufgesteckt werden kann. Das Display verwendet weder den HDMI-Port noch muss es extra programmiert werden – es verwendet den Raspberry PI Framebuffer und kann daher die Konsole oder auch X darstellen. Die X-Öberfläche lässt sich auch mit der Touch-Oberfläche bedienen.

RPi-Display von Watterott

Technische Daten des RPi Display von Watterott

  • Revision: 1.0
  • Größe: 2.83″ (43.2 x 57.6mm)
  • Typ: TFT Transmission
  • Auflösung: 320×240 Pixel
  • Farben: 262 K
  • Hintergrundbeleuchtung: 4 LED (dimmbar, PWM)
  • Touch Controller: TI ADS7846
  • Schnittstelle: SPI (Touch Controller + Display)
  • Stromversorgung: 3.3-5V (über GPIO)
  • Abmessungen: 50.2 x 69.3mm
  • Preis: ca 30,- EUR (RPi-Display bei Amazon.de*)

Webseite: http://www.watterott.com/de/RPi-Display
GIT-Repository: http://github.com/watterott/RPi-Display

Raspberry Pi Display weiterlesen

Raspberry Pi

Der Raspberry Pi ist ein sehr einfach aufgebauer kleiner und sehr günstiger Einplatinencomputer. Die Platine ist mit einem 700 MHz (übertacktbar bis 1 GHz) ARM11 Prozessor, 512 MByte Arbeitsspeicher (bei Model B) bestückt. Dieser Beitrag beschreibt die Installation von Raspbian und Konfiguration von WLAN, SSH, VNC, Webserver usw. für den Betrieb.

airpi_2

Technische Daten des Raspberry Pi

  • SoC: Broadcom BCM2835
  • CPU: ARM1176JZF-S (700 MHz)
  • GPU: Broadcom VideoCore IV
  • Arbeitsspeicher (SDRAM): 256 MB bei Model A und 512 MB Model B
  • USB-2.0-Anschlüsse:  2
  • Videoausgabe: FBAS Chinch-Anschluss, HDMI
  • Tonausgabe: 3,5-mm-Klinkenstecker (analog), HDMI (digital)
  • Nicht-flüchtiger Speicher: SD-Kartenlesser für SDHC und SDXC/MMC/SDIO
  • Netzwerk: 10/100-MBit-Ethernet-Controller
  • Schnittstellen: Bis zu 17 GPIO-Pins, SPI, I²C, UART, EGL
  • Leistungsaufnahme: 5 V, 700 mA (3,5 Watt)
  • Stromversorgung: 5-V-Micro-USB-Anschluss (Micro-B) oder 4 × AA-Batterien
  • Größe: 85,60 mm × 56 mm × 21 mm
  • Preis: ab 35,- EUR (Raspberry Pi bei Amazon*)
Raspberry Pi weiterlesen