[Gelöst] Telldus Tellstick für Freetz kompilieren (FritzBox 7390)

HTML kann das nicht, Java Script läuft auf dem Client und kann somit auf dem Server auch nichts tun.

Ein einfaches CGI-Skript mit der Shell tut es auch.
 
Ein einfaches CGI-Skript mit der Shell tut es auch.

Habe gestern mit Hilfe von Busybox httpd einen (Mini-)Webserver gestartet. Im Sub-Directory "cgi-bin" habe ich ein Test-CGI-File abgelegt. Leider wird der Aufruf des Scripts immer mit einem "404 - Not found" quittiert. Die index.html im www-Directory läuft.

Muss ich vllt. die CGI-Umgebungsvariablen erst definieren, damit das cgi-bin läuft?

Oder gibt es generell eine noch einfachere Lösung, ein simples CGI-Script unter Freetz zum Laufen zu bekommen?
 
In den CGI-Variablen stellt der Server dem Skript Informationen zur Verfügung.

Ich weiß nicht, was genau Du gemacht hast, aber das Freetz Web-Interface ist auch komplett als CGI erstellt.
Du solltest zunächst versuchen, das Skript von Hand aufzurufen. Ansonsten kannst Du mit strace feststellen, was der Webserver aufrufen will
 
Diese Idee hatte ich auch bereits, aber wenn ich z.B. im Freetz-Webinterface cgi-bin (/usr/mww/cgi-bin/) meine Skripte ablegen will, geht das nicht, weil VI nicht speichern kann. Die Begründung dafür ist das Read-Only-Filesystem.
Selbstverständlich bringen auch "!" hinter ":w" und co nichts.

Nach "mount -o remount,rw /dev/root" sieht "cat /proc/mounts" jedoch immernoch wie folgt aus:
Code:
rootfs / rootfs rw 0 0
/dev/root / squashfs [B][COLOR="#FF0000"]ro[/COLOR][/B] 0 0
proc /proc proc rw 0 0
tmpfs /var tmpfs rw 0 0
dev /dev tmpfs rw,nosuid 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,mode=600 0 0
/dev/mtdblock5 /data jffs2 rw 0 0
usbfs /proc/bus/usb usbfs rw 0 0
root@fritz:/usr/mww/cgi-bin#

Nun die Frage: Ist das überhaupt der richtige Platz zum ablegen der Skripte, und wenn ja, wie mache ich das File-System kurzfristig beschreibbar?

Grüße
 
wie mache ich das File-System kurzfristig beschreibbar?
Gar nicht. Das SquashFS ist ein sehr eng komprimiertes Dateisystem, es ist aber nicht dafür vorgesehen, dass es verändert wird. Es wird nur beim Erstellen des Image gepackt und danach nicht mehr verändert.

Was man machen kann ist ein mount mit --bind. Das geht aber auch nur auf ein vorhandenes Ziel.

Du kannst aber einen Sym-Link erstellen, der auf eine Beschreibbare Stelle zeigt. Du kannst auch einfach die Skripte und die Konfiguration dort als Vorlage nehmen.
 
Oha ... da hat sich ja einiges in diesem Thread getan.

Ich habe zuhause einen älteren Patch, den ich hier noch nicht zur Verfügung gestellt habe, da sollte unteranderem auch das richtige USB Device erkannt werden, sonst ist das immer so eine Sache, dass man den Tellstick ansprechen kann, wenn andere USB Geräte angeschlossen sind. Da ich langsam eine aktuelle Freetz Version installieren will, muss ich den Patch wohl ein wenig anpassen. Ich gucke mal, ob ich diesen am Osterwochenende angepasst bekomme und dann werde ich den hier posten.

Meine urspüngliche Idee war, dass man über das Freetz Interface die Schalter einzeln betätigen kann, aber das hatte ich dann pausiert und war mir dann nicht mehr so wichtig, da einige Sachen ein Cronjob steuert und wenn es nötig ist, mache ich es per SSH Shell. Mal schauen, ob ich dazu endlich mal komme.

<edit on>
Ich habe übrigens mein Freetz auf USB Stick installiert, da es damit leichter war, auf dem Filesystem schreibend zuzugreifen. Kleine Fehler, die korrigiert werden müssen, hatten zur Folge, dass man eine neue Firmware flashen musste und das war doch ziemlich nervig, deswegen habe ich zu USB Root gegriffen.
<edit off>

Viele Grüsse
Fred
 
Zuletzt bearbeitet:
Schön, dass Fred hier wieder dabei ist!

Also aktuell habe ich es noch nicht hinbekommen, das Read-Only-Filesystem zu umgehen. Auch mit Symlinks nicht. Notfalls muss ich USB-Root nutzen, aber es muss doch auch ohne gehen.

Gibt es noch weitere Ideen?
Grüße
 
Es gibt mehrere Möglichkeiten das Dateisystem beschreibbar zu machen. Binaries würde ich z.B. mit "mount -o bind /var/binary /usr/bin/binary" überschreiben (hält nur bis zum Reboot). Für Konfigurationsdateien ist es sinnvoller, wenn man statt der Datei einen Symlink ins Dateisystem packt, der in den rw-Bereich zeigt.

Gruß
Oliver
 
Danke für die Antwort. Habe mittlerweile eine andere Lösung gefunden: Ich habe mit dem eingebauten httpd (Busybox) auf einem anderen Port einen Webserver gestartet (mit cgi-bin). Es funktioniert!!! Ich bin sowas von happy gerade :D

Bin jetzt dabei, mir mein eigenes Webinterface zu basteln. Langsam wird es hier zwar Off-Topic, aber ich wüsste nicht, wo ich sonst fragen soll.

Problem:
Ich möchte ein simples Webinterface mit An-/ und Aus-Button für jedes Gerät. Hinter den Buttons sollen die CGI-Befehle "tdtool --on 1, off 1, on 2 ... usw" liegen.
Demensprechende CGIs habe ich auch schon erstellt und sie funktionieren auch. Wenn ich jedoch in einem HTML-Dokument mit HREF auf die CGIs verweise, wird logischerweise bei einem Klick auf den An-/ Aus-Button auch direkt ein Redirect auf diese CGI-File durchgeführt.

Frage: Wie mache ich es, das CGI nur im Hintergrund auszuführen, ohne das der Browser auf die Datei springt?

Grüße und Danke
 
Ich würde die Befehle zum Ausführen in dein HTML-Dokument schreiben. Du überprüfst zu Anfang, ob Get-Parameter vorhanden sind und führst dann den entsprechenden Befehl aus...

Gruß
Oliver
 
Ok, Super! Nach mehreren Wochen läuft nun endlich alles. Danke an alle Helfer und vorallem nochmal Dr. Fred Edison für diesen Thread. Dank euch habe ich es ohne fundiertes Unix-Wissen, tiefere Perl-Kenntnisse o.ä. und nur mit Eifer hinbekommen!

Zusammenfassung:
Ich steuere jetzt simple "an" / "aus" Signale über ein Webinterface wahlweise mit dem Smartphone, dem Tablet oder dem Notebook. Dieses Webinterface in HTML steuert CGI-Skripte, welche den Telldus-Core in der Fritzbox nutzen.

Der einzige Wermutstropfen ist jedoch der Reboot der FritzBox, nachdem die Tellstick.conf-Datei wieder neu angelegt werden muss. Im Grunde müsste man doch über die rc.custom im Freetz Interface da was machen können. Seht ihr das anders?

__EDIT ON

Letzteres Problem ist auch geklärt:
In die rc.custom im habe ich folgendes eingetragen:

Code:
{
cat > /var/mod/etc/tellstick.conf << EOF

deviceNode = "/dev/ttyUSB0"

device {
 id = 1
 name = "Licht Wohnzimmer"
 protocol = "arctech"
 model = "codeswitch"
 parameters {
   house = "A"
   unit = "1"
 }
}
device {
 id = 2
 name = "Dreambox"
 protocol = "arctech"
 model = "codeswitch"
 parameters {
   house = "A"
   unit = "2"
 }
}
device {
 id = 3
 name = "ATV"
 protocol = "arctech"
 model = "codeswitch"
 parameters {
   house = "A"
   unit = "3"
 }
}

EOF
} 
{
modprobe ftdi_sio vendor=0x1781 product=0x0c30
}
{
modprobe ftdi_sio vendor=0x1781 product=0x0c30 update-modules
}
Dadurch wird auch nach einem Reboot, die Tellstick-conf automatisch wieder angelegt, und der Tellstick registriert.

Bisher muss ich jedoch immernoch 2 bis 3mal den "TDTOOL"-Befehl senden, bis der Tellstick schaltet. Bisher hieß es, das liege an USB-Problemen seitens der original Fritzbox-Firmware. Gibt es dazu noch genauere Informationen?


___EDIT OFF
 
Zuletzt bearbeitet:
Ok, Super! Nach mehreren Wochen läuft nun endlich alles. Danke an alle Helfer und vorallem nochmal Dr. Fred Edison für diesen Thread. Dank euch habe ich es ohne fundiertes Unix-Wissen, tiefere Perl-Kenntnisse o.ä. und nur mit Eifer hinbekommen!

Zusammenfassung:
Ich steuere jetzt simple "an" / "aus" Signale über ein Webinterface wahlweise mit dem Smartphone, dem Tablet oder dem Notebook. Dieses Webinterface in HTML steuert CGI-Skripte, welche den Telldus-Core in der Fritzbox nutzen.

Der einzige Wermutstropfen ist jedoch der Reboot der FritzBox, nachdem die Tellstick.conf-Datei wieder neu angelegt werden muss. Im Grunde müsste man doch über die rc.custom im Freetz Interface da was machen können. Seht ihr das anders?

Dadurch wird auch nach einem Reboot, die Tellstick-conf automatisch wieder angelegt, und der Tellstick registriert.

... GELÖSCHT ...

Bisher muss ich jedoch immernoch 2 bis 3mal den "TDTOOL"-Befehl senden, bis der Tellstick schaltet. Bisher hieß es, das liege an USB-Problemen seitens der original Fritzbox-Firmware. Gibt es dazu noch genauere Informationen?

Moin moin,

ich bin gerade dabei einen aktuellen Patch zu erstellen und dann solltest Du per Freetz GUI deine Konfiguration erstellen und speichern können. Ich hatte das schon länger bei mir eingebaut.

Auch sollte dann der richtige USB Port erkannt werden, an dem der TellStick hängt, für den Fall Du hast auch nach andere USB Geräte an der Fritz-Box hängen. Ist aber eher ein dreckiger Hack und nicht getestet, wenn zum Beispiel eine zweiter TellStick am Gerät hängt.

Was aber Dein konkretes Problem angeht, da kann ich Dir derzetig icht helfen. Wenn ich es richtig verstehe, dann kommt nur jeder x-te tdtool Aufruf and den TellStick durch? Das Problem habe ich bisher nicht.

Wie kann man sich das vorstellen? Du sendest zum Beispiel ein OFF and das Gerät mit der ID 1 und das Gerät wird z.B. erst beim zweiten Aufruf ausgeschaltet? Wenn ich es richtig in Erinnerung habe, dann wertet tdtool den aktuell gespeicherten Zustand aus. Nehmen wir mal an Du schaltest mit tdtool das Gerät 1 aus und mit Deiner Funkfernbedienung schaltet Du das Gerät ein, dann kannst Du tdtool nicht dazu verwenden das Gerät auszuschalten, weil tdtool davon ausgeht, dass das Gerät ausgeschaltet ist. Ich werde das mal testen, wenn ich meine Funkfernbedienung finde und ich noch ne passende Batterie habe. Das ist aber nur eine vage Erinnerung. ;)

Asonsten hoffe ich, dass der aktuelle Patch inkl. das aktuelle Freetz mir heute keine Probleme macht, dann poste ich den aktuellsten Stand heute noch.

Grüsse
 
Du kennst Dich mit Freetz und mit der Buildumgebung aus? Dann guck Dir bitte die zwei Fragen unten in diesem Posting an. Vielleicht hast Du einen guten Tipp. Danke.

Getestet für die FritzBox 7390, Freetz Revision 8893, Telldus Tellstick

Es sollte auf jeder FritzBox laufen, die über einen USB Anschluss verfügt und auf der mindestens der Kernel v2.6.14 läuft.

Anleitung:
1. Aktuelle Freetz-Sourcen auschecken (getestet mit Revision 8893).
2. In den Freetz-Ordner (trunk) wechseln
3. Anhang (Anhang anzeigen telldus-patch_rev_8893.diff.gz) in das Projekt patchen ( zcat telldus-patch_rev_8893.diff.gz | patch -p0)
4. "chmod 755 make/telldus-core/files/root/etc/init.d/rc.telldus-core" ausführen (ich weiss nicht, an welcher Stelle im makefile es aufgerufen werden muss, dafür ist mir zurzeit die Buildumgebung zu dynamisch und komplex)
5. "make menuconfig" ausführen
6 a. Package Selection --> Testing --> [x] telldus-core
<---ab hier sollte alles automatisch eingestellt werden --->
6 b. Advanced Option --> Kernel Modules --> Drivers --> [X]usbserial.ko
6 c. Advanced Option --> Kernel Modules --> Drivers --> [X]ftdi_sio.ko
<--- --->

Nachdem das Image auf die FritzBox gespielt und diese neugestartet wurde, sollte beim Booten das Skript "/etc/init.d/rc.telldus-core" automatisch ausgeführt werden.
Das Skript führt folgende Operationen automatisch durch.

7. Erstellt automatisch eine default-Konfigurationsdatei "/mod/etc/tellstick.conf" , wenn die Datei noch nicht vorhanden ist. Diese Datei kann dann über die Freetz GUI konfiguriert werden.
8. Registriert die Konfigurationsseite "telldus-core" und ordnet diese der Datei "/mod/etc/tellstick.conf" zu. Nun kann man die Konfigurationsdatei über die Freetz GUI rebootsicher ändern.
9. Das Modul "ftdi_sio" wird geladen.
10. Es wird versucht, das USB Device, an dem der Telldus Tellstick hängt, anhand der Ausgabe von "dmesg" herauszufinden. Daraufhin wird ein neues Device (ein Softlink!) "/dev/tellstick" angelegt. So kann man in der Konfiguration "deviceNode = "/dev/tellstick"" angeben und somit sollte man sich keine Gedanken darüber machen müssen, wenn weitere Geräte an die FritzBox angeschlossen wurden. Es handelt sich aber um einen ziemlich dreckigen Hack, eigentlich müsste man das mit dem Paket "udev" realisieren. Auch weiss ich zurzeit nicht, wie es sich verhält, wenn man weitere Geräte anschliesst, die dieselbe Ausgabe in "dmesg generieren (z.B. ein zweiter TellStick oder ein weiteres USB Device mit einem identischen Chipsatz).


11. Nun muss man nur noch über die Freetz GUI die Funksteckdosen, Funkschalter, Funkdimmer etc. konfigurieren! (siehe Konfiguration)
freetz_gui_tellstick.JPG
Code:
deviceNode = "/dev/tellstick"

device {
  id = 1
  name = "Funksteckdose 1"
  protocol = "arctech"
  model = "codeswitch"
  parameters {
    house = "A"
    unit = "1"
  }
}
device {
  id = 2
  name = "Funksteckdose 2"
  protocol = "arctech"
  model = "codeswitch"
  parameters {
    house = "A"
    unit = "2"
  }
}

12. Testen: "tdtool --on 2" ausführen
13. Überprüfen ob sich das Garagentor des Nachbarn öffnet :mrgreen: oder die ausgewählte Steckdose aktiviert wurde. ;)

Code:
root@fritz:/var/mod/root# tdtool --on 2
Turning on device 2, Funksteckdose 2 - Success <-- Kommunikation mit dem Tellstick funktioniert

Ich hoffe, ich habe nichts vergessen.
Ach ja, alles ohne Gewähr und mit Haftungsausschluss!


Eine weitere Möglichkeit neben einem SHELL Kommando den Telldus Tellstick anzusprechen wäre zum Beispiel das Paket "knockd".
Beispielkonfiguration für knockd:
Code:
[options]
	logfile = /var/log/knockd.log

[wohnzimmer_on]
	sequence      = 7081:udp,7083:udp,7085:udp
	seq_timeout   = 5
	command       = /usr/bin/tdtool --on 1
	tcpflags      = syn

[wohnzimmer_off]
	sequence      = 7085:udp,7083:udp,7081:udp
	seq_timeout   = 5
	command       = /usr/bin/tdtool --off 1
	tcpflags      = syn
Führt man nun einen "Knocking Client" aus, dann kann man zum Beispiel Steckdosen übers Klopfen an Ports steuern.
Code:
X:\PortableApps\Knock>knock XXX.XXX.XXX.XXX 7081:udp 7083:udp 7085:udp <--- schaltet die Steckdose ein
X:\PortableApps\Knock>knock XXX.XXX.XXX.XXX 7085:udp 7083:udp 7081:udp <--- schaltet die Steckdose aus



Nun habe ich noch zwei Fragen an die Entwickler unter Euch, die sich mit Freetz, dem GUI Framework und mit der Buildumgebung besser auskennen. Vielleicht habt Ihr ein paar Tipps.

1. Da ich zurzeit den trunk von Freetz patche, besitzt das Startskript nicht das executable-Flag. An welcher Stelle meines Makefiles "telldus-core.mk" kann ich sinnvoll ein "chmod 755 make/telldus-core/files/root/etc/init.d/rc.telldus-core" einfügen, damit es im richtigen Moment gesetzt ist und das Skript ausführbar ins Image gepackt wird ?
2. Ich möchte eine Seite über die Freetz GUI zur Verfügung stellen, die eine Datei vom tdtool auswertet und dann An/Aus Schalter generiert, über die man dann die Funksteckdosen steuern kann (sprich ein Kommando auf der Shell ausführen kann). Leider habe ich gerade mal geschnallt, wie man config Seiten mit einem "Übernehmen" Button erstellt. Ich habe mir auch schon zwei/drei Pakete angesehen, wo Seiten paketspezifisch sind, aber entweder finde ich diese Seiten nicht oder die sind so komplex, dass ich da nicht ganz durchsteige und das Gefühl habe, an der falschen Stelle zu suchenn. Habt Ohr irgendwelche Tipps, Ideen oder Beispiele? Ich würde gerne das Freetz Framework verwenden.

Viele Grüsse
Fred
 
Zuletzt bearbeitet:
Hi, zu 1:
Die Datei wird mit den passenden Rechten in SVN eingecheckt und auch wieder ausgecheckt. Einzig beim Erzeugen der Datei durch den Patch gehen die Rechte verloren, deswegen muss man sie nach dem Einspielen des Patches von Hand setzen.
 
Hallo stan23.

Vielen Dank. Mir ist schon klar, dass es dadurch kommt, dass ich den trunk nur patche und nicht aus dem Subversion auschecke. Da ich zurzeit nicht sehe, dass ich es unter die Kontrolle von Subversion stelle, möchte ich es über das Makefile machen. Ich vergesse den Schritt, das executeable Flag zu setzen, nämlich immer. ;)

Viele Grüsse
 
Hallo, eine kurze Frage...
Stellt der Tellstick wenn er an die FritzBox eine Verbindung zu Telldus Live her, oder läuft dann auf der Fritzbox der Server?

Danke!

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