SensorAndSwitch Haus-Automation auf Webserver-Basis

Ja, das muss ich für Jessie komplett überarbeiten.

Meine Probleme habe ich mit dem Desktop. Mauszeiger ist statt einem Pfeil ein Kreuz, Buttonicons werden nicht mittig angezeigt und an allen Seiten abgeschnitten, Texte werden rechts abgeschnitten. Es gibt tausend Stellen, wo die Ursache stehen kann, aber nichts funktioniert. Es gibt einfach keine zentrale Stelle für Einstellungen. lxpanel, openbox, usw. usw. und alle haben wiederum etliche conf-Dateien, die teils wirkungslos sind. Debian Jessie ist eine überaus "zickige Göre". ;)

Aber Aufgeben gibts nicht. Das muss laufen. :)
 
sag ich auch!
hab es gerade geschafft, Jessie mit Sas4 und Zoneminder 1.28 zum laufen zu bringen.
aber mindestens 10 mal von vorne angefangen!
 
@JL3: Ich bau auf OSMC/KODI auf, welches auch auf Jessie aufbaut...
Code:
[B]cat /etc/apt/sources.list[/B]
deb http://mirrordirector.raspbian.org/raspbian jessie main contrib non-free
deb http://apt.osmc.tv jessie main
deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib
...mit einer Prise Sarge. :mrgreen:

Das Display wäre dann das von Kodi.
...und das sollte immer passen. ;)

EDIT & PS: Wie IPv6 dann darauf (OSMC/KODI) dauerhaft aktiviert wird, steht hier...
Enable_IPv6_on_OSMC (Hab ich lange nach gesucht)
 
Zuletzt bearbeitet:
Jessie xrdp x-cursor-Problem endlich behoben:
Wer das Kreuz als Dauercursor ebenfalls weg haben will:
https://www.raspberrypi.org/forums/viewtopic.php?t=122386

Jessie läuft jetzt nach 9 Anläufen endlich mit SASV5++ (incl. Sprachausgabe, Spracherkennung, Telefonie und allem was dazu gehört). ;)
Es hat sich in Jessie doch sehr viel geändert. Dazu kommt noch, dass Raspbian noch einige "Extrawürste" mit seinen Konfigurationsdateien macht. Trotzdem, jetzt läuft es.
 
Beschreibung für SAS4PI für Jessie erweitert.

Einige Teile enthalten nun vorangestellt (Wheezy) und (Jessie) als Unterscheidung.

Nachtrag: Änderungen werden noch vorgenommen, da ich in einem SAS-Verzeichnis system/ noch alte und neue Shell-Scripte mit einbauen werde.
 
Zuletzt bearbeitet:
Inzwischen habe ich meinen Pi 3B. Der SD-Kartenslot hat leider nur noch eine reine Steckfunktion ohne Auswurffeder wie beim Pi 2B. Mit Gehäuse ist das jetzt eine schöne Pfriemelei. Schade um die Auswurffunktion. Der Pi 3B lief sofort mit dem von mir auf dem Pi 2B erstellten Jessie-Image. Die WLAN-Funktion wurde sofort erkannt, WLAN-USB-Dongle ist jetzt unnötig. Der Pi 3B ist auch schneller als der Pi 2B. Man spürt den leichten Geschwindigkeitszuwachs auch auf dem Desktop.

SASV5++ läuft testweise problemlos. :)

Ob man vom Pi 2B auf den Pi 3B wechseln soll? Nun eher bei sehr rechenintensiven, zeitkritischen Vorhaben. Mein Pi 2B für die Spracherkennung wird sicherlich gegen einen Pi 3B getauscht. Der "Haupt-SAS-Rechner" wohl eher nicht.

Wer einen Pi 1 B+ hat, kann allerdngs getrost auf einen Pi 3B wechseln. Da ist der Geschwindigkeitsgewinn enorm groß. ;)

Nachtrag: Wer Probleme mit ssh hat, der sollte

Code:
sudo nano /etc/ssh/ssh_config

und ans Ende der Datei:

Code:
ServerAliveInterval 30

entragen. Ansonsten bricht die ssh-Verbindung bei kurzen Pausen einfach ab, was etwas nervig sein kann.


Nachtrag 2:

ssh und samba Abbruchprobleme können nun durch apt-get update und apt-get upgrade behoben werden, denn diese wurden in Jessie nun korrigiert. :)
 
Zuletzt bearbeitet:
Inzwischen habe ich bei mir SAS V5++ (alle Komponenten, 4 SAS-Himbeeren) "produktiv" auf Jessie umgestellt. Das Ganze läuft jetzt seit einigen Stunden stabil. Läuft es noch eine Weile ohne Probleme, so wird es bald eine neue Beta-Version hier geben. Sie löst nicht die alte Version 4 ab, sondern bietet "nur" Erweiterungen für das Jessie-Umfeld und die Themen Display, Sprachausgabe und Spracherkennung mit Schnittstellen und Scripten.

Inzwischen laufen bei mir im System etwas über 100 psg-, disp-, sttc- und fonc-Scripte (noch auf einem Pi 2B):
psg -> Pseudogerät
disp -> Displayanzeige (TFT)
sttc -> Spracherkennung
fonc -> Telefoneinbindung (Erkennung Telefonmonitor)

Zur Zeit denke ich über ein Shellscript nach, welches auf ein Standard-Jessie-Image durch Aufruf und Angabe von Parametern automatisch alle notwendigen Komponenten nachinstalliert und konfiguriert, sodass danach ein lauffähiges SAS mit allen gewählten Funktionen (ggf. Sprachausgabe, asterisk, Spracherkennung, Displaytypwahl, etc.) vorhanden ist.

Die Frage ist nur, ob genügend Interesse daran besteht, sodass sich der nicht gerade geringe Aufwand lohnt. :gruebel:
Das wäre dann die zukünfige Version 5.5. ;)
 
Neue Beta 4941.

...Link gelöscht, jetzt im SAS4PI Web im Downloadbereich...

Da wohl doch kein Interesse an einem Komplettinstallationsscript zu existieren scheint, werde ich dies fallen lassen. Dafür hier nun eine weitere Beta-Version von SAS mit einem Verzeichnis system/ in dem einige nützliche Roh-Scripte liegen. Diese müssen meist noch angepasst werden und dienen als Beispiele.

Grundsätzlich wird wohl bei Version 6.00 später eine Trennung bei der sequenziellen Abarbeitung der sasag.php auf ein Modul, welches die psgs gleichzeitig abarbeitet und nicht mehr hintereinander. Dies erhöht den Durchsatz und ein hängendes psg blockiert nicht mehr andere psgs. Bei V6.00 ist dann allerdings eine kleine Anpassung in den psgs nötig. Dadurch ist jedoch jedes psg dann nicht mehr zeitkritisch. Da wohl kein Bedarf an SAS V5.00++ (mit Display, Sprachsteuerung) besteht, sind mit SAS V6.00 dann Neuerungen zu erwarten, die für mehr Benutzer brauchbar sind. ;)
 
Zuletzt bearbeitet:
Ich bin leider wegen beruflicher Vollauslastung komplett abgehängt. Pi 3 liegt schon hier rum, werde hoffentlich in ein paar Monaten wieder einsteigen. V5.00.xxx ist hier täglich im Einsatz und von der Familie positiv bewertet. Danke & weiter so ...
 
Interesse an Sas ist immer noch vorhanden, bei mir läuft das meiste aber immer noch auf dem Pi-1b.

ich weis nicht ob der für Sas5 oder Sas6 ausreicht?
auch ist mir das mit der Sprachsteuerung etwas zu kompliziert und wird auch nicht gebraucht!
andere Erweiterungen und Verbesserungen aber gerne!

mein Pi-2 steht zur Reserve bereit.
Versuche mit Zoneminder hab ich aufgegeben, ist der einfach zu schwach dafür, ständig auf über 90% CPU-Last will ich ihm auf dauer nicht zumuten.
 
@ws65: Zu Zoneminder lies dir evtl. mal das hier durch: http://www.forum-raspberrypi.de/Thread-tutorial-rasperry-pi-als-hd-mjpeg-netzwerkkamera-zoneminder
V5.00 und V6.00 stellt keine höheren Anforderungen als V4.00. Nur V5.00++ wegen Display und Spracherkennung benötigt am besten Pi 3B-Power, um gut zu laufen.

@all: Inzwischen bastle ich an der V6.00 und überspringe die V5.00++ (ist somit nur für meinen Eigengebrauch gewesen). Die V5.00 bleibt somit nur Beta. Alle Schnittstellen bleiben auch in der V6.00 erhalten, aber es gibt in der späteren Zip keine Zusatzbausteine/Scripte mehr. Bei Bedarf ggf. nachfragen, da ich das ja für meine Hausautomation ohnehin weiterentwickle.

V6.00 wird auch auf langsameren Pi weniger zeitkritisch laufen, da ich das sequentielle Abarbeiten der psg-Abfragen abschaffen will und somit lang laufende psgs andere psgs nicht mehr behindern werden. Entsprechende Ideen für die Umsetzung habe ich bereits. Wenn es so funktioniert, wie ich es mir vorstelle, muss auch nichts an älteren psgs geändert werden. ;) Ein so genanntes psgexec.php wird zwischen sas und normalem psg-Script als Manager fungieren und Ergebnisse jedes einzelnen psg-Scripts sofort in die Datenbank schreiben. psgexec.php wird gleichzeitig für jedes psg-Script gestartet. Da nicht auf einen Rückgabewert gewartet wird, läuft sasag.php um Einiges schneller. Durch dieses Verfahren wird es auch möglich sein, seine psgs zu splitten und die eine Hälfte auf einem und die andere Hälfte auf einem anderen Pi laufen zu lassen. Ist noch Theorie, aber ich bastle an der Umsetzung. ;)
 
Update: Zur Zeit komme ich nicht wirklich dazu, SAS weiterzuentwickeln. SAS V6 ist fast Beta-Status. Es läuft unter Jessie und kann ohne Probleme auf einem Pi 1B+, 2B oder 3B laufen. Durch die neuen Start-Scripte muss die crontab neu angepasst werden. Außerdem gibt es noch einige nützliche bash-Scripte dazu. Ich versuche noch ein entsprechendes Installationsscript zu schreiben, was dies dann automatisch erledigt.

Gerade für langsamere Pi ist SAS V6 besser geeignet, weil man psgs nun in zwei Kategorien einteilen kann. In der ersten Kategorie wird das psg garantiert jede Minute ausgeführt (zeitkritisch, max. 10 psgs je nach Leistung des Pi mehr oder weniger). In der zweiten Kategorie werden die restlichen psgs immer wieder nacheinander aufgerufen, was auch länger als eine Minute dauern darf (nicht zeitkritisch).

Bei mir läuft die SAS V6 inzwischen sehr zuverlässig über einige Wochen. Sobald ich das Installationsscript fertig habe, gibt es eine Beta. Wird aber noch eine Weile dauern, da ich momentan nicht dazu komme. Sorry, dauert also noch etwas. ;)
 
Ein paar Frage die mir direkt in den Kopf kommen:

Wie springt man dann von 4 auf 6 ohne ganz neu aufzusetzen?
Wie putzt man die Installation?
Können die selbst gestricken psg behalten werden?

tbc
 
psgs von 4, 5 und 6 sind gleich. Alte laufen nach wie vor.

Veränderung gibt es in der crontab-Eintragung, da einfach nun mehrere Scripte zur Abarbeitung nötig sind.

Ein Verzeichnis in der /usr/local/bin/sas/ für sas muss angelegt werden, wo die bash-Scripte dann rein müssen. Müssten auch unter wheezy noch laufen.

Ansonsten im /var/www/sas einfach alles vom neuen sas reinkopieren. So wie bei den früheren Betas. ;)

Also halb so wild. Ich hoffe, das klärt etwas die Fragen. :)


Nachtrag: Kategorie 1 und 2 psgs unterscheiden sich im vergebenen Namen.

1 ist zeitkritisch: psg-meins-.php
2 ist nicht zeitkritisch: psgmeins.php

Die Minuszeichen um den eigentlichen Namen sind hier der Schlüssel in welcher Kategorie sie laufen sollen.
 
Zuletzt bearbeitet:
Download SAS V6.00alpha ... Link entfernt ...
Da ich zur Zeit einfach nicht dazu komme, an SAS weiterzubasteln, stelle ich als Trostpflaster für Experimentierfreudige einfach einmal die aktuelle Alpha-Version ein.

Zu beachten sind die neuen cron-Einträge in der crontab, die die alten sas-Einträge ersetzen. (Aufruf: crontab -e)
Code:
* * * * * /usr/local/bin/sas/sasstart
20 * * * * /usr/local/bin/sas/sassicherndb

Alles was in der Zip-Datei unter system/ steht, muss im Pi im Wurzelverzeichnis ins entsprechende Unterverzeichnis (ggf. anlegen).

Bei Fragen bitte posten. :)
 
Zuletzt bearbeitet:
super vielen Dank, da bei mir aber alles zuverlässig läuft und ich auch keine Zeit habe, bleibe ich erstmal bei 5.00.4916
 
...Link entfernt...

  • ein paar Bugfixes...
  • Umstellung einiger SAS-Systemdateien und neuen conf-Dateien
 
Zuletzt bearbeitet:
Update Download: SAS V6.00.5437 alpha ...Link entfernt...

  • ein paar Bugfixes...
  • Umstellung einiger SAS-Systemdateien und neuen conf-Dateien
  • neue sas-Befehle (Betriebssystem-Hilfs-Scripte wie start, welches planmäßige und unplanmäßige Bootvorgänge des Pi dokumentiert)

/etc/crontab
Code:
* * * * * /usr/local/bin/sas/sasstart
20 * * * * /usr/local/bin/sas/sassicherndb
@reboot { sleep 30 ; echo '  \\e[32m\\e[1mStart\\e[0m  '$( date +"\%H:\%M:\%S \%a \%d.\%m.\%Y"; ) >> /usr/local/etc/sas/start ; } &
* * * * * /usr/local/bin/sas/nettest
 
Zuletzt bearbeitet:
Ich habe mal inzwischen schnell ein wenig C++ gelernt und das langsame Python-Script tempusb.py mit dem Shell-Script tempusb(.sh) nun gegen eine compilierte Version tempusb ausgetauscht. Hier der Quellcode dazu:

tempusb.cpp
Code:
/*
    ╔═══════════════════╦══════════════════════════╤══════════════════════╗
    ║  SensorAndSwitch  ║  (C) 2014-16 BlueDragon  │  tempusb      (sys)  ║
    ╠═══════════════════╩══════════════════════════╪══════════════════════╣
    ║  Temperatur USB                              │  Modul C++           ║
    ╟──────────────────────────────────────────────┴──────────────────────╢
    ║  Temperatursensor USB Lesemodul                                     ║
    ║                                                                     ║
    ║  Compilierung:                                                      ║
    ║  ═════════════                                                      ║
    ║     g++ tempusb.cpp -otempusb -lusb-1.0                             ║
    ║     ./tempusb                                                       ║
    ╚═════════════════════════════════════════════════════════════════════╝
*/

#include <stdio.h>
#include <stdlib.h>
#include <libusb-1.0/libusb.h>
#include <stdint.h>
#include <string.h>
#include <iostream>
#include <locale.h>
using namespace std;

int main(int argc,char *argv[]) {
/*****************************/
    char ver[]="1.00.0157";
    char cpr[]="(C)2016 BlueDragon";
    libusb_device_handle* handle=0;
    int res=0;
    int kernelDriverDetached=0;
    int numBytes=0;
    int vid=0x16c0;
    int pid=0x0480;
    int out=0x81;
    int leng=64;
    float ftemp=0;
    unsigned char buffer[leng];
    char temp[10];
    char* p;
    bool fehler=false;
    string help1="-h";
    string help2="--help";
    string info="info";
    setlocale(LC_ALL, "de_DE");
    
    if (argc>1 && (argv[1]==help1 || argv[1]==help2)) {
        fprintf(stdout,"┌──────────────────────────────────────────────┐\n");
        fprintf(stdout,"│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",ver,cpr);
        fprintf(stdout,"├──────────────────────────────────────────────┤\n");
        fprintf(stdout,"│ \e[1m\e[44mSyntax:\e[0m                                      │\n");
        fprintf(stdout,"│  tempusb                                     │\n");
        fprintf(stdout,"│        - liefert den Wert des USB-Temperatur-│\n");
        fprintf(stdout,"│          sensors als 1/10 Grad Celsius       │\n");
        fprintf(stdout,"│          (Z. B. 245 = 24,5°C)                │\n");
        fprintf(stdout,"│  tempusb info                                │\n");
        fprintf(stdout,"│        - zeigt den Wert aufbereitet als Grad │\n");
        fprintf(stdout,"│          Celsius mit einer Kommastelle an    │\n");
        fprintf(stdout,"│  tempusb -h|--help                           │\n");
        fprintf(stdout,"│        - diese Hilfe                         │\n");
        fprintf(stdout,"└──────────────────────────────────────────────┘\n");
        return 1;
    }

    res=libusb_init(0);
    if (res!=0) {
        fehler=true;
        fprintf(stderr,"Fehler: Init libusb.\n");
        return 1;
    }
    handle=libusb_open_device_with_vid_pid(0,vid,pid);
    if (!handle) {
        fehler=true;
        fprintf(stderr,"Fehler: Gerätezugriff; Gerät %04x:%04x nicht gefunden.\n",vid,pid);
        return 1;
    }
    if (libusb_kernel_driver_active(handle,0)) {
        res=libusb_detach_kernel_driver(handle,0);
        if (res==0) {
            kernelDriverDetached=1;
        }
        else {
            fehler=true;
            fprintf(stderr,"Fehler: Detaching Kerneltreiber.\n");
            return 1;
        }
    }
    res=libusb_claim_interface(handle,0);
    if (res!=0) {
        fehler=true;
        fprintf(stderr,"Fehler: Claiming Interface.\n");
        return 1;
    }
    res=libusb_interrupt_transfer(handle,out,buffer,leng,&numBytes,5000);
    if (res==0) {
        if (numBytes==leng) {
            sprintf(temp,"%d",buffer[4]+buffer[5]*256);
        }
        else {
            fprintf(stderr,"Warnung: Empfangen %d Byte(s), anstelle von %d Bytes.\n",numBytes,leng);
            if (numBytes>=6) {
                sprintf(temp,"%d",buffer[4]+buffer[5]*256);
            } 
        }
    }
    else
    {
        fehler=true;
        fprintf(stderr,"Fehler: Datenübertragung.\n");
    }
    res=libusb_release_interface(handle,0);
    if (res!=0) {
        fehler=true;
        fprintf(stderr,"Fehler: Releasing Interface.\n");
    }
    if (kernelDriverDetached) {
        libusb_attach_kernel_driver(handle,0);
    }
    libusb_exit(0);
    ftemp=strtof(temp,&p);
    if (argc>1 && argv[1]==info) {
        fprintf(stdout,"┌──────────────────────────────────────────────┐\n");
        fprintf(stdout,"│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",ver,cpr);
        fprintf(stdout,"├─────────────────────────────────────┬────────┤\n");
        fprintf(stdout,"│ USB-Temperatursensor                │\e[36m\e[1m% 3.1f°C\e[0m │\n",ftemp/10);
        fprintf(stdout,"│ Gerät %04x:%04x (out)0x%02x %02d Byte(s)│ ",vid,pid,out,numBytes);
        if (fehler) {
            fprintf(stdout,"\e[31m\e[1mFehler\e[0m │\n");
        }
        else {
            fprintf(stdout,"\e[32m\e[1mOk    \e[0m │\n");
        }
        fprintf(stdout,"└─────────────────────────────────────┴────────┘\n");
    }
    else {
        fprintf(stdout,"%s\n",temp);
    }
    return 0;
}
Wer einen USB-Temperatursensor am Pi hängen hat, der bekommt damit die Ausgabe der Temperátur (aufbereitet für sas oder zur normalen Anzeige) ausgegeben. Als C++ Programm ist es bedeutend schneller als das Python-/bash-Script-Gespann. ;)

Zur Zeit spiele ich mit der Überlegung Teile von SAS, die im Hintergrund laufen, ebenfalls in C++ umzusetzen. Mal sehen. Im Augenblick komme ich nicht dazu. :)
 
Nochmal erweitert:
tempusb.cpp:
Code:
/*
    ╔═══════════════════╦══════════════════════════╤══════════════════════╗
    ║  SensorAndSwitch  ║  (C) 2014-16 BlueDragon  │  tempusb      (sys)  ║
    ╠═══════════════════╩══════════════════════════╪══════════════════════╣
    ║  Temperatur USB                              │  Modul C++           ║
    ╟──────────────────────────────────────────────┴──────────────────────╢
    ║  USB-Temperatursensor Lesemodul                                     ║
    ║                                                                     ║
    ║ ┌───────────────┐                                                   ║
    ╟─┤ Compilierung: ├───────────────────────────────────────────────────╢
    ║ ╘═══════════════╛                                                   ║
    ║   g++ tempusb.cpp -otempusb -lusb-1.0                               ║
    ║   ./tempusb                                                         ║
    ╚═════════════════════════════════════════════════════════════════════╝
*/

#include <cstdlib>
#include <cstdio>
#include <locale>
#include <iostream>
#include <libusb-1.0/libusb.h>

using namespace std;

int main(int argc, char *argv[]) {
/******************************/
    char ver[]                        = "1.00.0264";
    char cpr[]                        = "(C)2016 BlueDragon";

    libusb_device_handle* handle;
    libusb_device* dev;
    
    struct libusb_device_descriptor desc;
    struct libusb_config_descriptor *config;

    int vid                            = 0x16c0;
    int pid                            = 0x0480;
    int interface                    = 0;
    int in                            = 0x81;
    int leng                        = 64;
    unsigned int timeout            = 5000;

    int res;
    int kernelDriverDetached;
    int numBytes;
    int bus;
    int devadr;
    unsigned char buffer[leng];
    char temp[10];
    char* p;
    int itemp;
    float ftemp;
    bool fehler                        = false;

    string help1                    =    "-h";
    string help2                    =    "--help";
    string info1                    =    "info";
    string info2                    =    "-i";
    string info3                    =    "--info";
    string info4                    =    "-info";
    
    setlocale(LC_ALL, "de_DE");

    if (argc > 1 && ( argv[1] == help1 || argv[1] == help2)) {
        fprintf(stdout, "┌──────────────────────────────────────────────┐\n");
        fprintf(stdout, "│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",
            ver,
            cpr);
        fprintf(stdout, "├──────────────────────────────────────────────┤\n");
        fprintf(stdout, "│ \e[1m\e[44mSyntax:\e[0m                                      │\n");
        fprintf(stdout, "│  tempusb                                     │\n");
        fprintf(stdout, "│        - liefert den Wert des USB-Temperatur-│\n");
        fprintf(stdout, "│          sensors als 1/10 Grad Celsius       │\n");
        fprintf(stdout, "│          (Z. B. 245 = 24,5°C)                │\n");
        fprintf(stdout, "│  tempusb info                                │\n");
        fprintf(stdout, "│        - zeigt den Wert aufbereitet als Grad │\n");
        fprintf(stdout, "│          Celsius mit einer Kommastelle und   │\n");
        fprintf(stdout, "│          Informationen zum USB-Temperatur-   │\n");
        fprintf(stdout, "│          sensor an                           │\n");
        fprintf(stdout, "│  tempusb -h|--help                           │\n");
        fprintf(stdout, "│        - diese Hilfe                         │\n");
        fprintf(stdout, "└──────────────────────────────────────────────┘\n");
        return 1;
    }

    res = libusb_init(0);
    if (res != 0) {
        fehler = true;
        fprintf(stderr, "Fehler: Init libusb (ggf. apt-get install libusb-1.0-0 libusb-1.0-0-dev)\n");
        return 1;
    }

    handle = libusb_open_device_with_vid_pid(NULL, vid, pid);
    if (!handle) {
        fehler = true;
        fprintf(stderr, "Fehler: Gerätezugriff; Gerät %04X:%04X USB-Temperatursensor nicht gefunden.\n",
            vid,
            pid);
        return 1;
    }

    dev = libusb_get_device(handle);
    res = libusb_get_device_descriptor(dev, &desc);
    if (res != 0) {
        fehler = true;
        fprintf(stderr, "Fehler: Lesen der Geräte-Beschreibung fehlgeschlagen.\n");
        return 1;
    }

    res = libusb_get_config_descriptor(dev, 0, &config);
    if (res != 0) {
        fehler = true;
        fprintf(stderr, "Fehler: Lesen der Konfigurations-Beschreibung fehlgeschlagen.\n");
        return 1;
    }

    if (libusb_kernel_driver_active(handle, interface)) {
        res = libusb_detach_kernel_driver(handle, interface);
        if (res == 0) {
            kernelDriverDetached=1;
        }
        else {
            fehler = true;
            fprintf(stderr, "Fehler: Kerneltreibertrennung.\n");
            return 1;
        }
    }

    res = libusb_claim_interface(handle, interface);
    if (res != 0) {
        fehler = true;
        fprintf(stderr, "Fehler: Interfacebelegung für Zugriff.\n");
        return 1;
    }

    res = libusb_interrupt_transfer(handle, in, buffer, leng, &numBytes, timeout);
    if (res == 0) {
        if (numBytes == leng) {
            itemp = buffer[4] + buffer[5] * 256;
            if (itemp > 32768) {
                itemp -= 65536;
            }
            sprintf(temp, "%d",
                itemp);
        }
        else {
            fehler = true;
            fprintf(stderr, "Warnung: Empfangen %d Byte(s), anstelle von %d Bytes.\n",
                numBytes,
                leng);
            if (numBytes >= 6) {
                itemp = buffer[4] + buffer[5] * 256;
                if (itemp > 32768) {
                    itemp -= 65536;
                }
                sprintf(temp, "%d",
                    itemp);
            }
        }
    }
    else
    {
        fehler = true;
        fprintf(stderr, "Fehler: Datenübertragung.\n");
    }

    res = libusb_release_interface(handle, interface);
    if (res != 0) {
        fehler = true;
        fprintf(stderr, "Fehler: Interfacefreigabe.\n");
    }

    bus = libusb_get_bus_number(dev);
    devadr = libusb_get_device_address(dev);

    if (kernelDriverDetached) {
        libusb_attach_kernel_driver(handle, interface);
    }

    libusb_exit(0);

    ftemp = itemp;
    ftemp = ftemp /10;
    if (argc > 1 && (argv[1] == info1 || argv[1] == info2 || argv[1] == info3 || argv[1] == info4)) {
        fprintf(stdout, "┌──────────────────────────────────────────────┐\n");
        fprintf(stdout, "│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",
            ver,
            cpr);
        fprintf(stdout, "├─────────────────────────────────────┬────────┤\n");
        fprintf(stdout, "│ USB-Temperatursensor                │\e[36m\e[1m%5.1f°C\e[0m │\n",
            ftemp);
        fprintf(stdout, "├─────────────────────────────────────┼────────┤\n");
        fprintf(stdout, "│ Gerät \e[33m%04X:%04X\e[0m   Bus:\e[33m%3u\e[0m   Dev:\e[33m%3u\e[0m │        │\n",
            desc.idVendor,
            desc.idProduct,
            bus,devadr);
        fprintf(stdout, "│ MaxPower:\e[33m%4umA\e[0m      Interfaces:\e[33m%3u\e[0m │        │\n",
            config->MaxPower * 2,
            config->bNumInterfaces);
        fprintf(stdout, "│ \e[33m0x%02X\e[0m(IN):\e[33m%3u\e[0m Byte(s) von\e[33m%3u\e[0m Byte(s) │ ",
            in,
            numBytes,
            leng);
        if (fehler) {
            fprintf(stdout, "\e[31m\e[1mFehler\e[0m │\n");
        }
        else {
            fprintf(stdout, "\e[32m\e[1mOk    \e[0m │\n");
        }
        fprintf(stdout, "└─────────────────────────────────────┴────────┘\n");
    }
    else {
        fprintf(stdout, "%s\n",
            temp);
    }

    return 0;
}
 
Zuletzt bearbeitet:
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.