FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: chunter1 am 05 Januar 2016, 09:26:10

Titel: Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: chunter1 am 05 Januar 2016, 09:26:10
Hallo,

kann mir wer einen Tip geben wie sich am einfachsten Daten aus einem C-Programm an FHEM übergeben lassen?
Das C-Programm läuft auf dem selben Raspberry wie FHEM.

Hintergrund ist der, dass ich einen 3-Phasen Energy Monitor von OWL (Intuition-lc) besitze und die Daten die im folgenden Demo-Code periodisch eintreffen an FHEM übergeben möchte.


/*
* listener.c -- joins a multicast group and echoes all data it receives from
*the group to its stdout...
*
* Antony Courtney,25/11/94
* Modified by: Frdric Bastien (25/03/04)
* to compile without warning and work correctly
*/

#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[])
{
  struct sockaddr_in addr;
  int fd, nbytes,addrlen;
  struct ip_mreq mreq;
  char msgbuf[MSGBUFSIZE];

  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);
  }


  /**** 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 */

  /* 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);
     
  /* bind to receive address */
  if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
    perror("bind");
    exit(1);
  }
     
  /* 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);
  }

  /* 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);
    }
    msgbuf[nbytes] = 0x00; // null terminate before printing
    puts(msgbuf);
  }
}
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: JoWiemann am 05 Januar 2016, 10:58:59
Hallo,

über einen Systemaufruf kannst Du über: perl /opt/fhem/fhem.pl 7072 befehl Fhem "fernsteuern". Du könntest also einen Dummy-Device definieren und diesem dann über: perl opt/fhem/fhem.pl 7072 "setreading <Dein Dummy> <reading> <Deine Daten>" die Daten an das Device übergeben.

Grüße Jörg
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: chunter1 am 05 Januar 2016, 11:11:31
Danke!!!
Den Tip hab ich gesucht  ;)
Funktioniert einwandfrei.
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: perry am 01 Februar 2016, 20:19:26
Hallo,

genau so eine Lösung suche ich. Leider funktioniert bei mir die obige Vorgehensweise nicht. Was kann ich falsch gemacht haben?

Folgendes habe ich gemacht:

device test dummy
set test webcmd on:off

das state auf on gesetzt

Von der Unix Console meines Raspi habe ich dann
perl /opt/fhem/fhem.pl 7072 "setreading  test state off"
eingegeben.
Weder auf der Console noch im Log File von fhem erfolgt irgendeine Reaktion. Der state Wert bleibt auf on.

Vielleicht verstehe ich auch etwas komplett falsch. Ich möchte aus einem C Programm in dem aus den Gesamtverbrauchswerten die einzelnen Strom Verbraucher errechnet werden, die aktiven Verbraucher z.b. Deckenlicht unter Fhem über ein dummy device als on anzeigen.

Ich hoffe mir kann einer helfen. Schon mal vielen Dank.

Gruss Rainer
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: JoWiemann am 01 Februar 2016, 20:22:50
Hast Du telnet mit Port 7072 global in Fhem definiert.

Grüße Jörg

Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: perry am 01 Februar 2016, 20:27:34
hallo,

wenn ich unter telnet nachschaue, steht dort dev 7072 global. Ich wüde daher sagen ja.

Gruss
Rainer
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: JoWiemann am 01 Februar 2016, 20:29:01
Nun, dann kann das: perl /opt/fhem/fhem.pl 7072 "setreading  test state off" ja nicht funktionieren, da dort 7072 steht.
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: perry am 01 Februar 2016, 20:30:48
hatt mich verschrieben, schon berichtigt.

Gruss
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: perry am 01 Februar 2016, 20:35:14
hallo,

mir ist bei dem telnet device aufgefallen, dass ich in der Vergangenheit ein Passwort erfasst habe. kann es daran liegen ? wenn ja reicht es dieses einfach zu löschen ?

Gruss Rainer
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: JoWiemann am 01 Februar 2016, 20:40:06
Ja, löschen sollte ausreichen. Ansonsten muss das Passwort bei Aufruf mitgegeben werden.

perl /opt/fhem/fhem.pl 7072 <Passwort> usw.

Grüße Jörg
Titel: Antw:Daten aus C-Programm an FHEM übergeben - WIE?
Beitrag von: perry am 01 Februar 2016, 20:52:37
Super, das wars.

danke

Gruss Rainer