+ Antworten
Seite 2 von 5 ErsteErste 1 2 3 4 ... LetzteLetzte
Ergebnis 11 bis 20 von 42
  1. #11
    Registriert seit
    Jul 2006
    Ort
    Butzbach, die schöne Wetterau
    Beiträge
    1,477

    So funktioniert jetzt soweit alles.

    Es gibt nur noch ein kleines Problem, wenn man mal ca 15 min. nichts am Rapberry macht,scheint es ein wenig
    einzuschlafen. Drücke ich am Raspberry PiFace eine Taste dauert es ungefähr ca 15 sec. bis es aktualisiert..
    Währe jetzt in diesem (meinem) Fall nicht so schlimm, und danach geht es dann wieder. Aber im Fall Port schalten ist es nicht so einfach, Da kommt dann die Fehlermeldung von IPS IP nicht erreichbar, dann dauert es ca 10 sec und er schaltet es mir 2 mal hintereinander.?????

    Gibt es da irgendeine Lösung das man den Raspberry, na wie soll ich sagen, Wachhalten? kann?
    Gruß Uwe
    (bmwm3)


  2. #12
    Registriert seit
    Jun 2011
    Ort
    Thüringen
    Beiträge
    1,339

    Also einschlafen soll und kann da nix.

    Da hast Du bestimmt noch einen kleinen Fehler drin.

    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,

  3. #13
    Registriert seit
    Jul 2006
    Ort
    Butzbach, die schöne Wetterau
    Beiträge
    1,477

    @herbertf

    hast recht gehabt. Der W-Lan Adapter ging in den Schlafmodus wenn er nicht benutzt wird.
    Hier mal für jemanden der es braucht. In meinem Fall ist es der EDIMAX.

    PHP-Code:
    sudo nano /etc/modprobe.d/8192cu.conf 
    und dann der Eintrag.

    PHP-Code:
    # Disable power management
    options 8192cu rtw_power_mgnt=0 rtw_enusbss=
    Gruß Uwe
    (bmwm3)


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

    Hi,

    weil ich nun nochmal per Mail angefragt wurde, hier nun mein aktives Beispiel auch für I2C Input und Output-Karten:

    ips-pi.c

    PHP-Code:
    /*
    Dieser Dienst sendet die lokalen Eingänge (GPIOs ..).... an den lokalen IP-Symcon-Dienst
    //
    // Garage
    //
    Ver: 2.6
    - Übertragung binärer Zustände an IPS, bei deren Änderung
    - I2C Unterstützung Inputkarte
    - LifeBit
    - I2C Unterstützung Outputkarte (Initialisierung auf Null)
    - Prozessorlast durch Delay gesenkt
    */
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <wiringPi.h>
    #include <wiringPiI2C.h>
    #include <string.h>
    #include <time.h>
    #include <stdio.h>
    #include <curl/curl.h>
    #include <pthread.h>
    // Threads: http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel8.shtml
    pthread_t t1,t2,t3,t4,t5;
    int var_id,j,e,fd1,fd2,fd3;
    charvar_val;
    int GPIO_PIN[17][3]={{0},{0},{0}};        //GPIO-PINs zweidimensionales Array 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
    int dID1 0x3d;                    //Hex-Adresse I2C-Eingabekarte1 ermittelt über "i2cdetect -y 1"
    int dID2 0x3a;                    //Hex-Adresse I2C-Eingabekarte2 ermittelt über "i2cdetect -y 1"
    int dID3 0x27;                    //Hex-Adresse I2C-Ausgabekarte ermittelt über "i2cdetect -y 1"
    int i2c_in_1[8][3]={{0},{0},{0}};        //I2C-Bus zweidimensionales Array für Eingang 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
    int i2c_in_2[8][3]={{0},{0},{0}};        //I2C-Bus zweidimensionales Array für Eingang 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
    int i2c_out_1[8][3]={{0},{0},{0}};        //I2C-Bus zweidimensionales Array für Eingang 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
    //
    void curl_senden (int var_idcharvar_val)
    {
      
    CURL *curl;
      
    CURLcode res;
      
    curl_global_init(CURL_GLOBAL_ALL);
       
    /* get a curl handle */ 
      
    curl curl_easy_init();
      
    //printf("\nvar_id= %d var_val= %s\n",var_id,var_val);
      
    if(curl) {
        const 
    int MAX_BUF =1000;
        
    charjsonObj malloc(MAX_BUF);
        
    sprintf(jsonObj,"{\"jsonrpc\": \"2.0\",\"method\":\"SetValue\",\"params\":[%i,%s],\"id\":1}",var_id,var_val); 
        
    printf("JSON-String= %s gesandt\n",jsonObj);
        
    struct curl_slist *headers NULL;
        
    headers curl_slist_append(headers"Accept: application/json");
        
    headers curl_slist_append(headers"Content-Type: application/json");
        
    headers curl_slist_append(headers"charsets: utf-8");
        
    curl_easy_setopt(curlCURLOPT_URL"http://192.168.4.57:3777/api/");    //hier IP-Adresse-Port
          
    curl_easy_setopt(curlCURLOPT_USERPWD"username:password");             //hier username+password
        
    curl_easy_setopt(curlCURLOPT_HTTPHEADERheaders); 
        
    curl_easy_setopt(curlCURLOPT_POSTFIELDSjsonObj);    
        
    res curl_easy_perform(curl);
         
    /* Check for errors */ 
        
    if(res != CURLE_OK)
          
    fprintf(stderr"curl_easy_perform() failed: %s\n",
                  
    curl_easy_strerror(res));
        
    /* always cleanup */
        
    curl_easy_cleanup(curl);
      }
      
    curl_global_cleanup(); 
      
    printf("\n");
      return;
    }

    int lifebit (void)    //
    {
        
    printf("\nLifebit-Thread gestartet\n");
        
    int x=1,LifeBit=30123;
        for(;;) 
        {
            
    x=abs(x-1);
            if (
    x==1var_val="true";
            else 
    var_val="false";
            
    curl_senden(LifeBit,var_val);
            
    delay(30000);    //alle 10 Sekunden
        
    }    
        return 
    0;
        
    printf("GPIO-Ueberwachung-Thread beendet\n");
        
    pthread_exit((void *) 0);
    }

    int gpio_thread (void)    //
    {
        
    printf("\nGPIO-Ueberwachung-Thread gestartet\n");
        
    int i;
        for(;;) 
        {
            for(
    i=0;i<=6;i++)                                //6Output-Ports GPIO 0-7  (7 wäre 1-Wire)
            
    {
                
    GPIO_PIN[i][1]=digitalRead(i);            //Liest GPIO-PINs in Array
                
    if (GPIO_PIN[i][2]!=GPIO_PIN[i][1]) {
                    if (
    GPIO_PIN[i][1]==1var_val="true";
                    else 
    var_val="false";
                    
    printf("\nGPIO-Pin hat sich geaendert GPIO_%d=%d -> senden\n",i,GPIO_PIN[i][2]);
    //                printf("\nWerteGändert: %d %d %d \n",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
                    
    curl_senden(GPIO_PIN[i][0],var_val);
                }    
                
    GPIO_PIN[i][2]=GPIO_PIN[i][1];
    //            printf("\nWerte: %d %d %d \n",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
            
    }
            for(
    i=11;i<=12;i++)                                //(MISO(13)) (7.Relais) und (MOSI(12)) (8.Relais)
            
    {
                
    GPIO_PIN[i][1]=digitalRead(i);            //Liest GPIO-PINs in Array
                
    if (GPIO_PIN[i][2]!=GPIO_PIN[i][1]) {
                    if (
    GPIO_PIN[i][1]==1var_val="true";
                    else 
    var_val="false";
                    
    printf("\nGPIO-Pin hat sich geaendert GPIO_%d=%d -> senden\n",i,GPIO_PIN[i][2]);
    //                printf("\nWerteGändert: %d %d %d \n",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
                    
    curl_senden(GPIO_PIN[i][0],var_val);
                    
    delay(20);
                }    
                
    GPIO_PIN[i][2]=GPIO_PIN[i][1];
    //            printf("\nWerte: %d %d %d \n",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
            
    }        
        
    delay(100);    //zur Stabilität nötig (sonst Aufruf doppelt/dreifach)
        
    }    
        return 
    0;
        
    printf("GPIO-Ueberwachung-Thread beendet\n");
        
    pthread_exit((void *) 0);
    }
     
    void i2c_eingaenge1 (void)
    {
        
    printf("I2C-Eingaenge1 Thread gestartet\n");
        
    int i;
        for (;;)        
    //Endlosschleife
        
    {    
            
    //printf("Eingaenge1 ist jetzt wieder wach!%d \n",j);
            
    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++)                                                
            {
                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);
                    
    delay(20);
                }
                
    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);
    }

    void i2c_eingaenge2 (void)
    {
        
    printf("I2C-Eingaenge2 Thread gestartet\n");
        
    int i;
        for (;;)        
    //Endlosschleife
        
    {    
            
    //printf("Eingaenge1 ist jetzt wieder wach!%d \n",j);
            
    int dezzahl2;
            
    dezzahl2=wiringPiI2CRead (fd2);
            
    //printf("READ:  %i \n", dezzahl1);
            
    if (dezzahl2>=128i2c_in_2[7][1]=1; else i2c_in_2[7][1]=0;
            if (
    dezzahl2%128>=64i2c_in_2[6][1]=1; else i2c_in_2[6][1]=0;
            if (
    dezzahl2%64>=32i2c_in_2[5][1]=1; else i2c_in_2[5][1]=0;
            if (
    dezzahl2%32>=16i2c_in_2[4][1]=1; else i2c_in_2[4][1]=0;        
            if (
    dezzahl2%16>=8i2c_in_2[3][1]=1; else i2c_in_2[3][1]=0;            
            if (
    dezzahl2%8>=4i2c_in_2[2][1]=1; else i2c_in_2[2][1]=0;            
            if (
    dezzahl2%4>=2i2c_in_2[1][1]=1; else i2c_in_2[1][1]=0;
            if (
    dezzahl2%2>=1i2c_in_2[0][1]=1; else i2c_in_2[0][1]=0;
            for(
    i=0;i<=7;i++)                                                
            {
                if (
    i2c_in_2[i][2]!=i2c_in_2[i][1]) {
                    if (
    i2c_in_2[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_2[i][2]);
    //                printf("\nWerteGändert: %d %d %d \n",i2c_in_2[i][0],i2c_in_2[i][1],i2c_in_2[i][2]);
                    
    curl_senden(i2c_in_2[i][0],var_val);
                    
    delay(20);    
                }
                
    i2c_in_2[i][2]=i2c_in_2[i][1];        //alten Wert setzen
            
    }
            
    //Stabilität Delay
            
    delay(100);                                                    //um Schreiben in Modbus zu ermöglichen
        
    }
        
    printf("I2C-Eingaenge2 Thread beendet\n");
        
    pthread_exit((void *) 0);
    }

    void i2c_ausgaenge1 (void)
    {
        
    printf("I2C-Ausgaenge1 Thread gestartet\n");
        
    int i;
        for (;;)        
    //Endlosschleife
        
    {    
            
    //printf("Eingaenge1 ist jetzt wieder wach!%d \n",j);
            
    int dezzahl2;
            
    dezzahl2=wiringPiI2CRead (fd3);
            
    //printf("READ:  %i \n", dezzahl1);
            
    if (dezzahl2>=128i2c_out_1[7][1]=1; else i2c_out_1[7][1]=0;
            if (
    dezzahl2%128>=64i2c_out_1[6][1]=1; else i2c_out_1[6][1]=0;
            if (
    dezzahl2%64>=32i2c_out_1[5][1]=1; else i2c_out_1[5][1]=0;
            if (
    dezzahl2%32>=16i2c_out_1[4][1]=1; else i2c_out_1[4][1]=0;        
            if (
    dezzahl2%16>=8i2c_out_1[3][1]=1; else i2c_out_1[3][1]=0;            
            if (
    dezzahl2%8>=4i2c_out_1[2][1]=1; else i2c_out_1[2][1]=0;            
            if (
    dezzahl2%4>=2i2c_out_1[1][1]=1; else i2c_out_1[1][1]=0;
            if (
    dezzahl2%2>=1i2c_out_1[0][1]=1; else i2c_out_1[0][1]=0;
            for(
    i=0;i<=7;i++)                                                //Input 3-7 mit EinzelMeldungen belegt (alle belegt)
            
    {
                if (
    i2c_out_1[i][2]!=i2c_out_1[i][1]) {
                    if (
    i2c_out_1[i][1]==0var_val="true";        //negative Logik
                    
    else var_val="false";
                    
    printf("\ni2c_out_1-Pin hat sich geaendert i2c_out_1%d=%d -> senden\n",i,i2c_out_1[i][2]);
    //                printf("\nWerteGändert: %d %d %d \n",i2c_out_1[i][0],i2c_out_1[i][1],i2c_out_1[i][2]);
                    
    curl_senden(i2c_out_1[i][0],var_val);
                    
    delay(20);
                }
                
    i2c_out_1[i][2]=i2c_out_1[i][1];        //alten Wert setzen
            
    }
            
    //Stabilität Delay
            
    delay(100);                                                    //um Schreiben in Modbus zu ermöglichen
        
    }
        
    printf("I2C-Eingaenge2 Thread beendet\n");
        
    pthread_exit((void *) 0);
    }


    int gpio_init(void)
    {
        
    printf ("GPIO Init\n") ;
        
    int n;
        if (
    wiringPiSetup () == -1)  //Startet Wiring API - wichtig
            
    return 1;                 //return von wiringPi
        //Initialisierung
        
    GPIO_PIN[0][0]=39331;    //
        
    GPIO_PIN[1][0]=50705;    //
        
    GPIO_PIN[2][0]=37099;    //n.B.
        
    GPIO_PIN[3][0]=55615;    //n.B.
        
    GPIO_PIN[4][0]=59727;    //n.B.
        
    GPIO_PIN[5][0]=36450;    //n.B.
        
    GPIO_PIN[6][0]=32653;    //
        
    GPIO_PIN[12][0]=26939;    //MOSI 
        
    GPIO_PIN[13][0]=44638;    //MISO
        
    for(n=0;n<=6;n++) pinMode(nOUTPUT);    //PIN7 (entspricht auch GPIO7 ist für 1-Wire genutzt)
        
    pinMode(12,OUTPUT);       //entspricht in Konsole "gpio mode 12 out"
        
    pinMode(13,OUTPUT);       //entspricht in Konsole "gpio mode 13 out"    
        //
        
    i2c_in_1[0][0]=26057;    //00 
        
    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;    //70 
        //
        
    i2c_in_2[0][0]=12723;    //00 
        
    i2c_in_2[1][0]=47937;
        
    i2c_in_2[2][0]=33003;
        
    i2c_in_2[3][0]=13296;
        
    i2c_in_2[4][0]=41542;
        
    i2c_in_2[5][0]=56398;
        
    i2c_in_2[6][0]=42606;
        
    i2c_in_2[7][0]=36428;
        
    //
        //
        //
        
    if((fd1=wiringPiI2CSetup(dID1))<0){
            
    printf("error opening i2c channel Eingabekarte-1\n\r");
        }
        if((
    fd2=wiringPiI2CSetup(dID2))<0){
            
    printf("error opening i2c channel Eingabekarte-1\n\r");
        }    
        if((
    fd3=wiringPiI2CSetup(dID3))<0){
            
    printf("error opening i2c channel Ausgabekarte-1\n\r");
        }    
        
    delay(100);
        if((
    e=wiringPiI2CWrite(fd3,0))<0)        {     //initial auf Null - wichtig
            
    printf("error writing to slave\n\r");  
        }    
    //Ende I2C RELAISKARTE
        //
        
    i2c_out_1[0][0]=55868;
        
    i2c_out_1[1][0]=37960;
        
    i2c_out_1[2][0]=15286;
        
    i2c_out_1[3][0]=50020;
        
    i2c_out_1[4][0]=24998;
        
    i2c_out_1[5][0]=47589;
        
    i2c_out_1[6][0]=10178;
        
    i2c_out_1[7][0]=50968;    
        
    //
        
    return 1;
    }    

    int main(void)
    {
        
    gpio_init();
        
    printf"Raspi-Symcon-Dienst gestartet ....\n");
    //
        
    if(pthread_create(&t1NULL, (void *)&gpio_thread,NULL) != 0)
        {
          
    fprintf(stderr"Fehler bei gpio_thread 1....\n");
          exit(
    0);
        }
        if(
    pthread_create(&t2NULL, (void *)&i2c_eingaenge1,NULL) != 0)
        {
          
    fprintf(stderr"Fehler bei Thread 2  I2C-Eingaenge 1.....\n");
          exit(
    0);
        }    
        if(
    pthread_create(&t3NULL, (void *)&i2c_eingaenge2,NULL) != 0)
        {
          
    fprintf(stderr"Fehler bei Thread 3  I2C-Eingaenge 2.....\n");
          exit(
    0);
        }
        if(
    pthread_create(&t4NULL, (void *)&lifebit,NULL) != 0)
        {
          
    fprintf(stderr"Fehler bei Thread 4  LifeBit.....\n");
          exit(
    0);
        }    
        if(
    pthread_create(&t5NULL, (void *)&i2c_ausgaenge1,NULL) != 0)
        {
          
    fprintf(stderr"Fehler bei Thread 5  I2C-Ausgabekarte 1.....\n");
          exit(
    0);
        }        
        for(;;) 
        {
            
    delay(1500);    //ohne delay Prozessorleistung 100%
        
    }
        return 
    0;

    mehr quick & dirty - funktioniert aber ;-)))))
    Geändert von herbertf (18.10.14 um 08:14 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. #15
    Registriert seit
    Sep 2013
    Beiträge
    131

    Hallo herbertf ,

    das einlesen der GPIO's funktioniert super, tolle arbeit.

    Ich habe jedoch ein problem mit der Prozessorauslastung (100%) wenn das Programm läuft.
    Hast du eine Idee woran das liegen könnte?

    Code:
    /*
    Dieser Dienst sendet die lokalen Eingänge (GPIOs ..) an den lokalen IP-Symcon-Dienst
    Ver: 2.1
    - Übertragung binärer Zustände an IPS, bei deren Änderung
    - I2C Unterstützung
    */
    
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <wiringPi.h>
    #include <wiringPiI2C.h>
    #include <string.h>
    #include <time.h>
    #include <stdio.h>
    #include <curl/curl.h>
    #include <pthread.h>
    
    // Threads: http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel8.shtml
    pthread_t t1,t2,t3,t4;
    int var_id,i;
    char* var_val;
    int GPIO_PIN[17][3]={{0},{0},{0}};		//GPIO-PIN  Array 0=0-7 1=val_id 2=aktuellerWert 3=alterWert
    
    void curl_senden (int var_id, char* var_val)
    {
      CURL *curl;
      CURLcode res;
      curl_global_init(CURL_GLOBAL_ALL);
       /* get a curl handle */ 
      curl = curl_easy_init();
      //printf("\nvar_id= %d var_val= %s\n",var_id,var_val);
      if(curl) {
        const int MAX_BUF =1000;
    	char* jsonObj = malloc(MAX_BUF);
        sprintf(jsonObj,"{\"jsonrpc\": \"2.0\",\"method\":\"SetValue\",\"params\":[%i,%s],\"id\":1}",var_id,var_val); 
    	printf("JSON-String= %s gesandt\n",jsonObj);
    	struct curl_slist *headers = NULL;
    	headers = curl_slist_append(headers, "Accept: application/json");
    	headers = curl_slist_append(headers, "Content-Type: application/json");
    	headers = curl_slist_append(headers, "charsets: utf-8");
        curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.100.240:3777/api/");	
      	curl_easy_setopt(curl, CURLOPT_USERPWD, "User:Pass"); 	
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
    	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj);	
        res = curl_easy_perform(curl);
         /* Check for errors */ 
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
        /* always cleanup */
        curl_easy_cleanup(curl);
      }
      curl_global_cleanup();
      printf("\n");
      return;
    }
    
    int gpio_thread (void)	//
    {
    	printf("\nGPIO-Ueberwachung-Thread gestartet\n");
    	for(;;) 
    	{
    		for(i=0;i<=7;i++)								//7Output-Ports GPIO 0-6  (7 ist 1-Wire)
    		{
    			GPIO_PIN[i][1]=digitalRead(i);			//Liest GPIO-PINs in Array
    			if (GPIO_PIN[i][2]!=GPIO_PIN[i][1]) {
    				if (GPIO_PIN[i][1]==1) var_val="true";
    				else var_val="false";
    				printf("\nGPIO-Pin hat sich geaendert GPIO_%d=%d -> senden\n",i,GPIO_PIN[i][2]);
    //				printf("\nWerteGändert: %d %d %d \n",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
    				curl_senden(GPIO_PIN[i][0],var_val);
    			}	
    			GPIO_PIN[i][2]=GPIO_PIN[i][1];
    //			printf("\nWerte: %d %d %d \n",GPIO_PIN[i][0],GPIO_PIN[i][1],GPIO_PIN[i][2]);
    		}
    	sleep(1);
    	}	
    	return 0;
    	printf("GPIO-Ueberwachung-Thread beendet\n");
    	pthread_exit((void *) 0);
    }
    
    
    
    int gpio_init(void)
    {
    	printf ("GPIO Init\n") ;
    	int n;
    	if (wiringPiSetup () == -1)  //Startet Wiring API - wichtig
    		return 1;				 //return von wiringPi
    	//Initialisierung
    	GPIO_PIN[0][0]=10468;
    	GPIO_PIN[1][0]=14413;
    	GPIO_PIN[2][0]=10402;
    	GPIO_PIN[3][0]=58587;
    	GPIO_PIN[4][0]=51601;
    	GPIO_PIN[5][0]=38235;
    	GPIO_PIN[6][0]=41525;
    	GPIO_PIN[7][0]=38291;
    	for(n=0;n<=7;n++) pinMode(n, OUTPUT);	
    	return 1;
    }	
    
    int main(void)
    {
    	gpio_init();
    	printf( "Raspi-Symcon-Dienst gestartet ....\n");
    	//
    
    	if(pthread_create(&t1, NULL, (void *)&gpio_thread,NULL) != 0)
    	{
    	  fprintf(stderr, "Fehler bei gpio_thread 1....\n");
    	  exit(0);
    	}
    	for(;;);
      return 0;
    }

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

    Hi,

    wie in meinem Beitrag vorher, ganz unten:

    PHP-Code:
    for(;;) 
        {
            
    delay(1500);    //ohne delay Prozessorleistung 100%
        

    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,

  7. #17
    Registriert seit
    Aug 2013
    Beiträge
    132

    Zitat Zitat von herbertf Beitrag anzeigen
    Hallo,

    nachdem hier (http://www.ip-symcon.de/forum/thread...-GPIOs-geplant) 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

    Hi,

    hab mich heut mal an die Arbeit gemacht die GPIO´s zum leben zu erwecken...
    Habe IPS auf einem Raspberry Pi installiert, muß man bei deinem erstem Skript irgend etwas anpassen?
    Bei mir schaltet er den Ausgang nicht durch, wenn ich den Befehl direkt im Raspi eingebe dann funzt es.

    Gruß Stefan
    IPS 4.3 Professional | Siemens S7-300 | IBH-Link | RaspberryPi | Arduino Mega 2560 | Arduino Nano | WeMos Mini | MQTT | sonoff | gosund

  8. #18
    Registriert seit
    Jun 2011
    Ort
    Thüringen
    Beiträge
    1,339

    Hi Stefan,

    hast Du folgendes schon getan?

    //Voraussetzungen:
    //Falls noch nicht erfolgt wiringPI installieren
    //http://wiringpi.com/download-and-install/
    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,

  9. #19
    Registriert seit
    Aug 2013
    Beiträge
    132

    Zitat Zitat von herbertf Beitrag anzeigen
    Hi Stefan,

    hast Du folgendes schon getan?



    herbertf
    Hi,
    ja das hab ich gemacht das funktioniert auch, hab das so geschrieben jetzt geht's.

    Code:
    shell_exec("/usr/local/bin/gpio -g write 17 1");
    Dann hätte ich aber doch noch eine Frage zu auslesen de Temperaturfühlers, da gibt er bei mir nen Fehler raus

    Variable #19624 does not exist in /usr/share/symcon/scripts/16365.ips.php on line 20

    kannst mir da sagen was ich da falsch gemacht habe?

    Gruß Stefan
    Geändert von Stefan W (20.12.14 um 21:37 Uhr)
    IPS 4.3 Professional | Siemens S7-300 | IBH-Link | RaspberryPi | Arduino Mega 2560 | Arduino Nano | WeMos Mini | MQTT | sonoff | gosund

  10. #20
    Registriert seit
    Aug 2013
    Beiträge
    132

    Zitat Zitat von herbertf Beitrag anzeigen
    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

    Hi,
    ist der Anhang nicht mehr Online?
    Danke

    Gruß
    Stefan
    IPS 4.3 Professional | Siemens S7-300 | IBH-Link | RaspberryPi | Arduino Mega 2560 | Arduino Nano | WeMos Mini | MQTT | sonoff | gosund

Ä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