SensorAndSwitch Haus-Automation auf Webserver-Basis

Es gibt Probleme mit der Logik beim Delay der Folgekettenglieder. Ich grüble noch ein wenig darüber nach, aber vielleicht bringe ich besser eine Labor raus und ihr schaut es euch an, was ihr damit anfangen könnt, wenn nur das erste Kettenglied ein Delay haben kann.

Das Problem ist, dass das 1. Kettenglied oder ein Folgekettenglied bereits seine Bedingung wieder verlieren kann, bevor das letzte Folgekettenglied erfüllt ist.

Verliert in der Delay-Zeit das 1. Kettenglied seine Bedingung, springt das Delay wieder auf Ausgangswert und beginnt erneut, wenn die Bedingung wieder eintritt.

Das Ganze ist eine hochkomplexe Angelegenheit.
 
Zuletzt bearbeitet:
Würdest du auf der "Hauptseite" bei Anzahl der Geräte das Wort Geräte in z.b. Aktoren umbenennen. Da es ja jetzt nicht nur Geräte mehr sind.
 
Moin

@JL3: Die Auslagerung nach /var/tmp kann ich eigentlich nur unterstützen.
Warum: Ist RAM und von daher das schnellste Laufwerk welches SaS zur Verfügung steht.

Zur Verdeutlichung ein Performancetest (schreiben) mit diskdump...
1Mb schreiben in /var/media/NEW_LINK (zuletzt gemounteter USB-Speicher)
Code:
dd if=/dev/zero of=/var/media/NEW_LINK/testfile bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0MB) copied, 0.043209 seconds, [COLOR=red]23.1MB/s[/COLOR]
1Mb schreiben in /var/tmp (RAM)
Code:
dd if=/dev/zero of=/var/tmp/testfile bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0MB) copied, 0.012617 seconds, [COLOR=red]79.3MB/s[/COLOR]
...lesen geht natürlich noch schneller. (Abhängig von Box/Speicher/CPU)
AVM macht das übrigens auch so.

Weiterhin, mein Test mit SQLite hat bis jetzt ergeben:
2000 Besuchereintragungen = Datenbankgröße ~= 200Kb

Möchtest du mal in die Fritz!Box SQLite3 Datenbanken gucken?
SQLite3 Datenbanken beinhalten die sqlite_master und dort steht wie die Tabellen erzeugt wurden.
/sensorandswitch/db.php
PHP:
<?php
date_default_timezone_set('Europe/Berlin');
$strDatenbank = 'sqlite:/var/media/NEW_LINK/sensorandswitch/sas.db3';
$dbh = new PDO($strDatenbank);
?>

/sensorandswitch/master.php
PHP:
<?php
include("db.php");
try {
  $dbh = new PDO($strDatenbank);
  $sth = $dbh->prepare('select rowid, * from sqlite_master');
  $sth->execute();
  sleep(0.125);
  $dbh = null;
$dbh = null;
echo '<table border="1"
style="background:fixed 0% 0% repeat olive url(/rte/img/bg.jpg);
table-layout:fixed;
border:3px double olive;
border-collapse:inherit;
border-spacing:3px 5px;">
<tr><th>type</th><th>name</th><th>tbl_name</th><th>rootpage</th><th>sql</th></tr>';
while($Zeile = $sth->fetch(PDO::FETCH_ASSOC)){?>
<tr>
<td><?php echo $Zeile['type']; ?></td>
<td><?php echo $Zeile['name']; ?></td>
<td><?php echo $Zeile['tbl_name']; ?></td>
<td><?php echo $Zeile['rootpage']; ?></td>
<td><?php echo $Zeile['sql']; ?></td>
</tr>
<?php
}
echo '</table>';
}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>

Jetzt noch eine Fritz!Box Datenbank als Softlink in /sensorandswitch bereitstellen...
Code:
ln -sf /var/tmp/fritznasdb_main.db3 sas.db3
...und die /sensorandswitch/master.php im Browser aufrufen.
Willst du die Indexdatenbank eines USB-Speichers sehen,
dann verlinke auf...
Code:
ln -sf /var/media/NEW_LINK/FRITZ/mediabox/fritznasdb_part.db3
...und die /sensorandswitch/master.php im Browser aufrufen.

Echt praktisch die sqlite_master. Damit konnte ich dann Anzeige PHPs basteln wie diese, ganz einfache...
statistic.php (Für /var/media/NEW_LINK/FRITZ/mediabox/fritznasdb_part.db3)
PHP:
<?php // Für /var/media/NEW_LINK/FRITZ/mediabox/fritznasdb_part.db3
include("db.php");
try {
$options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);
$dbh = new PDO($strDatenbank);
$sth = $dbh->prepare("SELECT * FROM statistic");
$sth->execute();
sleep(0.125);
$dbh = null;
echo '<h2>
Tabelle(statistic)</h2>
<table border="1"
style="background:fixed 0% 0% repeat olive url(/rte/img/bg.jpg);
table-layout:fixed;
border:3px double olive;
border-collapse:inherit;
border-spacing:3px 5px;">
<tr><th>id</th><th>dbversion</th><th>partition_audio_count</th><th>partition_video_count</th><th>partition_image_count</th><th>partition_other_count</th><th>partition_doc_count</th><th>partition_total_file_count</th></tr>
';
while($Zeile = $sth->fetch(PDO::FETCH_ASSOC)){
?>
<tr>
<td>
<?php
echo $Zeile['id'];
?>
</td>
<td>
<?php
echo $Zeile['dbversion'];
?>
</td>
<td>
<?php
echo $Zeile['partition_audio_count'];
?>
</td>
<td>
<?php
echo $Zeile['partition_video_count'];
?>
</td>
<td>
<?php
echo $Zeile['partition_image_count'];
?>
</td>
<td><?php echo $Zeile['partition_other_count']; ?>
</td>
<td>
<?php
echo $Zeile['partition_doc_count'];
?>
</td>
<td>
<?php
echo $Zeile['partition_total_file_count'];
?>
</td>
</tr>
<?php
}
echo '</table>';
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

Pseudo-Sensor: Schaltet immer noch nicht bei: Wenn Gerät: Anrufbeantworter gleich 0
...nur bei: Wenn Gerät: Anrufbeantworter kleiner 1
 
Zuletzt bearbeitet:
Pseudo-Sensor: Schaltet immer noch nicht bei: Wenn Gerät: Anrufbeantworter gleich 0
...nur bei: Wenn Gerät: Anrufbeantworter kleiner 1

Wäre hilfreich, wenn du den PseudoSensor sagst, den du verwendest. Tippe auf P#xxx*yyy#?
Mach mal in deiner PseudoSensor ein trim($Status) anstelle von nur $Status. Kann sein, dass $Status nicht wirklich "0" zurück liefert, sondern noch nicht darstellbare Zeichen. Poste bitte nochmal dein Script hier.
 
Naklar.

Ich beziehe mich auf exakt dasselbe Skript wie beim Bugreport.
PHP:
<?php // httpd-Fritzbox (Laeuft auf der Fritzbox und benoetigt root-Zugriff)
if ($_GET["info"]=="status") {
$Status=shell_exec('ctlmgr_ctl r tam settings/NumNewMessages');
}
echo "P#".$Status."*Nachrichten#";
?>

Jetzt bau ich mal ein trimm ein...
PHP:
<?php // httpd-Fritzbox (Laeuft auf der Fritzbox und benoetigt root-Zugriff)
if ($_GET["info"]=="status") {
$Status=shell_exec('ctlmgr_ctl r tam settings/NumNewMessages');
}
echo "P#".trim($Status)."*Nachrichten#";
?>
...und...
Genau wie du es vermutet hast, das trim() hat gefehlt.
Ich teste gleich noch das kleinergleich...
Geht auch (kleinergleich), na toll, jetzt bin ich natürlich verunsichert ob es überhaupt ein Bug war. :-|
 
Zuletzt bearbeitet:
@koyaanisqatsi: Es ist ein Fehler in deinem Script. Der $Status ist unsauber belegt. Mach trim($Status) und es funktioniert sofort :)
Code:
 <?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#".trim($Status)."*Nachrichten#";
?>

Nachtrag: Hast ja schon gepostet. Ich war zu langsam. Kommt wohl daher, dass ich gestern, ähm heute morgen bis 5 noch am Script (erfolglos) gebastelt habe.

Das Problem sind hier Schmierzeichen, die oft von Shellscripts oder Programmen angefügt werden. Die müssen weg. Ansonsten läuft das AB-Script prima. :)
 
Zuletzt bearbeitet:
Das echo Kommando war "schuld".
PHP:
<?php // httpd-Fritzbox (Laeuft auf der Fritzbox und benoetigt root-Zugriff)
if ($_GET["info"]=="status") {
$Status=shell_exec('ctlmgr_ctl r tam settings/NumNewMessages');
}
echo "P#".trim($Status)."*Nachrichten#";
?>

LOL: Das ist Shellskriptsyntax, wusste nicht dass PHP die Parameter auch kennt.

Achtung:
echo -ne = Parse Error
trimm() = Fatal Error
Merke: Fatal/Parse Error liefern 0 oder Minuszahlen zurück.

trimm()
Code:
../cgi-bin/php-cgi -f pseudoanrufbeantworter.php info=status
<br />
<b>Fatal error</b>:  Call to undefined function trimm() in <b>/var/media/ftp/SanDisk-Cruzer-01/sensorandswitch/pseudobeispiele/pseudoautovoicemail.php</b> on line <b>5</b><br />

echo -ne
Code:
../cgi-bin/php-cgi -f pseudoanrufbeantworter.php info=status
<br />
<b>Parse error</b>:  syntax error, unexpected '&quot;P#&quot;' (T_CONSTANT_ENCAPSED_STRING) in <b>/var/media/ftp/SanDisk-Cruzer-01/sensorandswitch/pseudobeispiele/pseudoautovoicemail.php</b> on line <b>5</b><br />
:rolleyes:
 
Zuletzt bearbeitet:
Würdest du auf der "Hauptseite" bei Anzahl der Geräte das Wort Geräte in z.b. Aktoren umbenennen. Da es ja jetzt nicht nur Geräte mehr sind.
Nein, denn Sensoren sind keine Aktoren, sondern beides gehört zu der Kategorie Geräte.
 
@JL3: Ich fang schon an in anderen Threads "Werbung" zu machen. ;)

Wir brauchen noch unbedingt den/die letzten Anrufe, am Besten nur die Telefonnummer.

...bitte bitte bitte (/var/flash/fonctrl)
AVM hat den Aufruf von /var/flash/calllog komplett aus der Binary genommen.
Da hilft auch kein Patch mehr (closed Source), deswegen brauchen einige Leute den letzten/aktuellsten Anruf.
Und wenn sie erkannt haben, dass sowas unter SensorAndSwitch gar nicht so unbedingt nötig ist....
...haben wir sie. :mrgreen:

Noch was Interessantes (oder): Der Fritz!Box Callmonitor horcht auf Port 1012, wenn per Code (Telefon) aktiviert.
netstat -tlep | grep telefon
Code:
tcp        0      0 localhost:1011          0.0.0.0:*               LISTEN      1233/telefon
tcp        0      0 localhost:8888          0.0.0.0:*               LISTEN      1233/telefon
tcp        0      0 :::1012                 :::*                    LISTEN      1233/telefon
Eigentlich müsste der nur (durchgehend) abgehorcht werden. Das setzt als Lokalität "im LAN" (IPv4 & IPv6) voraus.

Beispiel als Konsolekommando auf der Fritz!Box mit localhost als IPv6...
Code:
root@deepbase # nc [COLOR=green]::1[/COLOR] 1012
03.12.14 19:51:38;CALL;1;10;MEINENUMMER;[email protected];SIP6;
03.12.14 19:51:38;CONNECT;1;10;[email protected];
03.12.14 19:54:24;DISCONNECT;1;163;
(ausgehendes Telefonat über SIP an SIP URI (Kurzwahl über AVM Telefonbuch))
...in HD. :mrgreen: (Und nach 2:41 Minuten ist der Kaffee fertig)
pint.gif

Ein Delayschalter mit Musik.
:rolleyes:
 
Zuletzt bearbeitet:
ich hab mal etwas gebastelt,
und zwar hab ich die pseudoschalter.php etwas misbraucht, abgeändert.

Ziel war es durch wählen einer Nummer aus dem Telefonbuch verschiedene Aktionen
auszulösen.

erstmal hab ich je ein Schalter für meine 4 Rufumleitungen gebaut.
könnte man ja direkt vom Telefon wählen, aber bei 8 Nummern für ein und aus,
hat man schnell mal die falsche erwischt.
Außerdem kann man jetzt die RUL auch mit sasauto auch automatisch schalten.

dann hab ich noch einen für Telnet gemacht,
@JL3 könnte das ja besser mit einem direkten SystemBefehl, aber es geht auch so.
Noch ein Vorteil, mit der richtigen Telefonverbindung kann ich auch Telnet und
Wlan auf einer anderen FB im Heimnetz schalten.

kurze Erklärung was ich in der pseudoschalter.php geändert habe.

eine Variable für die Statusdatei,
$Statusdatei="statusrul-425.txt"; # für jeden Schalter eine andere Datei!
"/statusschalter.txt" mit $Statusdatei ersetzt.

Schaltbefehl zum wählen und auflegen nach 5 Sekunden eingefügt, abgeändert.
Tel.-Nr. zum wählen geändert.

Problem hab ich nur, das es inzwischen zu viele Geräte gibt.
Hab mir etwas geholfen indem ich sas nochmal in ein zweites Verzeichnis kopiert habe.
In dem einen nur Schalter und Websensoren, in dem anderen alles von der Fritzbox!
Nur die FritzDect Dosen hab ich jetzt doppelt.
Code:
<?php 

	/*
		+---------------------------------------------------------------------+
		|                                                                     |
		|   SensorAndSwitch Automation Pro                                    |
		|   PseudoGeräte-Script                                               |
		|   ===============================================================   |
		|   -> Schalter                                                       |
		|      Dieses Script schaltet Rufumleitung 779426 ein/aus             |
		|      Befehl zum ein,- ausschalten im Telefonbuch Nr. 793/794        |
		|                                                                     |
		+---------------------------------------------------------------------+
		*/
             
	[B][COLOR="#FF0000"]$Statusdatei="statusrul-425.txt";[/COLOR][/B]    #hier Namen für Status-Datei eingeben 
	$Pfad=".";
	
	$Status="S##E##";
	if (!file_exists($Statusdatei)) {
		$fp=fopen($Statusdatei,"w");
		$Status="0";
		fputs($fp,"S#".$Status."#");
		fclose($fp);
	}
	if ($_GET["info"]=="status") {
		$fp=fopen($Statusdatei,"r");
		$xml=fgets($fp);
		fclose($fp);
		if (strpos($xml,"1")) {
			$Status="S#1#";
		}
		if (strpos($xml,"0")) {
			$Status="S#0#";
		}
	}
	if ($_GET["schalter"]=="1") {
		$fp=fopen($Statusdatei,"w");
		[B][COLOR="#FF0000"]shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Dial **793')[/COLOR][/B];
		$Status="S#1#";
		fputs($fp,$Status);
		fclose($fp);
		[B][COLOR="#FF0000"]sleep(5);
		shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Hangup 1')[/COLOR][/B];
	}
	if ($_GET["schalter"]=="0") {
		$fp=fopen($Statusdatei,"w");
		[B][COLOR="#FF0000"]shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Dial **794')[/COLOR][/B];
		$Status="S#0#";
		fputs($fp,$Status);
		fclose($fp);
		[B][COLOR="#FF0000"]sleep(5);
		shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Hangup 1')[/COLOR][/B];
	}
	echo $Status;

?>
Anzeige-Fritz.JPG
 
@ws65: Sehr gut ;)

Yo, das lokale Kommando zum Wählen ist sehr mächtig.
Denn es gehen auch die Fritz!Box Telefoncodes.
Beispiel:

pseudocallmonitor.php
PHP:
<?php 

    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch Automation Pro                                    |
        |   PseudoGereate-Script                                              |
        |   ===============================================================   |
        |   -> Schalter                                                       |
        |      Dieses Script schaltet den Callmonitor     ein/aus             |
        |      Befehl zum ein,- ausschalten des Fritz!Box Callmonitors        |
        |                                                                     |
        +---------------------------------------------------------------------+
        */
             
    $Statusdatei="statusrul-9645.txt";    #Hier Namen fuer Status-Datei eingeben 
    $Pfad=".";
    
    $Status="S##E##";
    if (!file_exists($Statusdatei)) {
        $fp=fopen($Statusdatei,"w");
        $Status="0";                  #Wichtig: den richtigen Startwert setzen
        fputs($fp,"S#".$Status."#");
        fclose($fp);
    }
    if ($_GET["info"]=="status") {
        $fp=fopen($Statusdatei,"r");
        $xml=fgets($fp);
        fclose($fp);
        if (strpos($xml,"1")) {
            $Status="S#1#";
        }
        if (strpos($xml,"0")) {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
        $fp=fopen($Statusdatei,"w");
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Dial "#96*5*"');
        $Status="S#1#";
        fputs($fp,$Status);
        fclose($fp);
        sleep(5);
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Hangup 1');
    }
    if ($_GET["schalter"]=="0") {
        $fp=fopen($Statusdatei,"w");
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Dial "#96*4*"');
        $Status="S#0#";
        fputs($fp,$Status);
        fclose($fp);
        sleep(5);
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Hangup 1');
    }
    echo $Status;

?>
Den Startwert für die Statusdatei ermitteln...
Code:
netstat -tlep | grep telefon | grep -o :::1012 ; echo $?
 
Zuletzt bearbeitet:
ja, man kann praktisch die ganzen Telefoncodes wählen lassen.

wollte noch was verbessern in der Anzeige, hab mir jetzt aber ein Fehler eingebaut, da ich mal wieder keine Ahnung hab.

RUL.JPG

mein Text steht in der falschen Zeile.
hatte mir die Zeile vom Wetter geklaut und was ich nicht brauch gelöscht, geändert.
muss ich noch bisschen spielen.
 
Gastwlan? Umleiten? :D
 
eben nicht die Anzeige müßte eine Zeile tiefer, ist in der rul-425 drin!
 
Ja, dann musste aber die pseudorul-425.php editieren.
(Und die pseudogastwlan.php wieder richten)
Zeig mal die $Status die du gebastelt hast.
 
Zuletzt bearbeitet:
Hey, ihr werdet richtig erfinderisch :mrgreen: icon14.png

Bei der nächsten Labor kann man jetzt dann ganz komfortabel das "Gehirn" ein- und ausschalten. (Eine hübsche Funktion, die man, auch sonst gut, ähm.... :mrgreen:.) Man benötigt sie für die Nutzung des Delays. ;)

Thema Delay für alle Kettenglieder: Ich habe inzwischen schon Knoten in den Gehirnwindungen. Irgendwie bekomme ich es nicht gebacken. Zu viele Faktoren, die eine solche Kettenschaltung beeinflussen.

Stand der Dinge: Das Delay für das erste Kettenglied funktioniert. Es funktioniert sogar mit Zufallsfunktion z. B. 10 Min + 8 Min. Ermittelt eine Zahl zwischen 10 und 18 Minuten und benutzt diese als Delayzeit. Dieses Delay kann nur für Sensoren, NICHT für Zeitschaltpunkte eingesetzt werden. Folgekettenglieder ohne Delay können angehängt werden.

Fazit: Für Version 1.00 wird es kein Delay für Kettenfolgeglieder geben (es sei denn, mir kommt noch ein Geistesblitz). Für Version 2.00 schieb ich es mal in die Planung. Es MUSS irgendwie funktionieren. :gruebel:
 
die pseudogastwlan hab ich nicht angerührt!!

der Fehler ist in der rul-425.

mal eine andere Sortierung,
rul2.JPG

der Text aus der rul-425 steht immer eine Zeile zu hoch.
 
Mich würde die $Status mal interessieren was da drinne steht.
 
hab in der rul-792 nochmal das reingemacht, steht dann bei der 426 wo nichts drin ist.

rul3.JPG

meine Zeile, wie gesagt beim Wetter geklaut und etwas gekürzt.

echo "P#".'<div style="font-size:14px;text-align:left;width:310px;position:relative;top:-20px;">'.'</div><div style="text-align:right;width:310px;position:relative;top:-65px;">123792 umgeleitet auf 01761234567</div>'."*HTML#";
 
Leute, Telnet ist super, endlich nicht mehr nach dem Telefon suchen müssen :)


Code:
 <?php 

    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch Automation Pro                                    |
        |   PseudoGereate-Script                                              |
        |   ===============================================================   |
        |   -> Schalter                                                       |
        |      Dieses Script schaltet Telnet ein/aus                          |
        |      Befehl zum ein-/ausschalten des Fritz!Box Telnetzugangs        |
        |                                                                     |
        +---------------------------------------------------------------------+
        */
             
    $Statusdatei="statustelnet.txt";    #Hier Namen fuer Status-Datei eingeben 
    $Pfad=".";
    
    $Status="S##E##";
    if (!file_exists($Statusdatei)) {
        $fp=fopen($Statusdatei,"w");
        $Status="0";                  #Wichtig: den richtigen Startwert setzen
        fputs($fp,"S#".$Status."#");
        fclose($fp);
    }
    if ($_GET["info"]=="status") {
        $fp=fopen($Statusdatei,"r");
        $xml=fgets($fp);
        fclose($fp);
        if (strpos($xml,"1")) {
            $Status="S#1#";
        }
        if (strpos($xml,"0")) {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
        $fp=fopen($Statusdatei,"w");
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Dial "#96*7*"');
        $Status="S#1#";
        fputs($fp,$Status);
        fclose($fp);
        sleep(5);
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Hangup 1');
    }
    if ($_GET["schalter"]=="0") {
        $fp=fopen($Statusdatei,"w");
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Dial "#96*8*"');
        $Status="S#0#";
        fputs($fp,$Status);
        fclose($fp);
        sleep(5);
        shell_exec('/usr/bin/ctlmgr_ctl w telcfg command/Hangup 1');
    }
    echo $Status;

?>
 
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.