SensorAndSwitch Haus-Automation auf Webserver-Basis

@alle und @dtrieb:

Ein Beispiel für ein Sensor-Script, das die Temperatur aus dem Internet für "MeineStadt" verwendet:
temp.php aufgerufen als URL http://server/smarthome/temp.php

Code:
<?php
	$url="http://api.openweathermap.org/data/2.5/weather?q=[COLOR="#FF0000"]MeineStadt[/COLOR]&mode=html";
	$ch = curl_init();
	$timeout = 5;
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
	curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$Status = curl_exec($ch);
	curl_close($ch);
	$Danach='Temperature">';
	$Cont=explode("<",substr($Status,strpos($Status,$Danach)+13,10),1);
	$Temp=$Cont[0]*1;
	if ($Status) {
		echo $Temp;
	}
	else {
		echo "E";
	}
?>

Funktioniert z. B. als Pseudo-Außentemperatur-Sensor prima :)
 
@alle und @dtrieb:

Ein Beispiel für ein Sensor-Script, das die Temperatur aus dem Internet für "MeineStadt" verwendet:
temp.php aufgerufen als URL http://server/smarthome/temp.php

Code:
<?php
$url="http://api.openweathermap.org/data/2.5/weather?q=[COLOR="#FF0000"]MeineStadt[/COLOR]&mode=html";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$Status = curl_exec($ch);
curl_close($ch);
$Danach='Temperature">';
$Cont=explode("<",substr($Status,strpos($Status,$Danach)+13,10),1);
$Temp=$Cont[0]*1;
if ($Status) {
echo $Temp;
}
else {
echo "E";
}
?>

Funktioniert z. B. als Pseudo-Außentemperatur-Sensor prima :)
Wird nachher mal getestet, super!
Aber zwei Anmerkungen:

Warum nimmst du nicht die GPS Koordinaten anstatt der Stadt?

Kann man die Pseudo Werte auch als Bedingungen nutzen? Also im Automationsscript?

Und danke fürs programmieren! :cool:
 
:mrgreen:
Code:
http://api.openweathermap.org/data/2.5/weather?lat=52.4708485&lon=13.4051777&mode=html
Quelle
 
@dtrieb: Es funktioniert nur im Automationsscript. Die Scripte sind wie Geräte einsetzbar. Ob man nun den Temperaturfühler einer DECT200 oder ein Script wählt ist einerlei. Genau das war auch der Plan. Man kann über solche Scripte auch beliebige Fremdgeräte steuern, indem man solche Scripte sich bastelt.

Die GPS-Koordinaten führen bei meinen Tests in einen nahegelegenen Ort, statt dahin, wo sie hin sollen. Ändere ich sie in den Einstellungen, dann stimmt die astronomische Schaltung nicht mehr. Theoretisch kann man mit seinem Pseudo-Sensor-Script auch die Daten der smarthome.conf auswerten. Klar, das geht. :)

Übrigens, das oben ist nur ein Anschauungsbeispiel, wie Ihr solche Pseudo-Scripte aufbauen müsst, dass man sie später in Bedingungen und Schaltvorgänge einbinden kann. :)

Ich könnte mal eine Version 4.99 als Test einstellen, die man manuell sich installieren kann. Aber die ist wirklich nur zum Herumprobieren, weil da kann sich intern noch vieles verändern. Also bloß nicht "produktiv" nutzen. Es reicht, wenn bei mir immer mal unverhofft die Steckdosen schalten: ;)

@koyaanisqatsi: Das weiß dtrieb, da er in Post #237 es angeregt hat. :)
 
Laborversion eingestellt. NUR ZUM TESTEN! Im SmartHome Web unter Menüpunkt Download ganz unten unter Laborversion.

Nachtrag:
tempxml.php auf Abfragebasis xml:
Code:
<?php
	$url="http://api.openweathermap.org/data/2.5/weather?q=[COLOR="#FF0000"]MeineStadt[/COLOR]&mode=xml&units=metric&lang=de";
	$ch = curl_init();
	$timeout = 5;
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
	curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$Status = curl_exec($ch);
	curl_close($ch);
	if ($Status) {
		$Cont=simplexml_load_string($Status);
		$Temp=$Cont->temperature->attributes()->value;
		echo $Temp;
	}
	else {
		echo "E";
	}
?>
 
Zuletzt bearbeitet:
So ist es etwas einfacher die Stadt zu ändern:

Code:
<?php
	$stadt = "MEINESTADT";
	$url = "http://api.openweathermap.org/data/2.5/weather?q=" .$stadt. "&mode=xml&units=metric&lang=de";
	$ch = curl_init();
	$timeout = 5;
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
	curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$Status = curl_exec($ch);
	curl_close($ch);
			
	if ($Status) {
		$Cont=simplexml_load_string($Status);
		$Temp=$Cont->temperature->attributes()->value;
		echo $Temp;
	}
	else {
		echo "E";
		}
?>
 
Und so gehts später automatisch aus der conf (Konfigurationseinstellungen von smarthome.php). Hab das Problem der Abweichung entdeckt und behoben. :)
(Könnt Ihr momentan noch nicht testen, da ein paar includes noch nicht hochgeladen sind)
Code:
<?php
	include "include/includedateien.php";
	include "include/includefunctions.php";
	include "include/includeconf.php";
	include "include/includeconfig.php";
	include "include/includedefine.php";
	$url="http://api.openweathermap.org/data/2.5/weather?lat=".$Conf["BREITENGRAD"]."&lon=".$Conf["LAENGENGRAD"]."&mode=xml&units=metric&lang=de";
	$ch = curl_init();
	$timeout = 5;
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
	curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$Status = curl_exec($ch);
	curl_close($ch);
	if ($Status) {
		$Cont=simplexml_load_string($Status);
		$Temp=$Cont->temperature->attributes()->value;
		echo $Temp;
	}
	else {
		echo "E";
	}
	exit;
?>
 
Labor 5178 steht bereit.

(Da sind alle includes mit drin)
 
:mrgreen:
Code:
http://api.openweathermap.org/data/2.5/weather?lat=52.4708485&lon=13.4051777&mode=html
Quelle
Ganz vergessen zu erwähnen: Habe durch deinen Post nochmal Script und Pseudo-Sensor-Script überprüft und getestet und fand das Problem, warum es da Unterschiede in der Lokalisierung gab. Ist jetzt in der aktuellen Labor behoben und man kann die Koordinaten aus der smarthome.conf verwenden. Danke nochmal für den Anstoß. :)

Aber ich muss nochmal in die Runde ganz allgemein fragen, die viel mit PHP arbeiten: Wenn ein Script sich selbst mit einer neueren Datei-Version überschreibt, müsste dies doch Probleme geben. (Bei Batch-Dateien (Interpreter-Sprachen allgemein) ist dies jedenfalls problematisch.) Wie sieht es mit includes aus? Wird zuvor das Script mitsamt includes in den Arbeitsspeicher geladen und man kann diese gefahrlos mit z. B. neueren Versionen auf dem Medium überschreiben? Eigentlich müsste dies auch Probleme geben... :gruebel:
 
Moin

:confused:
Wenn ein Script sich selbst mit einer neueren Datei-Version überschreibt, müsste dies doch Probleme geben. (Bei Batch-Dateien (Interpreter-Sprachen allgemein) ist dies jedenfalls problematisch.) Wie sieht es mit includes aus?
It depends...
Zum Beispiel wann die Versionsprüfung stattfindet und/oder die (alten/neuen) Includes geladen werden.
Die Includes werden nur eingelesen (read/close), während des Updatevorgangs sind die also nicht offen.
Da dürften also keine Dateien offenbleiben und können durch Update ersetzt werden.
Am End muss nur noch die neue smarthome.php gestartet werden.
Oder vielleicht eine PHP die checkt ob alles in Ordnung ist, und dann erst die neue smarthome.php.

EDIT: Ich kann noch dieses Skript beisteuern, falls auch noch irgendetwas als Klingelalarm eingebaut werden sollte.
/smarthome/scripts/dialer.sh
Code:
#!/bin/sh
if [ ${#} -eq 1 ] ; then
ctlmgr_ctl w telcfg command/Dial ${1}
echo -ne $(basename $0)': Dialing '${1}'\n'
else
ctlmgr_ctl w telcfg command/Hangup 1
echo -ne $(basename $0)': Hangup!\n'
return 1
fi
#EOF
...kann auch über eine CGI aufgerufen werden...
/cgi-bin/dialer.cgi
Code:
#!/bin/sh
echo 'Content-type: text/plain
'
arg=$QUERY_STRING
../smarthome/scripts/dialer.sh $arg
#EOF
...zum Beispiel: /cgi-bin/dialer.cgi?**1
Code:
dialer.sh: Dialing **1
Ein Aufruf ohne Nummer legt auf. ;)
/cgi-bin/dialer.cgi
Code:
dialer.sh: Hangup!
Es wird als Quelltelefon das Wählhilfetelefon benutzt (das klingelt nicht).
Abgangsnummer (nur extern) ist die: Ausgehende Rufnummer
(fritz.box/fon_num/sip_option.lua)

Achtung: Geht leider nur wenn der Webserver auf der Fritz!Box läuft.
 
Zuletzt bearbeitet:
neue Anwendung:

Außenbeleuchtung soll nicht die ganze Nacht leuchten, sondern unregelmässig für eine gewisse Zeit in den dunklen Tagesstunden

Def:
S-Dose1: Außenbeleuchtung

Logik
-
1) S-Dose1 von 15 Minuten vor Sonnenuntergang bis 1 Stunde nach Sonnenuntergang an
2) S-Dose1 von 30 vor Sonnenaufgang bis 30 Minuten nach Sonnenaufgang an
3) wenn dunkel und nicht an, dann per Zufall anschalten für min 15 Minuten max 30 Minuten

-
damit ließe sich auch einen Fernsehsimulation während der Urlaubszeit bauen.

-
Mist ich muss noch Dosen bestellen ;)
 
neue Anwendung:

Außenbeleuchtung soll nicht die ganze Nacht leuchten, sondern unregelmässig für eine gewisse Zeit in den dunklen Tagesstunden

Def:
S-Dose1: Außenbeleuchtung

Logik
-
1) S-Dose1 von 15 Minuten vor Sonnenuntergang bis 1 Stunde nach Sonnenuntergang an
2) S-Dose1 von 30 vor Sonnenaufgang bis 30 Minuten nach Sonnenaufgang an
3) wenn dunkel und nicht an, dann per Zufall anschalten für min 15 Minuten max 30 Minuten

-
damit ließe sich auch einen Fernsehsimulation während der Urlaubszeit bauen.

-
Mist ich muss noch Dosen bestellen ;)
@HarryHase:

Hast du irgendwo ein Angebot, wo du die Dosen billiger bekommst? :eek:
 
@koyaanisqatsi (Danke für die Info zu includes :) Hilft mir weiter) und auch @alle:

Die von mir mal so genannten Pseudo-Sensor- und Pseudo-Schalter-Scripte können wir sehr gerne einmal sammeln und später als Bausteine in getrennten Downloads (je nach dem was der Benutzer benötigt) einstellen. Das Ganze wird ja absolut modular erweiterbar. Alles was sich irgendwie per URL steuern ließe, könnte man mit zwischengeschaltetem PHP-Script mit in der Automation verwenden. Das wäre dann der zweite Schritt.

Ich werde jetzt aber erst einmal die zwei wichtigen Dinge Delay und Kettenbedingung programmieren. Dann sehen wir weiter, in wieweit in der Logik noch Probleme auftauchen.

@HarryHase: Das mit der Zufallsschaltung, das könnte ich als Zufallsdelay einbauen. Langsam wirds richtig kompliziert. :gruebel:
 
Zuletzt bearbeitet:
@JL3 wenn nicht dann nicht ... war ja nur wieder eine (blöde) Idee ....

letzten Dosen kamen über Amazon ...
 
@HarryHase: Schaltverkettung ist fertig und funktioniert! :)
aber........ das mit dem Delay generell ist ein großes Problem. Das Script läuft ja nur einige Sekunden und kann sich nichts in Variablen merken. Es müsste für jedes Kettenglied einen Countdown irgendwo zwischenspeichern und auch, ob das vorangegangene Kettenglied positiv abgearbeitet wurde. Das ist... nicht ganz einfach. Ich suche noch einen Weg... :gruebel:
 
cool .... ich denke damit hängst Du alle smart Home Hersteller ab ...

delay: stimmt, eine pause wäre auch keine lösung ... muss ich auch noch mal eine nacht drüber schlafen, war halt eine idee einer weiteren anwendung
 
@alle: NEUE Labor 5188 steht bereit!

@HarryHase: So, oben ist jetzt bis aufs Delay alles drin. Die Verkettung wird über die Eingabe der Folge-SCHID erreicht.

Beschreibung:
15 K 16 bedeutet SCHID15 ist ein Startkettenglied (Kennzeichen K) und bei Bedingung erfüllt gehts mit SCHID16 weiter
16 + 0 bedeutet SCHID16 ist ein Folgekettenglied (Kennzeichen +) und bei Bedingung erfüllt gehts hier nicht weiter weil Folge-SCHID ist 0
17 K 0 bedeutet SCHID17 ist ein Startkettenglied und hat aber kein Folgekettenglied. (Sind die normalen Schaltungen, wie sie mal waren)

Das mit dem Delay: Ich sagte nur, es ist schwierig, nicht dass es unmöglich ist ;)
Ich muss da nur einen Weg finden.


Nachtrag: In der AutomationsUI sind die ersten 5 Felder neu und optisch noch nicht so sauber eingebunden. Die SCHID eines neuen Datensatzes ist bei der Erfassung immer erstmal 0 und wird beim Speichern ermittelt.
Beim Verketten kann man auch den Schaltvorgang (Gerät) "nichts" benutzen, wenn erst beim nächsten oder letzten Kettenglied geschaltet werden soll ("nichts" an oder aus ist da egal).
 
Zuletzt bearbeitet:
na klar, wollte dich doch heraus fordern .... bin leider auf dienstreise, am wochenende werde ich testen
 
Herausfordern. So, so. :)
Nein, aber Spaß beiseite, das eröffnet mit den Pseudo-Geräten als Script Szenarien, die alles schalten könnten.
Verrücktes Beispiel:
Eine Wetterseite im Web zeigt an, ob gerade die Sonne scheint, eine andere, ob der Boden trocken ist und das Automationstool verknüpft das und startet die Gartenbewässerung.
 
Labor 5191
Fehlerkorrektur: Verweis auf unbekanntes Kettenglied bricht nun Kette ab, als ob Folgekettenglied 0 wäre, statt Endlosschleife.
 

Statistik des Forums

Themen
246,056
Beiträge
2,245,210
Mitglieder
373,480
Neuestes Mitglied
Skyscraperfan
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.