SensorAndSwitch Haus-Automation auf Webserver-Basis

Bei mir werden im Gerätenamen keine Umlaute angezeigt, hat jemand eine Idee, woran das liegen könnte.

Kueche.jpg
 
@eDonkey: Die Webseiten sind in UTF-8 kodiert. Vermutlich hat der Browser damit Probleme. Hm, seltsam ist, dass "Gerät" angezeigt wird. Steht der Name in UTF-8 in der Fritzbox-Weboberfläche richtig drin und wird diese in UTF-8 angezeigt? Welche FW-Version hat die Fritzbox?

Bei mir kommt Testweise das raus:
(angehängte Grafik)

Nachtrag: Wenn gar nichts hilft, einfach ü zu ue. Und noch ein Tipp am Rande: Redundante Texte, wie das vorangestellte FRITZ!DECT machen die Namen unnötig lang und sagen nichts aus. Entweder ganz weglassen oder FD. Dann bleibt mehr Platz für einen aussagekräftigen Namen. :)

Nachtrag2: Sehe gerade, dass es ja eine alte FW ist. Ich kann den Fehler nachstellen. Das Problem ist in FW <6.10 zu finden.
 

Anhänge

  • äöüß.png
    äöüß.png
    36.4 KB · Aufrufe: 17
Zuletzt bearbeitet:
Problem gefunden: Suche in smarthome.php die Zeile
Code:
			$GerListARR[$nr]["Name"]=filter_var(file_get_contents(COMMAND."getswitchname&ain=".$GerListARR[$nr]["AIN"]),FILTER_SANITIZE_SPECIAL_CHARS,FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
ändere dies in:
Code:
			$GerListARR[$nr]["Name"]=trim(file_get_contents(COMMAND."getswitchname&ain=".$GerListARR[$nr]["AIN"]));
Danach wird es mit Umlauten richtig angezeigt. :)

Habe da dummer Weise einen Filter eingesetzt, der nicht nur nicht darstellbare Zeichen sondern auch äöüß rauswirft. Das ist durch obige Korrektur behoben. Betrifft nur den alternativen Zugriff auf FW <6.10.


"Offizielle" Version 4.04.5002 ist mit dieser Korrektur online gestellt. Update wie gehabt über Update-Button.

Nachtrag: Korrektur oben im Code.
 
Zuletzt bearbeitet:
Vielen Dank, hat geklappt. Dachte schon das es daran liegt, das ich das Ganze unter dem wie von koyaanisqatsi in #230 vorgeschlagenen "httpd" laufen habe.
Es läuft übrigens unter der 6.20.
 
Es ist trotzdem seltsam, denn das Script muss sich die Daten über den alternativen Weg beschaffen. Dadurch nur die stark begrenzte Anzahl an Informationen, die das Script anzeigt. Unter FW 6.20 müsste simplexml_load_string die Daten auswerten und nicht die Alternativ-Variante. :gruebel:

Nachtrag: Ich vermute schlichtweg zu niedrige PHP Version oder etwas in der php.ini ist disabled, was benötigt wird? Jedenfalls läuft es nicht so, wie es soll. Neuere Folgeversionen von smarthome.php bzw. smarthomeautopro.php könnten dann zunehmend mehr Probleme machen. Vielleicht solltest du überprüfen, welche PHP-Version da läuft und welche Einschränkungen diese hat. Zur vollen Nutzung empfehle ich hier eher die von mir im SmartHome Web erwähnten Apache mit PHP. Der kann problemlos auf einem Stick laufen. Es wäre schade, mit der httpd-Lösung nur die deutlich abgespecktere Variante von SmartHome lauffähig zu haben. :)
 
Zuletzt bearbeitet:
Moin

Naja, kein System ist gleich.
Diese php-cgi ist statisch kompiliert.
Wenn nichts in der php.ini steht und phpinfo() aufgerufen wird kommt:

This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive.
For more information as to why this behaviour exists, see the manual page for CGI security.
For more information about changing this behaviour or re-enabling this webserver, consult the installation file that came with this distribution, or visit the manual page.


Also muss für phpinfo() folgendes in die php.ini:
cgi.force_redirect = 0
cgi.redirect_status_env = no

Dann klappts...


PHP Version 5.5.6


SystemLinux deepbase 2.6.32.61 #3 SMP Tue Oct 21 11:24:34 CEST 2014 mips
Build DateDec 9 2013 14:53:03
Configure Command './configure' '--cache-file=/var/freetz/trunk/source/target-mips_gcc-4.6.4_uClibc-0.9.32.1/config.cache' '--target=mips-linux' '--host=mips-linux' '--build=x86_64-pc-linux-gnu' '--program-prefix=' '--program-suffix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--datadir=/usr/share' '--includedir=/usr/include' '--infodir=/usr/share/info' '--libdir=/usr/lib' '--libexecdir=/usr/lib' '--localstatedir=/var' '--mandir=/usr/share/man' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--with-gnu-ld' '--disable-nls' '--with-pcre-regex=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--with-curl=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--with-gd=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--enable-gd-native-ttf' '--with-iconv' '--with-iconv-dir=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--enable-json' '--with-libxml-dir=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--without-libexpat-dir' '--enable-xml' '--enable-libxml' '--enable-dom' '--enable-simplexml' '--enable-xmlreader' '--enable-xmlwriter' '--enable-pcntl' '--enable-session' '--enable-sockets' '--without-sqlite' '--with-sqlite3=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--with-pdo-sqlite=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--with-openssl=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--with-zlib' '--with-zlib-dir=/var/freetz/trunk/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/usr' '--enable-zip' '--enable-exif' '--enable-mbstring' '--disable-cli' '--disable-fileinfo' '--disable-phar' '--disable-rpath' '--with-config-file-path=/tmp/flash' '--with-config-file-scan-dir=/tmp/flash/php' '--without-pear'

Also, wenn du mal auf die Idee kommst eine Datenbank einzuführen, dann nimm bitte SQLite3. ;)
Die PDO Unterstützung ist hier mit dabei.

...auf daß wir noch lange SmartHome kompatibel sind.
 
Zuletzt bearbeitet:
@koyaanisqatsi

diese beiden Variablen hatte ich, Deiner Anleitung folgend, schon drin. Ich finde die Lösung mit dem "httpd" eleganter, zumal es, meiner Meinung nach, die Box weniger belaste. Hatte mit dem Apache immer CPU-Peak´s bei 70%.
 
Moin

Das ging auch eher an: JL3

Damit er es mit den PHP Funktionen nicht übertreibt. ;)

Sonst bleibt am End wirklich nur ein hochgezüchteter Apache mit der neuesten PHP Version übrig.
 
Zuletzt bearbeitet:
@eDonkey: Werden denn bei dir jetzt alle Informationen incl. Gerätetyp, Geräteversion und Temperatursensor angezeigt? Ansonsten funktioniert nur der eingeschränkte Alternativzugriff.

@ koyaanisqatsi: Nun, bei mir läuft absolut nicht der neueste Apache und das aktuellste PHP, aber wenn man die Funktionen benötigt und die Funktionalität von SmartHome so "gewünscht" wird, dann bleibt manchmal nichts anderes übrig, als aktuellere PHP-Funktionen zu nutzen. Ich habe noch nicht herausfinden können, woran es liegt, dass der eigentliche Abfrageaufruf bei httpd anscheinend nicht funktioniert. Deswegen nochmal meine Frage an eDonkey, welche Infos denn jetzt angezeigt werden.

Ansonsten läuft es ja auch mit altem Apache und PHP 5.3 problemlos. Bei den Verbiegungen mit httpd ist es halt nur problematisch. Natürlich ist auch kein System gleich. Dafür gibts Vorgaben, die der Entwickler machen muss. ;)

nochmal @eDonkey: Hast du schonmal Apache 2.2.17 versucht? Der läuft bei mir sehr sauber und stabil. Apache 2.4 bringt meine Box auch auf eine höhere Last.
 
nur so zur Info,

bei mir läuft apache-1.3.41-modssl_php-5.4.3_sqlite-2.1

hatte den apache auch in Verdacht mit zuviel CPU Auslastung,

deshalb hatt ich den mal auf der 7270 installiert!
Die Auslastung ist aber Box abhängig,
bei der 7270 geht die Auslastung kaum über 15% mit apache,
die 7170 liegt schon ohne USB-Stick und Server bei 15-20%
mit Server bei 25-40%

nochwas zum schalten,
hab mir mal für meine Edimax Steckdose eine Taster Funktion eingebaut, einschalten und nach 3 Sekunden wieder aus.
weis nicht ob andere Leute auch sowas brauchen?
bin selbst noch am planen was ich alles schalten kann.
 
Mußte jetzt feststellen, das das Ganze seit dem Update auf die 4.04.5002 nicht mehr funktioniert.
Habe parallel jetzt noch den Apache 2.2.17 mit PHP 5.5.6 aktiviert, um das zu verifizieren.
In der "smarthomeauto.php" wird bei Auswahl eines bestehenden Schaltpunktes das zu schaltende Gerät nicht übernommen und in der "smarthomeauto.php"
wird der aktuelle Schaltzustand nicht mehr angezeigt. Es finden auch keine Schaltvorgänge mehr statt.
Screenshot-1400-19112014.jpgScreenshot-1401-19112014.jpg

Gehe ich mit beiden Dateien zurück auf die 4.04.5001 geht es wieder.

Anmerkung: Das ganze läuft bei mir noch nicht im Produktiv-Einsatz, alles noch im Test, habe 3x546E und 1xFD200.
Der FD200 hängt per Dect an meiner (noch) primären 7390 mit 6.04 (da ich noch Probleme mit der Telefonie und LCR habe),
Upgrade auf 7490 mit 6.20 ist in Arbeit. Dann sollte auch die Temperatur vom FD200 angezeigt werden.
 
Zuletzt bearbeitet:
@eDonkey: Sorry, das hat jetzt eine ganze Weile gedauert. Das Problem war die Korrektur wegen der Umlaute. Dadurch habe ich plötzlich am Ende des Namens eines Gerätes einen Zeilenumbruch, der zuvor mit den Umlauten automatisch entfernt wurde. Bis ich dieses nicht anzeigbare Zeichen endlich gefunden hatte und es als Grund ermitteln konnte, verging eine Weile.

Aber mit Version 4.04.5003 müsste es jetzt klappen. Update wie gehabt. :)
 
Neue Labor 5209

Da ist unter Anderem auch der Fehler drin gewesen.
Am Delay arbeite ich noch. Das ist etwas schwieriger und braucht etwas Zeit.
 
muss nochmal nachfragen,

hab jetzt versucht mit der sh-pro mein script für Edimax zu testen.
in meiner Edi.php ist folgende Zeile drin zum abfragen:
if ($_GET["schalter"]=="1") {
$output=shell_exec($an);

wenn ich mein sript mit Edi.php?schalter=1 aufrufe wird die Dose geschaltet, aber mit smarthomeautopro tut sich da nichts.
die Anzeige zeigt geschaltet an, allerdings mit einem Anzeigefehler, die Felder sind verschoben.
was mache ich da verkehrt?
shpro2.JPG
 
Du musst erstmal dein Script so erweitern, dass auch was zurückgeliefert wird:

Code:
if ($_GET["schalter"]=="1") {
$output=shell_exec($an);
echo "1";
}
else {
echo "E";
}

Und GANZ WICHTIG! Das Script muss mit URL z. B. http://[server].../edi.php eingebunden werden. NICHT nur den Namen. Ansonsten wird es nur als Textfile interpretiert. ;)

Nachtrag: Was steht denn in $output? Was wird da zurückgeliefert?

Am elegantesten wäre es, wenn du vorher den Status des Schalters prüfen könntest. Befindet er sich schon in dem Zustand, muss ja nicht nochmal geschaltet werden und mit echo "N"; würde auch Smarthome das dann mitbekommen..

Naja, vielleicht kannst du hier mal folgende Schalt-Aufrufe deiner Edimax-Dosen mir nennen:
Statusabfrage, wie der aktuelle Schaltzustand ist (hoffe, das gibts),
anschalten
ausschalten

dann bastel ich dir daraus mal schnell ein Pseudo-Schalt-Script zum Einbinden und dann hast du und auch alle anderen für andere Schaltvorgänge eine sinnvolle Vorlage. :)
 
Zuletzt bearbeitet:
Hallo,

es war die URL die gefehlt hat.
echo war mit drin nur Else noch nicht.
Funktioniert soweit, nur wenn ich das else mit drin hab melder er mit beim einschalte "1E" beim ausschaltet "E0" .
ist das richtig?
hier mal mein Script
PHP:
<?php /*
Edi.php
*/
$user="admin";
$password="1234";
$ip="192.168.178.27:10000";
$Pfad="/var/media/ftp/Generic-Flash-Disk-01/apache-1341/htdocs";
$an=$Pfad.'/curl -d @'.$Pfad.'/on.xml http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';
$aus=$Pfad.'/curl -d @'.$Pfad.'/off.xml http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';
date_default_timezone_set('Europe/Berlin');
$ZeitG=date("HiNdmYI");
$Zeit=substr($ZeitG,0,13);
$ZeitM=date("HiNdmYI",mktime(substr($Zeit,0,2)+24,substr($Zeit,2,2),0,substr($Zeit,7,2),substr($Zeit,5,2),substr($Zeit,9,4)));
$DST=substr($ZeitG,13,1)*1;
$DSTM=substr($ZeitM,13,1)*1;
if ($_GET["schalter"]=="1") {
$output=shell_exec($an);
$dateihandle = fopen("Protokoll.txt","a+");
fwrite($dateihandle, "am ".date(d)."-".date(m)."-".date(y)." um ".date(H).":".date(i)." eingeschaltet 
");
echo "1";
}
else {
echo "E";
}
if ($_GET["schalter"]=="0")  {
$output=shell_exec($aus);
$dateihandle = fopen("Protokoll.txt","a+");
fwrite($dateihandle, "am ".date(d)."-".date(m)."-".date(y)." um ".date(H).":".date(i)." ausgeschaltet 
");
echo "0";
}
else {
echo "E";
}
if ($_GET["schalter"]=="Taster") {
$output=shell_exec($an);
$dateihandle = fopen("Protokoll.txt","a+");
fwrite($dateihandle, "am ".date(d)."-".date(m)."-".date(y)." um ".date(H).":".date(i)." Taster ein 
");
sleep(1);
$output=shell_exec($aus);
fwrite($dateihandle, "am ".date(d)."-".date(m)."-".date(y)." um ".date(H).":".date(i)." Taster aus 
");
echo "Taster";
}
?>

Status abfragen geht auch, hab mir schonmal eine Variable dafür angelegt.

$edipowerstate=$Pfad.'/curl -d @'.$Pfad.'/powerstate.xml http://'.$ediuser.':'.$edipassword.'@'.$ediip.'/smartplug.cgi';

aber das auswerten werde ich wohl nicht können.
Dafür hab ich zuwenig Ahnung.
Ist mir jetzt auch nicht so wichtig.
 
Was schreibt er in $edipowerstate rein? Wenn du mir das sagen könntest, wäre es hilfreich.

Ich schau mir oben dein Script an und ändere es noch etwas ab. E0 und 1E ist nicht das, was zurückgegeben werden soll, aber das sehe ich dann. Dauert etwas. Muss jetzt erstmal SmartHome beiseite legen. :)
 
Code:
<?php 
 
/* Edi.php */
 
$user="admin";
$password="1234";
$ip="192.168.178.27:10000";
$Pfad="/var/media/ftp/Generic-Flash-Disk-01/apache-1341/htdocs";

$an=$Pfad.'/curl -d @'.$Pfad.'/on.xml http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';
$aus=$Pfad.'/curl -d @'.$Pfad.'/off.xml http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';

# Wenn in $edipowerstate eine 0 oder 1 stehen würde, dann...

$edipowerstate=$Pfad.'/curl -d @'.$Pfad.'/powerstate.xml http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';

$Status="E";

if ($edipowerstate==$Status) {
	$Status="N";
}

if ($_GET["schalter"]=="1" and $edipowerstate=="0") {
	$output=shell_exec($an);
	$Status="1";
}

if ($_GET["schalter"]=="0" and $edipowerstate=="1") {
	$output=shell_exec($aus);
	$Status="0";
}

$edipowerstate=$Pfad.'/curl -d @'.$Pfad.'/powerstate.xml http://'.$user.':'.$password.'@'.$ip.'/smartplug.cgi';

if ($edipowerstate!=$Status) {
	$Status="E";
}

?>

Das Logifle habe ich rausgeschmissen, das übernimmt smarthomeautopro.php.
Jetzt kommt es drauf an, was im $edipowerstate zurückgeliefert wird. Schau dir das bitte mal an.
 
ganz so einfach ist das nicht,
im Script bekomme ich da nichts raus.

in Windows oder Telnet kann ich die Ausgabe in eine Datei leiten.

da steht dann bei eingeschalteter Dose folgendes drin:

Code:
<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><Device.System.Power.State>[B]ON[/B]</Device.System.Power.State></CMD></SMARTPLUG>

beim ausschalten ändert sich ON in OFF

in Windows oder Telnet kann ich das in die Datei ps.txt ausgeben, aber wie im Script das auslesen? keine Ahnung.
in $edipowerstate hab ich ja nur den Befehl zum abfragen drin, aber wo geht das Ergebnis hin??
 
Ok, die Info hilft mir weiter. Ich weiß jetzt, wie es funktioniert. :)
Ich bastel weiter...
 
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.