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);
}
}
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
Danke!!!
Den Tip hab ich gesucht ;)
Funktioniert einwandfrei.
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
Hast Du telnet mit Port 7072 global in Fhem definiert.
Grüße Jörg
hallo,
wenn ich unter telnet nachschaue, steht dort dev 7072 global. Ich wüde daher sagen ja.
Gruss
Rainer
Nun, dann kann das: perl /opt/fhem/fhem.pl 7072 "setreading test state off" ja nicht funktionieren, da dort 7072 steht.
hatt mich verschrieben, schon berichtigt.
Gruss
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
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
Super, das wars.
danke
Gruss Rainer