3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren

Begonnen von chunter1, 16 Dezember 2015, 13:17:20

Vorheriges Thema - Nächstes Thema

choetzu

Hallo

geht bei Euch das Modul noch? Sprich schreibt es immer noch ins Dummy myOWL Readings? Bei mir seit November nicht mehr.
Wenn ich owl3fhem am Terminal ausführe, scheint alles i.O. zu sein.

socket opened
same port on multiple sockets ok
destination address set
bind to receive address ok


Der Datei habe ich 755 Rechte gegeben... Keine Ahnung wieso es plötzlich nicht mehr geht.

Ihr?

Lg C
Raspi3, EnOcean, Zwave, Homematic

chunter1

#16
Zahlst du denn für den jetzt kostenpflichtigen Dienst?

choetzu

Hey chunter1
danke. Nein, das habe ich natürlich nicht ;) Ich habe das sofort gemacht, und des geht trotzdem nicht.. Also es kommen keine aktuellen Daten an. Auf OwlIntuition.com klappts jedoch.
Komisch.
Lg c
Raspi3, EnOcean, Zwave, Homematic

choetzu

Wie könnte ich dem Fehler auf die Schliche kommen? Danke für Anregungen..
Raspi3, EnOcean, Zwave, Homematic

choetzu

Ich bin weiter auf Fehlersuche. Ich habe das unten stehende Script resp. die owl2fhem Datei auf einem alten Raspi probiert und da hat es ohne Problem die Daten ins Dummy myOWL geschrieben. Jedoch auf dem aktuellen Raspi scheint es nciht zu gehen, seit November. Kann es sein, dass der Raspi irgendwas blockt?

Bei mir hört das Script hier auf:
socket opened
same port on multiple sockets ok
destination address set
bind to receive address ok
join multicast group ok


Es kommt nicht weiter. Während es korrekterweise dann noch
OWL multicast packet received
Sending data to FHEM


stehen sollte. Aber mein Raspi blockt irgendwas. Erkennt jemand am Code was das sein könnte resp. warum es nicht weiter geht.? Danke.

hier nochmals der Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define HELLO_PORT 22600
#define HELLO_GROUP "224.192.32.19"
#define MSGBUFSIZE 2000

main(int argc, char *argv[])
{
  char perlCmd[] = "perl /opt/fhem/fhem.pl 7072";
 
  struct sockaddr_in addr;
  int fd, nbytes,addrlen;
  struct ip_mreq mreq;
  char msgbuf[MSGBUFSIZE];

  char *ptr;
  char *ptr2;
  int channel = 0;
  char txt[100];
  char msgFHEM[100 * 20];

 
  u_int yes=1;            /*** MODIFICATION TO ORIGINAL */

  /* create what looks like an ordinary UDP socket */
  if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
    perror("socket");
    exit(1);
  }
  printf("socket opened\n");


  /**** MODIFICATION TO ORIGINAL */
  /* allow multiple sockets to use the same PORT number */
  if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {
    perror("Reusing ADDR failed");
    exit(1);
  }
  /*** END OF MODIFICATION TO ORIGINAL */
  printf("same port on multiple sockets ok\n");
 
  /* set up destination address */
  memset(&addr,0,sizeof(addr));
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */
  addr.sin_port=htons(HELLO_PORT);
 
  printf("destination address set\n");
     
  /* bind to receive address */
  if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
    perror("bind");
    exit(1);
  }
 
  printf("bind to receive address ok\n");
     
  /* use setsockopt() to request that the kernel join a multicast group */
  mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);
  mreq.imr_interface.s_addr=htonl(INADDR_ANY);
  if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {
    perror("setsockopt");
    exit(1);
  }
 
  printf("join multicast group ok\n");
 
  /* now just enter a read-print loop */
  while (1)
  {
    addrlen = sizeof(addr);

    if ((nbytes = recvfrom(fd,msgbuf,MSGBUFSIZE,0,(struct sockaddr *) &addr,&addrlen)) < 0)
{
      perror("recvfrom");
      exit(1);
    }

printf("OWL multicast packet received\n");
    msgbuf[nbytes] = 0x00; // null terminate before printing
    //puts(msgbuf); // print raw data received

ptr = strtok(msgbuf, "<");

while(ptr != NULL)
{
//printf("Abschnitt gefunden: %s\n", ptr);

// check for channel-id tag
if (strncmp(ptr, "chan id=", strlen("chan id=")) == 0)
{
channel = (ptr[9] - '0');
//printf("found channel %i tag\n", channel);

if (channel == 0)
{
msgFHEM[0] = 0;
strcpy(msgFHEM, perlCmd);
}
} else if (strncmp(ptr, "/electricity", strlen("/electricity")) == 0)
{
printf("Sending data to FHEM\n");
//printf("%s\n", msgFHEM);
system(msgFHEM);
} else if (channel < 3)
{
if (strncmp(ptr, "curr ", strlen("curr ")) == 0)
{
//printf("found curr data\n");
ptr2 = strchr(ptr, '>');
ptr2++; // discard first char '>'

if (strlen(ptr2) > 0)
{
sprintf(txt, " \"setreading myOWL powerCurr%i %s\"", channel, ptr2);
//printf("%s\n", txt);
strcat(msgFHEM, txt);
}
} else if ((channel < 3) && (strncmp(ptr, "day ", strlen("day ")) == 0))
{
//printf("found day data\n");
ptr2 = strchr(ptr, '>');
ptr2++; // discard first char '>'

if (strlen(ptr2) > 0)
{
sprintf(txt, " \"setreading myOWL powerDay%i %s\"", channel, ptr2);
//printf("%s\n", txt);
strcat(msgFHEM, txt);
}
}
}

ptr = strtok(NULL, "<");
}
  }
}

Raspi3, EnOcean, Zwave, Homematic