SensorAndSwitch Haus-Automation auf Webserver-Basis

Bin den geposteten Links gefolgt, hab aber nichts brauchbares finden können.
Überlegt auch mal was die für Listen zurückliefern, hier in Berlin sind das echt
eine Menge. Da finde ich es praktikabler einen Sensor pro ausgesuchte Tankstelle
zu haben. Alle Spritsorten braucht man auch nicht.
Ohne API siehts halt schlecht aus.

@dtrieb: Bevor ich es vergesse. Sensoren die HTML zurückliefern sind etwas tricky.
Wenn sie auch als Sensoren dienen sollen, nicht nur als Anzeige.
Dann entweder noch einen versteckten (pseudo***auto_s.php) Sensor bauen,
der nur eine 0 oder 1 zurückliefert, und darauf prüfen, oder du musst das HTML vergleichen.
Denn wenn...
Code:
P#<div style='position:relative;top:-20px;color:green;font-size:3em;'>ONLINE</div>*HTML#
...zurückkommt, musst du es auch mit...
Code:
P#<div style='position:relative;top:-20px;color:green;font-size:3em;'>ONLINE</div>*HTML#
...vergleichen.
Deswegen wird so ein HTML Anzeige Sensor nicht mit sasap.php in Kettenstartglieder/Kettenfolgeglieder funktionieren.

Merke also: Benutze nur Textsensoren in sasap.php
 
Zuletzt bearbeitet:
War eigentlich grad an der delay-Logik, aber hab hier schnell mal gelesen. Klar kann man aus einer HTML-Seite ohne Probleme Werte rausfiltern. Hab das sogar schon aus einer Grafik gemacht, die zum Zeichnen Werte übergeben bekommen hat. Das ist kein Problem. Aber wenn ich das jetzt bastel, dann wird das Hauptprogramm nie fertig. ;)

ich sag nur substr und posstr. Damit sucht man sich alles raus, was man braucht. Ihr müsst nur etwas erfinderisch sein und unorthodox kreativ.
Sucht nach einer eindeutigen Zeichenkette vorm Preis. Grenzt das dann ein und schneidet mit substr den Wert raus. Befreit den Wert von unnützem Anhang, indem ihr ihn mit 1 multipliziert. API und xml sind zwar hübsche Spielsachen, aber brauchen tut man sie nicht ;)

Wenn ich Zeit finde, bastel ich schnell die kleine Geschichte. Die tankentanken-url war dafür gar nicht schlecht. In der URL wird Ort und was für Benzin mit übergeben und das erste Ergebnis auf der HTML-Seite ist das Billigste. Rausschnippeln, anzeigen, fertig. :)
 
das eilt ja nicht, lass dich von meinen Ideen nicht unterbrechen!
 
So hier bitte: Ermittelt automatisch im Umkreis von 5km vom Wohnort lt Koordinaten die billigste Tanke für E5:
pseudosprit.php
Code:
<?php

	/*
		+---------------------------------------------------------------------+
		|                                                                     |
		|   SensorAndSwitch Automation Pro                                    |
		|   PseudoGeräte-Script                                               |
		|   ===============================================================   |
		|   -> Sprit                                                          |
		|      tankentanken.de                                                |
		|                                                                     |
		+---------------------------------------------------------------------+
	*/

	error_reporting(0);
	include "include/includedateien.php";
	include "include/includefunctions.php";
	include "include/includeconf.php";
	include "include/includeconfig.php";
	include "include/includedefine.php";
	$PLZStadt="Umkreis";
	$url='http://www.tankentanken.de/suche/[COLOR="#FF0000"][B]supere5[/B][/COLOR]/[B][COLOR="#008000"]5[/COLOR][/B]/'.$PLZStadt.'/'.BREITENGRAD.'/'.LAENGENGRAD;
	$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) {
		$x=$Status;
		do {
			$x=substr($x,strpos($x,'<div class="price">')+19);
			$x=substr($x,strpos($x,'<div class="price">')+19);
			$Preis=substr($x,0,4);
			$Name=substr($x,strpos($x,'<div class="name">')+18);
			$Tanke=explode("<",$Name);
		} while ($Preis=="-.--");
		echo "P#".$Preis."9 EUR bei".$Tanke[0]."*HTML#";
	}
	else {
		echo "P##E##";
	}
	exit;
?>

Nur dass ihr nicht denkt, quatschen kann er viel, aber wie soll man das mit html analysieren? Es geht. :)

Ganz ohne API oder xml. Achja, oben nichts bei $PLZStadt verändern. Der nimmt so oder so die Koordinaten.
Achja, kann auch auf Diesel oder E10 abgeändert werden (rot). Umkreis in km (grün) Zeigt Tankstellenname und Adresse an. Könnte grafisch noch ein bisschen schöner gestaltet werden, aber dazu fehlt mir im Moment die Zeit.
 
Zuletzt bearbeitet:
@dtrieb: Bevor ich es vergesse. Sensoren die HTML zurückliefern sind etwas tricky.
Wenn sie auch als Sensoren dienen sollen, nicht nur als Anzeige.
Dann entweder noch einen versteckten (pseudo***auto_s.php) Sensor bauen,
der nur eine 0 oder 1 zurückliefert, und darauf prüfen, oder du musst das HTML vergleichen.
Denn wenn...
Code:
P#<div style='position:relative;top:-20px;color:green;font-size:3em;'>ONLINE</div>*HTML#
...zurückkommt, musst du es auch mit...
Code:
P#<div style='position:relative;top:-20px;color:green;font-size:3em;'>ONLINE</div>*HTML#
...vergleichen.
Deswegen wird so ein HTML Anzeige Sensor nicht mit sasap.php in Kettenstartglieder/Kettenfolgeglieder funktionieren.

Merke also: Benutze nur Textsensoren in sasap.php
Du meinst Werte-Sensoren. Die Variante P#wert*Einheit#

Jep. Für Werte für sasap ist der P#wert*Einheit# ideal und auch dafür gedacht.
Da kann man dann wert ganz normal unter Pseudo-Sensor vergleichen. Schau dir die Beispiele an: pseudoaussentemp.php und pseudoaussentemp2.php. Die zweite ist eine Pxxx*yyy#.
P#xxx*HTML# ist für Bedingungen ungeeignet.
 
Zuletzt bearbeitet:
@JL3

hat dir schon mal jemand gesagt, dass du gut bist:D
 
Unsinn. Ich improvisiere nur etwas unkonventionell bis es funktioniert. Sonst nix. :)
 
Unsinn. Ich improvisiere nur etwas unkonventionell bis es funktioniert. Sonst nix. :)

Im Tiefstapeln bist Du auch gut :verdaech:


Ich habe den Admin mal angeschrieben ob wir nicht gleich einen eigenen Bereich bekommen können, dann sind mehrere threads und die 3 von Dir erwähnten als gepinnte Version kein Ding mehr ...
 
:)

Aber gute Idee, denn hier wirds echt langsam unübersichtlich.

Ich habe übrigens endlich eine brauchbare Idee für delay. Ich verpasse dem Script einfach ein Gedächtnis und dann müsste es funktionieren. Ich mach mir nur noch Sorgen um die vermehrten Schreibzugriffe grad auf USB-Sticks. Das ist nicht unproblematisch.
 
Zuletzt bearbeitet:
:)
Ich habe übrigens endlich eine brauchbare Idee für delay. Ich verpasse dem Script einfach ein Gedächtnis und dann müsste es funktionieren. Ich mach mir nur noch Sorgen um die vermehrten Schreibzugriffe grad auf USB-Sticks. Das ist nicht unproblematisch.

Ich habe auf der Fritze auch schon Sachen gemacht die oft logs geschrieben haben, damit die nicht ständig auf dem Stick rumnuddeln habe ich das in /tmp gemacht; Beim Start alles von usb -> /tmp kopiert und dann da gemacht. Natürlich mit dem Nachteil das ein Stromausfall oder Neustart das temporäre Ergebnis vergisst. Das war bei dem Projekt aber egal, da jeder Start eine neue Initialisierung gemacht hat. Wenn es Zwischenergebnisse zwingend erforderlich waren (ehr selten, alle 2-3 Monate) habe ich eine komplette Kopie von /tmp -> usb geschoben und damit dann auch neue Startbedingungen.
 
Noch ne hübschere Variante von pseudosprit.php:
Code:
<?php

	/*
		+---------------------------------------------------------------------+
		|                                                                     |
		|   SensorAndSwitch Automation Pro                                    |
		|   PseudoGeräte-Script                                               |
		|   ===============================================================   |
		|   -> Sprit                                                          |
		|      tankentanken.de                                                |
		|                                                                     |
		+---------------------------------------------------------------------+
	*/

	error_reporting(0);
	include "include/includedateien.php";
	include "include/includefunctions.php";
	include "include/includeconf.php";
	include "include/includeconfig.php";
	include "include/includedefine.php";
	$PLZStadt="Umkreis";
	$Benzin="supere5";   # Möglichkeiten: supere5, supere10, diesel
	$km="5";             # Such-Umkreis in km
	$url='http://www.tankentanken.de/suche/'.$Benzin.'/'.$km.'/'.$PLZStadt.'/'.BREITENGRAD.'/'.LAENGENGRAD;
	$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) {
		$x=$Status;
		do {
			$x=substr($x,strpos($x,'<div class="price">')+19);
			$x=substr($x,strpos($x,'<div class="price">')+19);
			$Preis=substr($x,0,4);
			$Name=substr($x,strpos($x,'<div class="name">')+18);
			$Tanke=explode("<",$Name);
			$T=explode("|",$Tanke[0]);
			$T[0]=trim($T[0]);
			$T[1]=trim($T[1]);
		} while ($Preis=="-.--");
		echo "P#".'<div style="font-size:26px;text-align:right;width:310px;position:relative;top:-15px;">'.strtoupper($Benzin).": ".$Preis."9 €".'</div><div style="font-size:20px;text-align:right;width:310px;position:relative;top:-15px;">'.$T[0].", ".$T[1].'</div>'."*HTML#";
	}
	else {
		echo "P##E##";
	}
	exit;
?>

So, bin dann schalter3.png
 
@koyaanisqatsi:

Magst du das nicht auch noch programmieren?

Des weitern ist mir noch die Idee gekommen, das der letzte Anruf angezeigt werden könnte.
Also:

  • Letzter eingehender Anruf von: xxx
  • Letzter ausgehender Anruf an: yyy
 
Hehe, nett.

Und um das Geschriebene um die Auswertbarkeit von Sensoren zu verdeutlichen, so...
pseudotelnet.php
PHP:
<?php
if ($_GET["info"]=="status") {
$timeout = 1;
$ip = "fritz.box";
$port = "23";
$fp = @fsockopen($ip, $port, $timeout);
if($fp)
{
$Status="P#1*Online#";
fclose($fp);
}
else
{
$Status="P#0*Offline#";
}}
echo $Status;
?>
pseudoftp.php
PHP:
<?php
if ($_GET["info"]=="status") {
$timeout = 1;
$ip = "fritz.box";
$port = "21";
$fp = @fsockopen($ip, $port, $timeout);
if($fp)
{
$Status="P#1*Online#";
fclose($fp);
}
else
{
$Status="P#0*Offline#";
}}
echo $Status;
?>
pseudohttps.php
PHP:
<?php
if ($_GET["info"]=="status") {
$timeout = 1;
$ip = "fritz.box";
$port = "443";
$fp = @fsockopen($ip, $port, $timeout);
if($fp)
{
$Status="P#1*Online#";
fclose($fp);
}
else
{
$Status="P#0*Offline#";
}}
echo $Status;
?>
...kann auch auf das Vorhandensein von Serverdiensten getestet werden (sasap.php).
 
@koyaanisqatsi:

Könntest du bitte die vielen PseudoGeräte-Scripte sammeln und nach den Kategorien
  • hardwareunabhängig (Weburls usw.)
  • httpd-Fritzbox (Läuft auf der Fritzbox und benötigt root-Zugriff)
  • hardwarespezifisch (benötigt spezielle Hardware, Fremdgeräte wie IP-Steckdosen, IP-Sensoren, etc.)
einteilen?

Ich hoffe, du hast da noch den besseren Durchblick als ich, weil ich hab hier schon weit mehr als ein Dutzend gezählt. Im Augenblick habe ich nur einige wenige in der sas-Zip-Datei.

Später könntest du daraus drei Zip-Dateien machen und hier einstellen (bis wir eigene Threads dafür haben). Dann können wir entscheiden, was wir gleich zu sas mit dazu packen und was wir als getrennte Zip-Datei anbieten. Z. B. allgemeine Sensoren übers Web wären für jeden interessant, Schaltscripte für z. B. spezielle IP-Dosen nur für den, der sie besitzt. Ich hoffe, ich habe das halbwegs vernünftig sortiert. :)


-
@alle:

Das wird das Logo von sas:
sas.png


Ich habe auf der Fritze auch schon Sachen gemacht die oft logs geschrieben haben, damit die nicht ständig auf dem Stick rumnuddeln habe ich das in /tmp gemacht; Beim Start alles von usb -> /tmp kopiert und dann da gemacht. Natürlich mit dem Nachteil das ein Stromausfall oder Neustart das temporäre Ergebnis vergisst. Das war bei dem Projekt aber egal, da jeder Start eine neue Initialisierung gemacht hat. Wenn es Zwischenergebnisse zwingend erforderlich waren (ehr selten, alle 2-3 Monate) habe ich eine komplette Kopie von /tmp -> usb geschoben und damit dann auch neue Startbedingungen.
Wir haben ohnehin das Problem, dass uns die debug.cfg nicht mehr zur Verfügung steht, um eventuelle Reboots abzufedern. Sprich: Macht die Fritzbox einen Reboot, dann wars das mit httpd und cron. Das ist auch noch ein Problem, das uns AVM da unangenehmer weise mit ihrem Sicherheits(panik)gehabe eingebrockt hat. Eine Anfrage nach einer Aktiviermöglichkeit - so wie bei Telnet - verlief, wie so viele Anfragen, einfach im Sande. Man ist ja anscheinend nur dummer Kunde und hat keine Ahnung.

Naja, sas ist ja auf die Fritzbox nicht unbedingt angewiesen, aber wäre schön gewesen, nur ein Gerät, was eh ständig läuft, zu betreiben, statt einem NAS oder der "Himbeere" (Werd mir das Teil wohl auch mal zulegen). FHEM haben sie ja auch relativ unsanft abgewürgt und musste dann auf andere Hardware umziehen.
 
Zuletzt bearbeitet:
Noch ne hübschere Variante von pseudosprit.php:
Code:
(...)
.$Preis."9 €"
(...)

Code:
.$Preis."9&euro;"
...sonst wird bei mir kein Eurosymbol angezeigt (und den Plenk mag ich nicht ;) )...

Muss echt sagen: der Hammer, was hier aus deinem kleinen Script schon geworden ist!
Und was den Raspi angeht: kauf dir den B+, der wird selten mehr als 2W Strom ziehen - verschmerzbar, will ich meinen.

Apropros: hat eigentlich mal jemand gemessen, wieviel Saft die DECT200 überhaupt benötigt?
 
(...) Ich verpasse dem Script einfach ein Gedächtnis (...)

Wie ist denn das eigentlich aktuell mit den Pseudogeräten (Spritpreis und Wetter bspw.): werden die im gleichen Intervall aktualisiert wie die Echten? Wäre es hier nicht sinnvoller (und schonender) für solche doch eher statischen Ausgaben einen zweiten Intervall einzubauen, der bspw. nur alle 10 min. eine Aktualisierung triggert?
Nur ein Gedanke...
 
Moin

:confused:
JL3 schrieb:
Könntest du bitte die vielen PseudoGeräte-Scripte sammeln und nach den Kategorien

  • hardwareunabhängig (Weburls usw.)
  • httpd-Fritzbox (Läuft auf der Fritzbox und benötigt root-Zugriff)
  • hardwarespezifisch (benötigt spezielle Hardware, Fremdgeräte wie IP-Steckdosen, IP-Sensoren, etc.)
einteilen?

Klar, mach ich das. ;)

Derzeitiger Stand...
Code:
info.txt                      pseudoautoserver.php          pseudoautossh.php
pseudoaussentemp.php          pseudoautosnom1.php           pseudoautovoicemail.php
pseudoaussentemp2.php         pseudoautosnom1screen.php     pseudoautowetter.php
pseudoauto629.php             pseudoautosnom2.php           pseudoautozeit.php
pseudoautoaussentemp.php      pseudoautosnom2screen.php     pseudogastwlan.php
pseudoautocputemp.php         pseudoautosprit.php           pseudoschalter.php
pseudoautogastwlan.php        pseudoautosqlite3_1.php       pseudosystemzeit2.php
pseudoautoglobalvariable.php  pseudoautosqlite3_2.php       pseudowetter.php
pseudoautomediaserver.php     pseudoautosqlite3_3.php       pseudowlan.php
pseudoautopingtest.php        pseudoautosqlite3_4.php       speziellehardware/
pseudoautoschalter.php        pseudoautosqlite3_5.php

TIP: Die Skripte kopiere ich schon lange nicht mehr aus pseudobeispiele/ ins
sensorandswitch/ Verzeichnis.
Unter Linux wird ein Softlink erstellt...
Code:
ln -sf pseudobeispiele/pseudoautossh.php pseudossh.php
...der, je nach Bedarf umbenannt...
Code:
mv pseudossh.php pseudosshauto.php
...oder gelöscht...
Code:
rm pseudosshauto.php
...wird. (USB-Dateisystem: NTFS, ext2, ext3, ext4)

Bugreport: sensorandswitchautoproui.php
Schalttyp: Pseudo-Sensor
Beschreibung: Wenn der Operator gleich (=) ist, schlägt die Prüfung fehl.

Beispiel:

Fehlschlag:
Wenn Gerät: Anrufbeantworter gleich 1 ist
Wenn Gerät: Anrufbeantworter gleich 2 ist
Die Angabe des Datentyps mittels "1" brachte nichts, wurde einfach verworfen/ignoriert.

Erfolgreich:
Wenn Gerät: Anrufbeantworter größer 0 ist
Wenn Gerät: Anrufbeantworter größer 1 ist
...wobei hier die Bedingungen auch bei 10 Nachrichten zutreffen.

Die Operatoren: kleiner, größer
...funktionieren wie erwartet.
Bei: kleinergleich und größergleich
...scheint es auch Probleme zu geben.
(Wenn Gerät: Anrufbeantworter kleinergleich 0 ist) löst auch nicht aus.

Vielleicht fehlt schlicht das 2. Gleichheitszeichen bei/in der internen Prüfung?
= (Fehlerverursacher)
== (Richtiger Operator)

pseudoanrufbeantworter.php
PHP:
<?php // httpd-Fritzbox (Läuft auf der Fritzbox und benötigt root-Zugriff)
if ($_GET["info"]=="status") {
$Status=shell_exec('ctlmgr_ctl r tam settings/NumNewMessages');
}
echo "P#".$Status."*Nachrichten#";
?>
 
Zuletzt bearbeitet:
Naja, sas ist ja auf die Fritzbox nicht unbedingt angewiesen, aber wäre schön gewesen, nur ein Gerät, was eh ständig läuft, zu betreiben, statt einem NAS oder der "Himbeere" (Werd mir das Teil wohl auch mal zulegen). FHEM haben sie ja auch relativ unsanft abgewürgt und musste dann auf andere Hardware umziehen.

Was man auch probieren könnte ist ein Amazon Fire TV kostet 99 Euro, hat mächtig Bums und geringste Leistungsaufnahme!!! - Wenn ich die Zweit und ein Gerät finde werde ich das zwischen den Feiertagen probieren. Sollte unter Android ja auch alles laufen.
 
Hallo zusammen!

Ich habe da noch eine Idee für eine spätere Version ...
Wie wäre es wenn wir noch die Möglichkeit schaffen, ein kleines Webcam Bild einbinden.
 
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.