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

chunter1

Hi,

ich würde gerne den 3-Phasen Energiemonitor OWL intuition-lc mit dem Network OWL via LAN an FHEM anbinden.
Soweit ich weiß gibts dafür noch kein Modul?

Infos zum Protokoll und API liefert OWL direkt hier:
https://theowl.zendesk.com/hc/en-gb/articles/201284603-Multicast-UDP-API-Information

Die zyklisch gemulticasteten Daten im XML Format erhält man z.B. via Multicast Adresse 224.192.32.19 und Port 22600.

Demo C-source code gibts hier:
https://theowl.zendesk.com/hc/en-gb/article_attachments/202785289/intuition-listener.c


Möchte  kurz fragen, ob sowas leicht zu integrieren ist und obs sowas wie ein HowTo für die Integration eigener Module in FHEM gibt.

FNIK

Hallo Gemeinde,
Ich wäre auch an dieser Lösung für den Intuition-LC interessiert.

chunter1

Hier mal eine einfache quick & dirty Lösung um die Daten vom OWL intuition-lc in FHEM zu bekommen.

Anleitung:
1.) In FHEM einen Dummy namens "myOWL" anlegen ("define myOWL dummy")
2.) Auf einer Linux-Konsole das Programm "owl2fhem" starten

Im Dummy erscheinen dann nach dem Empfang der Daten folgende Readings:

powerCurr0 ... aktuelle Leistung in W auf Phase 1
powerCurr1 ... aktuelle Leistung in W auf Phase 2
powerCurr2 ... aktuelle Leistung in W auf Phase 3
powerDay0 ... Tagesleistung in Wh auf Phase 1
powerDay1 ... Tagesleistung in Wh auf Phase 2
powerDay2 ... Tagesleistung in Wh auf Phase 3

Anbei das kompilierte Programm und der Quellcode.

Bin leider kein Programmierer daher ist der Code nicht grade schön.
Hoffe aber, dass ein insider evtl. mal ein sauberes FHEM-Modul draus macht ;)

Viel Spaß!


#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, "<");
}
  }
}





FNIK

Hallo Chunter1,
Ich habe das script nun endlich seit heute laufen. Bis jetzt funktioniert es prima und es sammelt die Daten. Vielen Dank für Deine Mühe.
FNIK

FNIK

Hallo Chunter1,

Gibt es schon Neuigkeiten oder gar Aktivitäten für ein Modul? Ich habe nun auf eine Intel Plattform umgestellt und nun läuft das Script nicht mehr.
FNIK

chunter1


choetzu

Hallo chunter1
ich versuche grad dein Script zu starten. Dazu habe ich die Datei auf /opt/fhem/owl2fhem.dms geladen und ausgeführt (zuerst natürlich Dummy erstellt). Ich komme nie weiter als so:

pi@Raspi1:~ $ sudo /opt/fhem/owl2fhem.dms
socket opened
same port on multiple sockets ok
destination address set
bind to receive address ok
join multicast group ok


Das Script beendet nicht.. und auch im Dummy sind keine Readings angekommen.

Wo liegt der Hacken?

Lg c
Raspi3, EnOcean, Zwave, Homematic

choetzu

Geht nun bei mir auch! Wieso auch immer :)

Frage, wie löst ihr das? Ich möchte das script alle 15min automatisch aufrufen und dann wieder schliessen, sobald die Daten übertragen wurden.

Lg c
Raspi3, EnOcean, Zwave, Homematic

FNIK

Hallo Choetzu!

Ich hatte owl2fhem mit Systemstart als Dienst gestartet und es hat fast 2 Jahre fleißig Daten gesammelt. Das Scipt lief also immer.
Nun habe ich meine Hardware aufgerüstet und bin nun auch bei Ubuntu 16.04. Hier läuft das Scipt nicht mehr. [32bit --> 64 bit BS]???

owl2fhem: Syntax error: word unexpected (expecting ")")

@Chunter1: Würdest Du bitte noch einmal Hand anlegen und Deine super "quick&dirthy" Lösung auf den Stand der Zeit bringen ;)
Ich denke es wären Dir einige User denkbar, bedenkt man, dass ein RFXcom fast 100€ kostet.
VG FNIK

choetzu

Zitat von: FNIK am 14 August 2018, 15:18:07
Hallo Choetzu!

Ich hatte owl2fhem mit Systemstart als Dienst gestartet und es hat fast 2 Jahre fleißig Daten gesammelt. Das Scipt lief also immer.
Nun habe ich meine Hardware aufgerüstet und bin nun auch bei Ubuntu 16.04. Hier läuft das Scipt nicht mehr. [32bit --> 64 bit BS]???

owl2fhem: Syntax error: word unexpected (expecting ")")

@Chunter1: Würdest Du bitte noch einmal Hand anlegen und Deine super "quick&dirthy" Lösung auf den Stand der Zeit bringen ;)
Ich denke es wären Dir einige User denkbar, bedenkt man, dass ein RFXcom fast 100€ kostet.
VG FNIK

danke für deine Rückmeldung. Hoffen wir mal auf dass chunter1 aktiv wird ;)

Frage: aus reiner Neugierde. Wie hast du das script beim systemstart automatisch gestartet? Ich bin da laie und möchte lernen ;)
Raspi3, EnOcean, Zwave, Homematic

FNIK

Hallo choetzu!
Schau mal bitte hier nach:
https://www.techgrube.de/tutorials/programme-unter-ubuntu-als-dienst-ausfuehren-lassen
Ich glaube besser kann man das nicht am Beispiel für Ubuntu beschreiben. Je nachdem was Du für eine Distribution für Dein BS hast, kann es ggf. abweichen.
VG FNIK

choetzu

Zitat von: FNIK am 14 August 2018, 15:18:07
Hallo Choetzu!

Ich hatte owl2fhem mit Systemstart als Dienst gestartet und es hat fast 2 Jahre fleißig Daten gesammelt. Das Scipt lief also immer.
Nun habe ich meine Hardware aufgerüstet und bin nun auch bei Ubuntu 16.04. Hier läuft das Scipt nicht mehr. [32bit --> 64 bit BS]???

owl2fhem: Syntax error: word unexpected (expecting ")")

@Chunter1: Würdest Du bitte noch einmal Hand anlegen und Deine super "quick&dirthy" Lösung auf den Stand der Zeit bringen ;)
Ich denke es wären Dir einige User denkbar, bedenkt man, dass ein RFXcom fast 100€ kostet.
VG FNIK

Hallo Fink
Danke für deine Hilfe. Da sich chunter1 nicht meldet, hast du hier evtl. einen Workaround gefunden? Das wäre wirklich super.
Lg C

Raspi3, EnOcean, Zwave, Homematic

choetzu

Zitat von: FNIK am 14 August 2018, 21:14:00
Hallo choetzu!
Schau mal bitte hier nach:
https://www.techgrube.de/tutorials/programme-unter-ubuntu-als-dienst-ausfuehren-lassen
Ich glaube besser kann man das nicht am Beispiel für Ubuntu beschreiben. Je nachdem was Du für eine Distribution für Dein BS hast, kann es ggf. abweichen.
VG FNIK

Hallo Fink,
da lese ich mich rein. Ist aber nicht ganz trivial für einen Amateur wie mich. Ich teste es jedoch. andere Frage:
wenn man das Program owl2fhem.dms auslöst, dann kann man es nur noch mit ctrl-c stoppen. Gibt es evtl. eine Möglichkeit, dass das Programm nur kurz auf FHEM hochlädt und dann wieder schliesst? Ich habe es mit dem Mac nicht geschafft, die Datei zu lesen..
Lg c
Raspi3, EnOcean, Zwave, Homematic

choetzu

Geht bei Euch das myOwl noch? Bei mir leider nicht... Es steht zwar "Sending to FHEM.." aber ankommen tut nix.. 
Raspi3, EnOcean, Zwave, Homematic

choetzu

Hallo
Ich habe rausgefunden woran es liegt. Sobald man im Fhem ein Telnet Passwort (allow_telnet) hinterlegt, gehts nicht mehr. Kann man evtl das script dahingehend ändern dass es auch mit Passwort geht? Danke

Lg c
Raspi3, EnOcean, Zwave, Homematic