+ Antworten
Seite 1 von 5 1 2 3 ... LetzteLetzte
Ergebnis 1 bis 10 von 42
  1. #1
    Registriert seit
    Jun 2011
    Ort
    Thüringen
    Beiträge
    1,203

    Standard IP-Symcon auf Raspberry mit Nutzung der GPIOs

    Hallo,

    nachdem hier (IP-Symcon Community Forum) ausgesagt wurde, dass man sich selbst um die Anbindung der Raspberry I/O Schnittstellen kümmern muss, habe ich dies "als ersten Aufschlag" getan.
    Hierbei habe ich den Ansatz Befehle und Sollwerte über die SHELL direkt aus IPS zu setzen. Hierzu in einem normalen IPS-Script einfach z.B:
    PHP-Code:
    shell_exec("/usr/local/bin/gpio write 3 1");  //dies würde PIN3 auf High schalten.
    //(WiringPI hierfür erforderlich: http://wiringpi.com/download-and-install/) 
    Die 1-Wire Temperaturen lese ich aus dem Dateiverzeichnis ebenfalls direkt aus IPS per Script z.B:
    PHP-Code:
    <?
    //Adresse des Tempsensors muss im Info Feld stehen z.B.:
    //28-000004aaf379
    //Script muss unterhalb der TempVariablen stehen
    //
    $debug=false;
    $Par_ID=IPS_GetParent($_IPS['SELF']);
    $var_object_type=IPS_GetObject($Par_ID);
    $ObjInfo=$var_object_type['ObjectInfo'];
    if (
    $debug) echo $ObjInfo;
    $dateiname="tail /sys/bus/w1/devices/".$ObjInfo."/w1_slave";
    if (
    $debug) echo "\n $dateiname";
    $meinstring=shell_exec($dateiname);
    if (
    $debug) echo "\n$meinstring\n";
    $pos1 stripos($meinstring"t=");
    $valuesubstr($meinstring,$pos1+2);      //um das t= zu entfernen
    $Temp=round(($value/1000),1);
    if (
    $debug) echo "Temp= $value  $Temp";
    If (
    GetValueFloat($Par_ID)!=$Temp)
        
    SetValueFloat($Par_ID,$Temp);
    ?>
    Nun kann man ja die GPIO-Ports auch über ein Script auslesen, z.B.:
    PHP-Code:
    $Pin3=shell_exec("/usr/local/bin/gpio read 3"); 
    , dies würde aber ein zyklischen Pollen erfordern.

    Aus diesem Grund habe ich einen kleinen Dienst geschrieben, welcher die Werte (bei Änderung) per json an IP-Symcon schickt. Ich habe hier auch mehrere Tage schon erfolgreich I2C-Karten (von Horter&Kalb) in Betrieb, welche ich auch auf diesem Weg übertrage. Der Einfachheit halber ist das Beispiel (in der Anlage) aber nur für die GPIOs.

    PHP-Code:
    //Anleitung beschreibt nicht Installation von Raspbian,  IP-Symcon ...
    //Dienst wird benötigt um Änderungen an den GPIOs sofort an den IPS zu übertragen
    //IPS kann lokal (auf dem PI) oder auch Remote sein
    //
    //Voraussetzungen:
    //Falls noch nicht erfolgt wiringPI installieren 
    //http://wiringpi.com/download-and-install/
    //Test mit: 
    gpio readall    //liest alle Ports
    gpio write 3 1    //schreibt Port3 HIGH 
    //
    //Falls I2C-Module vorhanden auch I2C-Tools installieren
    //http://kampis-elektroecke.de/?page_id=2035
    //
    //
    //Als Erstes lib für curl installieren:
    sudo apt-get install libcurl4-openssl-dev
    //Ordner "ips-pi" unter Home anlegen
    sudo mkdir ips-pi
    //ggf. Rechte anpassen
    sudo chmod 777 ips-pi
    //per WINSCP beide Dateien aus dem Anhang (makefile und ips-pi.c in dieses Verzeichnis kopieren
    //zum Test sudo make (im Verzeichnis ips-pi) durchführen
    sudo make  
    //falls bei obigen ein Fehler kommt fehlt eine LIBRARY oder Fehler im Raspbian
    //
    //Anpassen der ips-pi.c im WINSCP
    // IP und Port in nächster Zeile
    // curl_easy_setopt(curl, CURLOPT_URL, "http://ip:port/api/");
    // User und Password in nächster Zeile
    // curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password"); 
    // Jeweilige Var_IDs z.B.:
    // GPIO_PIN[0][0]=39331;    
    // ggf. Zahl/Wert der überwachenden PINs einschränken
    // for(i=0;i<=7;i++)
    //
    //Start durch:
    sudo ./ips-pi                     //vorher nach ips-pi wechseln
    //ggf.noch Autostart einrichten: http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/scripts
    // 
    Viel Spaß

    herbertf
    Angehängte Dateien Angehängte Dateien
    Geändert von herbertf (12.06.16 um 17:25 Uhr)
    IPS 5.x (beta) auf W10x64 in Hyper-V von W2016, FHZ1300, WDE-01, Homematic-CCU2, VISION-Z-WAVE-Stick alles über Silex-SX3000GB, 2*RaZberry,FHT80x, FS20 BidCos-RM, 19*FIBARO-Roller Shutter (V1+2), 15*Fibaro(-Dimmer, -Sensoren, -Switche), 7*Raspberry-PI2 ü. JSON-RPC, 3 VISION-Bewegungsmelder, 2 AEON-Multisensor, Homematic-Aktoren,15*Plugwise, 6 PhilioSensoren,

  2. #2
    Registriert seit
    Nov 2008
    Ort
    Baden-Württemberg
    Beiträge
    101

    Hallo herbertf

    danke für deine tolle Arbeit , das einlesen der GPIO's funktioniert super, hätte aber auch interesse an deiner
    i2c unterstützung.
    Könntest du dieses auch veröffentlichen. Hab hier einige Sensoren wie Luftdruck / Temperatur /Helligkeit die ich als eigenstände Wetterstation einbinden will.


    Gruß
    MichelH
    Hardware : VIPA 315 4NE12 128E/176A 8X0-10V / 32x1-Wire 2xPokey56E über ModbusTcp / ProJet Tankanzeige 0-10V
    Server: I7-4770T 32GB RAM ESXI
    Software : VM Windows7 64Bit IPS4.x IPSVIEW

  3. #3
    Registriert seit
    Aug 2014
    Beiträge
    13

    Tolle Arbeit :-)
    Hätte auch großes Interesse an die i2c unterstütztung um zb die ds2413 auszulesen

  4. #4
    Registriert seit
    Jun 2011
    Ort
    Thüringen
    Beiträge
    1,203

    Hallo ihr beiden,

    vielen Dank - dann versuche ich mal mein Glück, hoffentlich leicht verständlich (bin ja kein Pädagoge)):

    Vorwort: Ich setzte I2C von Horter und Kalb ohne irgendwelche Pegelwandler direkt am PI (maximal 30cm Kabel) ein -ohne jegliche Ausfälle oder Probleme seit ca. 12 Monaten.

    Die Outputkarten sind m.E. nicht für jede Anwendung geeignet, da sie nach dem Einschalten auf EIN gehen (chipbedingt) - wäre für die Eingangstür eher "schlecht". Die Inputkarten haben m.E. den Vorteil des weiten Eingangsspannungsbereichs - für mich allerdings total flexibel.

    So nun zur Idee "IPS-auf PI, am Beispiel Horter&Kalb I2C Inputkarte (Bausatz I2C-Input 5 - 24V 8 Bit für DIN-Schiene)":

    Zuerst Installation der I2C-Tools (http://kampis-elektroecke.de/?page_id=2035).

    Ich lese den I2C-Bus in einem separaten Thread aus:

    PHP-Code:
        if(pthread_create(&t2NULL, (void *)&i2c_eingaenge1,NULL) != 0)
        {
          
    fprintf(stderr"Fehler bei Thread 2  I2C-Eingaenge 1.....\n");
          exit(
    0);
        } 
    Dafür muss naürlich t2 als integer dekliniert sein.

    In der "gpio_init" folgendes hinzufügen:

    PHP-Code:
        i2c_in_1[0][0]=26057;    //5-stellige Zahlen sind die Ziel-VariablenIDs (des lokalen IPS)
        
    i2c_in_1[1][0]=43699;
        
    i2c_in_1[2][0]=48692;
        
    i2c_in_1[3][0]=20600;
        
    i2c_in_1[4][0]=23055;
        
    i2c_in_1[5][0]=53358;
        
    i2c_in_1[6][0]=27936;
        
    i2c_in_1[7][0]=27534;

        if((
    fd1=wiringPiI2CSetup(dID1))<0){
            
    printf("error opening i2c channel Eingabekarte-1\n\r"); 
    Im Hauptprogramm definiere ich das Array:

    PHP-Code:
    int i2c_in_1[8][3]={{0},{0},{0}};        //I2C-Bus Array für Eingang 0=0-7  1=val_id    2=aktuellerWert    3=alterWert 
    und die jeweilige Adresse des I2C-Ports
    PHP-Code:
    int dID1 0x3d;                    //Hex-Adresse I2C-Eingabekarte1 ermittelt über "i2cdetect -y 1" 

    und den Thread:

    PHP-Code:
    void i2c_eingaenge1 (void)
    {
        
    printf("I2C-Eingaenge1 Thread gestartet\n");
        
    int i;
        for (;;)        
    //Endlosschleife
        
    {    
            
    int dezzahl1;
            
    dezzahl1=wiringPiI2CRead (fd1);
            
    //printf("READ:  %i \n", dezzahl1);
            
    if (dezzahl1>=128i2c_in_1[7][1]=1; else i2c_in_1[7][1]=0;
            if (
    dezzahl1%128>=64i2c_in_1[6][1]=1; else i2c_in_1[6][1]=0;
            if (
    dezzahl1%64>=32i2c_in_1[5][1]=1; else i2c_in_1[5][1]=0;
            if (
    dezzahl1%32>=16i2c_in_1[4][1]=1; else i2c_in_1[4][1]=0;        
            if (
    dezzahl1%16>=8i2c_in_1[3][1]=1; else i2c_in_1[3][1]=0;            
            if (
    dezzahl1%8>=4i2c_in_1[2][1]=1; else i2c_in_1[2][1]=0;            
            if (
    dezzahl1%4>=2i2c_in_1[1][1]=1; else i2c_in_1[1][1]=0;
            if (
    dezzahl1%2>=1i2c_in_1[0][1]=1; else i2c_in_1[0][1]=0;
            for(
    i=0;i<=7;i++)                                                //Input 3-7 mit EinzelMeldungen belegt (alle belegt)
            
    {
                if (
    i2c_in_1[i][2]!=i2c_in_1[i][1]) {
                    if (
    i2c_in_1[i][1]==0var_val="true";        //negative Logik
                    
    else var_val="false";
                    
    printf("\ni2c_in_1-Pin hat sich geaendert i2c_in_1_%d=%d -> senden\n",i,i2c_in_1[i][2]);
    //                printf("\nWerteGändert: %d %d %d \n",i2c_in_1[i][0],i2c_in_1[i][1],i2c_in_1[i][2]);
                    
    curl_senden(i2c_in_1[i][0],var_val);
                }
                
    i2c_in_1[i][2]=i2c_in_1[i][1];        //alten Wert setzen
            
    }
            
    //Stabilität Delay
            
    delay(100);                                                   
        }
        
    printf("I2C-Eingaenge1 Thread beendet\n");
        
    pthread_exit((void *) 0);

    Zusätzlich zu diesem Dienst habe ich noch eine Generalabfrage im IPS auf dem PI eingerichtet (alle 10Minuten bzw. bei Neustart IPS), dieser liest die I2C-Eingänge praktisch ohne den Dienst aus:
    PHP-Code:
    <?
    // GA ausfuehren fuer alle Variablen im Ordner
    //
    $I2C_Adresse=0x3d;      //ermittelt über i2cdetect -y 1
    //
    //
    $Par_ID=IPS_GetParent($_IPS['SELF']);
    //
    //Auslesen I2C Bus und Umrechnung
    $dezzahlhexdecshell_exec("i2cget -y 1 $I2C_Adresse"));
    echo 
    "\nDezzahl $dezzahl";
    $i2c_arr=array();
    if (
    $dezzahl>=128$i2c_arr[7] =1; else $i2c_arr[7] =0;
    if (
    $dezzahl%128>=64$i2c_arr[6] =1; else $i2c_arr[6] =0;
    if (
    $dezzahl%64>=32$i2c_arr[5] =1; else $i2c_arr[5] =0;
    if (
    $dezzahl%32>=16$i2c_arr[4] =1; else $i2c_arr[4] =0;
    if (
    $dezzahl%16>=8$i2c_arr[3] =1; else $i2c_arr[3] =0;
    if (
    $dezzahl%8>=4$i2c_arr[2] =1; else $i2c_arr[2] =0;
    if (
    $dezzahl%4>=2$i2c_arr[1]  =1; else $i2c_arr[1]  =0;
    if (
    $dezzahl%2>=1$i2c_arr[0] =1; else $i2c_arr[0] =0;
    //
    //
    $variablen_array=IPS_GetChildrenIDs($Par_ID);
    $var_ids = array();
    foreach (
    $variablen_array as $value)        //durchsucht alle Objekte unter PAR_ID
    {
        
    $var_object_type=IPS_GetObject($value);
        
    $ObjTyp=$var_object_type['ObjectType'];
        
    $Name=IPS_GetName($value);
        
    // Ermittlung Variable
       
    If ($ObjTyp==2)     {  //Prüfung ob Objekt Variable
            //echo $Name;
            
    $Variable=IPS_GetVariable ($value);
            
    $ObjInfo=$var_object_type['ObjectInfo'];
            
    $Nummer= (int) substr($ObjInfo, -2);
            
    $wert=$i2c_arr[$Nummer];
            if (
    $wert==0$wert=false;
               else 
    $wert=true;
            echo 
    "\n$value $ObjInfo $Nummer $wert";
            If (
    GetValueBoolean($value)==$wert)    SetValueBoolean($value,!$wert);
        }
    }
    Ende_Script:
    ?>
    Grundsätzlich ist es erforderlich, für die direkte Abfrage aus IPS, die I2C-Variablen mit dern INFO_Feld zu belegen !!!!!!!
    Dies ist wichtig !!!!
    z.B. als Info-Feld:
    HTML-Code:
    I2C_IN_1_02
    Das war "hoffentlich" schon alles - Viel Spaß

    Beste Grüße aus Thüringen

    herbertf
    Geändert von herbertf (09.09.14 um 07:36 Uhr)
    IPS 5.x (beta) auf W10x64 in Hyper-V von W2016, FHZ1300, WDE-01, Homematic-CCU2, VISION-Z-WAVE-Stick alles über Silex-SX3000GB, 2*RaZberry,FHT80x, FS20 BidCos-RM, 19*FIBARO-Roller Shutter (V1+2), 15*Fibaro(-Dimmer, -Sensoren, -Switche), 7*Raspberry-PI2 ü. JSON-RPC, 3 VISION-Bewegungsmelder, 2 AEON-Multisensor, Homematic-Aktoren,15*Plugwise, 6 PhilioSensoren,

  5. #5
    Registriert seit
    Aug 2011
    Beiträge
    970

    hallo,

    kann ich die GPIOs an einem Client abfragen bzw. setzen? Sprich nicht auf dem IPS-Server sondern einem im Heimnetz befindlichen RaspPi?

    Gruß
    Hardlog
    IPS 5.0unlim, 3x W&T WebIO12, diverse 1wire (LAN), FritzOS 7, z-Wave, DMX/ArtNet-Node, M-Bus, ESP8266 via MQTT

    "Prognosen sind schwierig, besonders wenn sie die Zukunft betreffen" N. Bohr

  6. #6
    Registriert seit
    Jun 2011
    Ort
    Thüringen
    Beiträge
    1,203

    Hallo Hardlog,

    wenn Du KEINEN zusätzlichen IPS auf dem Raspberry einsetzen willst, funktioniert dies: http://www.ip-symcon.de/forum/thread...-TCP-IP-Server.

    IP-Symcon auf dem Raspberry ist derzeit noch BETA, vor allem Abstürze in der Konsole "nerven" etwas.

    Trotzdem bist Du m.E. künftig flexibler wenn Du einen zusätzlichen IPS auf dem Raspberry installierst und die Daten wie in diesem Thread beschrieben mit Deinem aktuellen IPS austauschst ...... (direkt zwischen 2 IPS sollte JSON genutzt werden http://www.ip-symcon.de/service/doku...atenaustausch/)

    Gruß

    herbertf
    Geändert von herbertf (10.09.14 um 07:56 Uhr)
    IPS 5.x (beta) auf W10x64 in Hyper-V von W2016, FHZ1300, WDE-01, Homematic-CCU2, VISION-Z-WAVE-Stick alles über Silex-SX3000GB, 2*RaZberry,FHT80x, FS20 BidCos-RM, 19*FIBARO-Roller Shutter (V1+2), 15*Fibaro(-Dimmer, -Sensoren, -Switche), 7*Raspberry-PI2 ü. JSON-RPC, 3 VISION-Bewegungsmelder, 2 AEON-Multisensor, Homematic-Aktoren,15*Plugwise, 6 PhilioSensoren,

  7. #7
    Registriert seit
    Aug 2011
    Beiträge
    970

    Danke @herbertf,

    das mit der Instabilität der beta hat mich erstmal zu nem Rückschritt verleitet. Hab momentan RaspPis nur zum visualisieren des WF und einen für XBMC im Einsatz. Deine Verschläge werde ich heute Nachmittag mal probieren.

    Gruß
    hardlog
    IPS 5.0unlim, 3x W&T WebIO12, diverse 1wire (LAN), FritzOS 7, z-Wave, DMX/ArtNet-Node, M-Bus, ESP8266 via MQTT

    "Prognosen sind schwierig, besonders wenn sie die Zukunft betreffen" N. Bohr

  8. #8
    Registriert seit
    Jul 2006
    Ort
    Butzbach, die schöne Wetterau
    Beiträge
    1,473

    Hi,

    ich habe noch so einen PiFace drauf und damit funktioniert es nicht. Hättest Du da ne Lösung?
    Gruß Uwe
    (bmwm3)


  9. #9
    Registriert seit
    Jun 2011
    Ort
    Thüringen
    Beiträge
    1,203

    Hi UVoigi,

    leider nein, ich habe -zwar ausschließlich- dafür aber mehrfach folgendes:

    - GPIOs als Ein- und Ausgänge (nachgeschaltete Relais-Boards)
    - GPIO mit 1-Wire-TempSensoren
    - I2C In- und Output von Horter & Kalb

    als Türsprechstellen habe ich dann noch einen USB-Sound-Adapter für die Nutzung als PJSIP-VoIP Client.

    Weiterhin nutze ich, bei 2 von 5 PIs, einen WLAN-Stick als zusätzlichen Access-Punkt. Funkt auch mit WPA/Radius problemlos.

    Aber ein PiFace habe ich leider nicht ....

    HerbertF
    IPS 5.x (beta) auf W10x64 in Hyper-V von W2016, FHZ1300, WDE-01, Homematic-CCU2, VISION-Z-WAVE-Stick alles über Silex-SX3000GB, 2*RaZberry,FHT80x, FS20 BidCos-RM, 19*FIBARO-Roller Shutter (V1+2), 15*Fibaro(-Dimmer, -Sensoren, -Switche), 7*Raspberry-PI2 ü. JSON-RPC, 3 VISION-Bewegungsmelder, 2 AEON-Multisensor, Homematic-Aktoren,15*Plugwise, 6 PhilioSensoren,

  10. #10
    Registriert seit
    Jul 2006
    Ort
    Butzbach, die schöne Wetterau
    Beiträge
    1,473

    Hm....

    eigentlich funktioniert es fast, aber............... ich muss vor jedem lese oder schreib Befehl ein -p setzen.
    Weiß aber nicht wie oder wo ich es in deinem Skript vordefiniere. Hast Du vlt dafür eine Idee??
    Gruß Uwe
    (bmwm3)


Ähnliche Themen

  1. IPS auf Raspberry Pi - OneWire
    Von zollaki im Forum Allgemeine Diskussion
    Antworten: 41
    Letzter Beitrag: 12.06.15, 06:34
  2. IP-Symcon auf der Messe Light&Building
    Von Aschendorf im Forum Stammtische
    Antworten: 24
    Letzter Beitrag: 04.04.14, 18:19
  3. Nutzung der Datenbank in IPS
    Von BommelPommel im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 1
    Letzter Beitrag: 10.11.13, 11:41
  4. IP-Symcon auf der Heim und Handwerk 2010
    Von malie im Forum Stammtische
    Antworten: 3
    Letzter Beitrag: 23.11.10, 16:42

Stichworte