Daten aus C-Programm an FHEM übergeben - WIE?

Begonnen von chunter1, 05 Januar 2016, 09:26:10

Vorheriges Thema - Nächstes Thema

chunter1

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

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

chunter1

Danke!!!
Den Tip hab ich gesucht  ;)
Funktioniert einwandfrei.

perry

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

JoWiemann

Hast Du telnet mit Port 7072 global in Fhem definiert.

Grüße Jörg

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

perry

hallo,

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

Gruss
Rainer

JoWiemann

Nun, dann kann das: perl /opt/fhem/fhem.pl 7072 "setreading  test state off" ja nicht funktionieren, da dort 7072 steht.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

perry

hatt mich verschrieben, schon berichtigt.

Gruss

perry

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

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

perry