FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: chunter1 am 16 Dezember 2015, 13:17:20

Titel: 3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: chunter1 am 16 Dezember 2015, 13:17:20
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 (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.
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: FNIK am 05 Januar 2016, 12:30:12
Hallo Gemeinde,
Ich wäre auch an dieser Lösung für den Intuition-LC interessiert.
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: chunter1 am 05 Januar 2016, 14:58:21
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, "<");
}
  }
}




Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: FNIK am 13 Juni 2016, 10:47:08
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: FNIK am 27 Januar 2018, 13:44:20
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: chunter1 am 27 Januar 2018, 22:12:12
Hallo FNIK,
keine Neuigkeiten oder Modul von meiner Seite.
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 22 Juli 2018, 22:30:05
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 12 August 2018, 01:06:27
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag 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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 14 August 2018, 15:25:43
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 ;)
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag 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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 21 August 2018, 07:23:26
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

Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 28 September 2018, 21:13:52
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 19 Oktober 2018, 12:40:49
Geht bei Euch das myOwl noch? Bei mir leider nicht... Es steht zwar "Sending to FHEM.." aber ankommen tut nix.. 
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 26 Dezember 2018, 20:20:50
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 05 Februar 2022, 23:20:45
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: chunter1 am 06 Februar 2022, 00:19:35
Zahlst du denn für den jetzt kostenpflichtigen Dienst?
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 06 Februar 2022, 10:12:34
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
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 06 Februar 2022, 13:43:51
Wie könnte ich dem Fehler auf die Schliche kommen? Danke für Anregungen..
Titel: Antw:3-Phasen Energymonitor OWL intuition-lc über LAN in FHEM integrieren
Beitrag von: choetzu am 10 Februar 2022, 19:27:42
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, "<");
}
  }
}