[HowTo] SensorAndSwitch: Pseudoscript: PseudoGeräte selbst entwickeln.

Zum RAW-Kommunizieren mit einem USB-Device muss apt-get install libusb-1.0-0 (ggf. libusb-1.0-0-dev xserver-xorg-dev) installiert sein. Vielleicht liegt es daran.

- - - Aktualisiert - - -

Welche Fehler bringt das Script auf dem Pi2? Da fehlen garantiert entprechende Bibliotheken, die nicht installiert wurden.
 
libusb-1.0-0 war die neueste Version installiert,
libusb-1.0-0-dev xserver-xorg-dev hab ich noch installiert, geht aber auch nicht!

hier mal eine Liste der Fehler, die beim Test kommen:
PHP:
test_callable (__main__.TestDevice) ... ERROR
test_callable_blocked (__main__.TestDevice) ... ERROR
test_callable_unknown (__main__.TestDevice) ... ok

======================================================================
ERROR: test_callable (__main__.TestDevice)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_device.py", line 19, in test_callable
    self.assertEqual(self._switch.on(), 100)
  File "/var/www/pyfs20-master/fs20/device.py", line 98, in callable
    , time=util.time_string_to_byte(time_string)
  File "/var/www/pyfs20-master/fs20/pcs.py", line 234, in send_once
    + self._get_raw_command(command + time)
  File "/var/www/pyfs20-master/fs20/pcs.py", line 184, in _write
    return self._get_response()
  File "/var/www/pyfs20-master/fs20/pcs.py", line 169, in _get_response
    raise DeviceInvalidResponse('Invalid response from device.')
DeviceInvalidResponse: Invalid response from device.

======================================================================
ERROR: test_callable_blocked (__main__.TestDevice)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_device.py", line 27, in test_callable_blocked
    self.assertEqual(self._switch.on(), 100)
  File "/var/www/pyfs20-master/fs20/device.py", line 98, in callable
    , time=util.time_string_to_byte(time_string)
  File "/var/www/pyfs20-master/fs20/pcs.py", line 234, in send_once
    + self._get_raw_command(command + time)
  File "/var/www/pyfs20-master/fs20/pcs.py", line 182, in _write
    self._get_device().write(ENDPOINT_WRITE, dataframe)
  File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 940, in write
    intf, ep = self._ctx.setup_request(self, endpoint)
  File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 102, in wrapper
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 216, in setup_request
    self.managed_claim_interface(device, intf)
  File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 102, in wrapper
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 167, in managed_claim_interface
    self.backend.claim_interface(self.handle, i)
  File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 811, in claim_interface
    _check(self.lib.libusb_claim_interface(dev_handle.handle, intf))
  File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 595, in _check
    raise USBError(_strerror(ret), ret, _libusb_errno[ret])
USBError: [Errno 16] Resource busy

für mich zu viele !!
 
das claimen der Device klappt wohl nicht, da diese noch vom System in Beschlag genommen ist.

Ich kenne das Problem aus meinem C++-Programm, welches mit einem USB-Device im RAW-Modus kommuniziert:
Code:
        if (libusb_kernel_driver_active(handle, interface)) {
            res = libusb_detach_kernel_driver(handle, interface);
...
Wenn der Kerneldriver vom System belegt wird, muss er davon erst gelöst werden, bevor man ihn claimen kann. C++ ist hier natürlich um einiges elementarer als Python. In der Python-Lib ist das wohl nicht vorgesehen. Vermutlich ist Wheezy hier nicht so streng. Du musst dir wohl eine aktuellere Lib für Jessie suchen, oder das Ganze in C++ oder C programmieren.

Zumindest sehe ich da das Problem auf dem Pi2 mit Jessie. Sorry. :)
 
etwas weiter bin ich schon gekommen.

nach einem reboot, einfach mal auf Verdacht mein psg Script erstellt.
und was soll ich sagen, er schaltet!

Allerdings wenn ich in Putty python fs20-ein.py aufrufe schaltet er auch, aber es kommen immer noch Fehlermeldungen!
PHP:
python fs20-aus.py
Traceback (most recent call last):
  File "/var/www/fs20-aus.py", line 6, in <module>
    pcs.send_once(address, fs20.command.OFF)
  File "/usr/local/lib/python2.7/dist-packages/fs20/pcs.py", line 234, in send_once
    + self._get_raw_command(command + time)
  File "/usr/local/lib/python2.7/dist-packages/fs20/pcs.py", line 184, in _write
    return self._get_response()
  File "/usr/local/lib/python2.7/dist-packages/fs20/pcs.py", line 169, in _get_response
    raise DeviceInvalidResponse('Invalid response from device.')
fs20.pcs.DeviceInvalidResponse: Invalid response from device.

Aufgefallen ist mir dann noch das ich 2 python Versionen drauf habe!
Aufruf mit python startet python2.7
es gibt aber auch noch python3.4 auf dem Pi-2

Versuche das ganze auf python3.4 zu installieren brachten aber nichts.
die gleichen Fehlermeldungen, aber schalten tut er damit nicht!

erst mal abwarten ob er weiterhin schaltet, die Fehler stören mich da erst mal nicht!
 
ja! von Anfang an.
 
Demnach: ja :)

Die Fehler sagen nur, dass das Device was falsch zurückgeliefert hat, vermutlich weil es noch beschäftigt war. Kann man ignorieren. ;)

- - - Aktualisiert - - -

Das Script ist - wie es aussieht - für Python 2.x geschrieben.
 
Zuletzt bearbeitet:
w3m

Durch Zufall bin ich auf den textbasierten Komandozeilen-Webbrowser w3m (abt-get install w3m) gestoßen, der es gestattet, in einem Konsolenfenster (z. B. in PuTTY) Webseiten textbasiert anzuzeigen und darin zu navigieren. Man kann mit dem Schalter -dump diese auch auf stdout ausgeben lassen, sodass sie für ein PsG als Texteingabe dienen können. Es ist eine weitere Möglichkeit, Webseiten für Sensordaten zu nutzen. ;)
 
witzig, geht, aber toll ist anders ;)
 
Mit -dump liefert es halt reinen Text ohne html-Tags in eine Pipe (stdout), sodass man bei bestimmten Webseiten einfacher Informationen bzw. Werte (z. B. mit grep, cut, sed, awk, etc.) extrahieren kann. Ein stylischer Browser sieht natürlich anders aus. Es ist halt eine rein minimalistische Ausgabe eines Webseiteninhalts. ;)

Zum Browsen auf meinen Displays für SAS-Displayausgaben verwende ich den Firefox-ESR, der hier (über HDMI-TFT) schnell und sauber die Seiten darstellt (auch CSS3). :)
 
ich kan das basteln ja nicht lassen,

meine Sas mit den eingebundenen Funkschalter funktinier ja eigenlich ganz gut,
nur dumm das diese Schalter kein Status zurückmelden.

Deslhalb hab ich mir jetzt mal einen Homematic Schalter und von ELV den Homematic Sender für den Raspberry zugelegt.

von Github die OCCU Software runter geladen, 2 Tage gekämft bis der Sender auf dem Pi-2 funktioniert hat!

wieder das Problem mit derr seriellen Schnittstelle!
hab aber jetzt raus gefunden wie ich das abstellen kann.
erst
sudo systemctl disable [email protected]e
und dann noch
sudo systemctl stop [email protected]e

das hab ich dann in die rc.local mit eingebaut.

danach funktioniert mein Homematic Sender.

jetzt hab ich aber noch 2 Fragen.

hab ja beim installren der OCCU Software mein FS20 Snder entfernt, damit es kein durcheinander gibt.
könnte ich den jetzt wieder zusätzlich installieren?
wie verhält sich der Pi bei 2 seriellen Schnittstellen?

nächstes Problem,
ich wollte ja versuchen die Homematic Schalter auch mit SAS zu steuern, aber da fehlt mir noch Input.
muss ich mich erst noch schlau machen, es könnte aber ähnlich wie beim Edimax mit XML Scripten funktionieren.

wenn´s soweit ist suche ich hier wieder um Rat.:D
 
Wenn man einen Service mit systemctl disable servicename deaktiviert, dann ist das dauerhaft auch nach einem reboot. Daher ist der Eintrag in der rc.local nicht nötig.

Hier mal Infos dazu:
http://www.dynacont.net/documentation/linux/Useful_SystemD_commands/

Zu deiner ersten Frage mit 2 seriellen Schnittstellen kann ich nichts dazu sagen, aber die Schalter mit SAS zu steuern läuft garantiert. Alles was man händisch per Kommando geben kann geht letztendlich auch mit SAS. ;)
 
seltsam, bei mir ging der Sender nach einem reboot wieder nicht!
werde das aber nochmal in der rc.local entfernen und testen.

mit der 2. seriellen Schnittstelle hab ich probiert, aber nicht ohne vorher eine Sicherung an zu legen.
geht aber ohne Probleme!

aber die Schalter mit SAS zu steuern läuft garantiert. Alles was man händisch per Kommando geben kann geht letztendlich auch mit SAS

da ist aber das Problem, den Befehl für die Kommandozeile hab ich noch nicht gefunden.

vermute ein .cgi oder .tcl Programm switch.tcl gibt es da zB.

das sind aber bisher nur Vermutungen!

die Homematic Zentrale wird ja als OCCU auf dem Pi ausgeführt.
besteht aus 3 Modulen 1x rfd für den Sender 1x regahss für ??? und lighttpd

hab das alles nur installiert um die Funktionsweise zu verstehen und eventuell die passenden Codes zum senden zu finden.

bin schon etwas schlauer, da gibt es Dateien wo man was eventuell was finden könnte, muss nur wissen nach was ich suchen soll.

aber das hat noch Zeit, für meinen FS20 Sender hab ich auch über ein Jahr gebraucht!
 
also, erste Erfolge hab ich.
Problem ist zum Teil die passenden ID´heraus finden.
aber schalten kann ich schon mal mit
PHP:
$url='http://192.168.178.30:81/addons/xmlapi/statechange.cgi?ise_id=1247&new_value=false';
oder
PHP:
$url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State(0)';

schwieriger wird es den Status abrufen!

geht glaube ich nur mit
PHP:
http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State()
dann kommt
PHP:
<xml><exec>/ws65.exe</exec>
    <sessionId/>
    <httpUserAgent>User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
    </httpUserAgent>
    <go>false</go> # oder <go>true</go>
</xml>
bin aber noch nicht ganz sicher ob das der richtige Befehl ist?
denn beim einschalten ändert sich der Status gleich mit, beim ausschalten muss man mit "State()" nochmal nachfragen!

muss jetzt nur noch wissen wie das "false" oder "true" auswerten?
da gäbe es eventuell noch eine andere Möglichkeit, wo einfacher aus zu werten wäre
PHP:
http://192.168.178.30:81/addons/xmlapi/state.cgi?device_id=xxxx
aber da finde ich einfach die passende Id noch nicht.

ps. kleiner Schönheitsfehler, das ist ein Wechselschalter, falsch angeklemmt, ist bei Status true aus und bei false an!
 
xml kann man recht einfach auswerten. Dafür gibt es in PHP simplexml. Beim psg bekommt man ja beim Aufruf in die Variable $Status den Rückgabewert. Diesen kann man dann mit $container=simplexml_load_string($Status); umwandeln und wie im obigen Beispiel käme man dann mit $schalter=$container->go; an das "false" als Zeichenkette. ;)


http://php.net/manual/de/function.simplexml-load-string.php
 
ich hab´s mir noch einfacher gemacht,
einfach aus dem Edimax Script die Abfrage kopiert und leicht abgewandelt.

on / off gegen true und false getauscht.

funktioniert in Sas ohne Probleme, es dauert zwar einige Zeit, bis der Status sich ändert, wenn ich den Schalter von Hand umschalte, aber es geht!
was mich nur wundert, wenn ich das Script im Browser ohne Parameter aufrufe, bekomme ich den Status "FN#HM-Schalter#P# Licht Keller*HTML#S##E##"

PHP:
<?php 
    echo "FN#HM-Schalter#";
    /*
        
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch Automation Pro                                    |
        |   PseudoGeräte-Script                                               |
        |   ===============================================================   |
        |   -> Schalter  Homematic Schlter Id 1247              |
        +---------------------------------------------------------------------+
        Pfad für Statusdatei und Varaiblen in "conf/statuspfad.php" angegeben !
        */    
    include __DIR__."/../include/psg.php";
    include __dir__."/../conf/statuspfad.php";
    
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));

    $url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State()';
    
    $Status="S##E##";

    if ($_GET["info"]=="status") {
        $xml=web($url,$post);
        if (strpos($xml,"false")) {
            $Status="S#1#";
        }
        if (strpos($xml,"true")) {
            $Status="S#0#";
        }
    }
    if ($_GET["schalter"]=="1") {
#        $url='http://192.168.178.30:81/addons/xmlapi/statechange.cgi?ise_id=1247&new_value=false';
        $url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State(0)';
        $Status=web($url,$post);
        $Status="S#1#";
    }
    if ($_GET["schalter"]=="0") {
#        $url='http://192.168.178.30:81/addons/xmlapi/statechange.cgi?ise_id=1247&new_value=true';
        $url='http://192.168.178.30:81/ws65.exe?go=dom.GetObject("1247:1.STATE").State(1)';
        $Status=web($url,$post);
        $Status="S#0#";
    }
    echo "P#".' Licht Keller'."*HTML#"; 
    echo $Status;
    exit;
?>

ist da noch ein Fehler drin?
 
Ohne Parameter liefert er E##. Das schadet der Funktionalität nicht,
 
mal wieder eine Frage,

wenn ich auf einer Seite nur Info Scripts habe, bleibt die Anzeige "liest Datenbank" hängen, geht nicht weg!
mach ich nur ein normales Psg dazu, ist die Anzeige sofort weg.
fehlt da eventuell was in meinen Info Sripts? muss da ein Status rein?
 
In der aktuellen Fassung der V6.00 ist dies behoben. Da werden auch Info-Slots gezählt.

PS: Hat keine Auswirkung auf die Funktion von SaS bzw. der WebGUI.
 
Für TFT-Displays mit einer Auflösung von 800x480 ein disp-PsG, welches auch auf SaS beruht:
uhrwetter.jpg
Besonderheiten:

  • Wetteranzeige tagsüber mit blauem Himmelhintergrund, der sich in der Dämmerungsphase langsam zu einem nächtlichen Sternenhimmel ändert (realisiet mit css)
  • Mondphasenanzeige mit Realmondbildern (png)
  • Helligkeitsanzeigebalken (css)
  • Feuchtigkeitsanzeige und Helligkeitswert in Lux
  • Uhr mit Digitalanzeige (png) mit Datum, Wochentag und Sekunden (realisiert mit Javascript zur sekundengenauen Anzeige)
  • Sommer-/Winterzeitindikator
  • Außen- und zwei Innentemperaturanzeigen in Digitaloptik (png) mit Balkenanzeige (css)
 
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.