Intégration sourcecode protocol OBIS IDS ( energie )

Hello,
Le Protocol OBIS IDS est un standard depuis des décennies pour une communication des compteurs énergétiques dans le monde.
Quelqu’un serait t’il capable de faire l’intégration dans jeedom du code « c » ici bas ? Je suis dispo pour les tests avec un datamanager M ( V2 du protocol ) , un Energy meter (V1 du protocol ) et des onduleurs de la même marque SMA .
D’apres shun84, il faut ajouter les dépendances pour un code C dans Jeedom :thinking:.
Merci :heart:

https://www.edi-energy.de/index.php?id=38&tx_bdew_bdew[uid]=838&tx_bdew_bdew[action]=download&tx_bdew_bdew[controller]=Dokument&cHash=a7a251b9c22a4b3fa581f0717736a8ef

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
#include <arpa/inet.h>
#include <string.h>
#include <math.h>

#define TRUE 1
#define FALSE 0

/* BEGIN OBIS */

typedef struct 
    { unsigned char sma_header[12];
          unsigned char datlen[2];
          unsigned char skip[4];
          unsigned char susy[2];
          unsigned char serno[4];
          unsigned char ticker[4];
          unsigned char channels[1500];
    } EMETER_DATA;

typedef struct
    { 
    unsigned char channel;
    unsigned char idx;
    unsigned char typ;
    unsigned char tariff;
    unsigned char value[8];
    } OBIS_TAG;


#define GETW(_a) ((((unsigned int)(_a)[0]) << 8)+ ((_a)[1]))

#define GETDW(_a) (\
                   ( GETW((unsigned char *)(_a)) << 16)\
                  + (GETW((unsigned char *)(_a)+2) ) )

static EMETER_DATA emeter_data;

#define CHNTYP_CNTR 8
#define CHNTYP_MEAS 4

static OBIS_TAG notfound={0xFF, 0xFF, 0xFF, 0xFF, 0,0,0,0,0,0,0,0}; // empty tag for notfound entries

/* END OBIS */

static void usage(char *pname)
{
    printf("Usage: %s [-s serialnumber] [-l]\n", pname);
    printf("\t-s 123456789          Serial number, 0 if not needed\n");
    printf("\t-l                    Run in loop mode\n");
    printf("\t-?                    This help info\n");
    printf("\n");
}

/* BEGIN OBIS */

static unsigned char * find_tag(unsigned char * emdat, int len, unsigned char typ, unsigned char idx)
{
OBIS_TAG *dat;

    while(len > 0)
    {
        dat = (OBIS_TAG*) emdat;
        if((dat->typ == typ) && (dat->idx == idx)) // match?
            return dat->value;

        if(dat->typ == CHNTYP_CNTR) // counters are 8 bytes long
        {
            emdat += 12;
            len   -= 12;
        }
        else                        // measurements are 4 bytes long
        {
            emdat += 8;
            len   -= 8;
        }
    
    }
    return (unsigned char*)&notfound.channel; // no match
}


static int handle_emeter_32(EMETER_DATA *emeter_data, int idx)
{
    int rawvalue;
    int           datlen = GETW(emeter_data->datlen);

    rawvalue = GETDW(find_tag( emeter_data->channels, datlen, CHNTYP_MEAS, idx)); 
    
    return rawvalue;
}

static unsigned long long handle_emeter_64(EMETER_DATA *emeter_data, int idx)
{
    unsigned long long rawvalue;
    unsigned int high, low;
    int           datlen = GETW(emeter_data->datlen);

    high = GETDW(find_tag(emeter_data->channels, datlen, CHNTYP_CNTR, idx));
    low = GETDW(4 + find_tag(emeter_data->channels, datlen, CHNTYP_CNTR, idx));
    rawvalue = (unsigned long long) high << 32 | low;
    
    return rawvalue;
}

/* END OBIS */

int main( int argc, char *argv[])
{
    int udp_sock;
    int datalen;
    struct sockaddr_in server_address;
    struct ip_mreq group;
    int checkCall, recvStringLen;
    int serialnumber = 0;
    int loop = 0;

    /* BEGIN OBIS */
    int typ = 4;
    int idx = 1;
    int cnt = 1;
    /* END OBIS */

    int p;
    /* Start at p = 1 to skip the command name. */
    if (argc == 1) {
        usage(argv[0]);
        return EXIT_SUCCESS;
    }
    
    for (p = 1; p < argc; p++) {
        /* Check for a switch (leading "-"). */
        if (argv[p][0] == '-') {
            /* Use the next character to decide what to do. */
            switch (argv[p][1]) {
                case 's':
                    serialnumber = atoi(argv[++p]);
                    break;
                case 'l':
                    loop = 1;
                    break;
                case '?':
                    usage(argv[0]);
                    return EXIT_SUCCESS;
            }
        }
    }
    
    /* Create socket */
    udp_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if(udp_sock == -1)
        perror("Error: socket failed");
    
    int reuse = 1;
    if(setsockopt(udp_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) {
        perror("Error: setting SO_REUSEADDR");
        close(udp_sock);
        exit(1);
    }
    
    bzero((char*) &server_address, sizeof(server_address));

    /* server's sockaddr_in*/
    server_address.sin_family=AF_INET;
    server_address.sin_addr.s_addr=INADDR_ANY;
    server_address.sin_port=htons(9522);
    
    /* bind server socket and listen for incoming clients */
    checkCall = bind(udp_sock, (struct sockaddr *) &server_address, sizeof(struct sockaddr));
    if(checkCall == -1)
        perror("Error: bind call failed");
    
    /* joining multicast group */
    group.imr_multiaddr.s_addr = inet_addr("239.12.255.254");
    group.imr_interface.s_addr = htonl(INADDR_ANY);
    
    if(setsockopt(udp_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) {
        perror("Error: adding multicast group");
        close(udp_sock);
        exit(1);
    }
    
    unsigned long em_serial = 0;                                /* energy meter serial number */
    unsigned long em_timestamp = 0;                             /* energy meter utc timestamp in seconds since start */
    int em_real_pow = 0;                                        /* energy meter real power from the grid minus to the grid in W, negative means delivery */
    int em_pow_1 = 0;                                           /* energy meter real power L1 in W, negative means delivery */
    int em_pow_2 = 0;                                           /* energy meter real power L2 in W, negative means delivery */
    int em_pow_3 = 0;                                           /* energy meter real power L3 in W , negative means delivery*/
    int em_pf = 0;                                              /* energy meter power factor in 0,1 (cosphi) */    
    int em_fr = 0;                                              /* energy meter power frequency in 0,001 (Hz) */
    int em_u1 = 0;                                              /* energy meter voltage on L1 in V */
    int em_u2 = 0;                                              /* energy meter voltage on L2 in V */
    int em_u3 = 0;                                              /* energy meter voltage on L3 in V */
    int em_i1 = 0;                                              /* energy meter current on L1 in mA, negative means delivery */
    int em_i2 = 0;                                              /* energy meter current on L2 in mA, negative means delivery */
    int em_i3 = 0;                                              /* energy meter current on L3 in mA, negative means delivery */
    
    uint64_t iConsumptionHours = 0;
    uint64_t iSurplusHours = 0;
    
    //clientLength = sizeof(client_address);
    datalen = sizeof(emeter_data);
    
    while (TRUE) {

        recvStringLen = read(udp_sock, &emeter_data, datalen);

        if(recvStringLen == -1)
            perror("Error: reading datagram message");

        if (recvStringLen >= 600 && recvStringLen <= 1500) {

            if (serialnumber == 0 || serialnumber == GETDW(emeter_data.serno)) {

                /* 4 byte serial */
                em_serial = GETDW(emeter_data.serno);

                /* 4 byte sma timestamp */
                em_timestamp = GETDW(emeter_data.ticker)/1000U;

                /* 4 byte voltage / 1000 */
                em_u1 = handle_emeter_32(&emeter_data, 32)/1000;
                em_u2 = handle_emeter_32(&emeter_data, 52)/1000;
                em_u3 = handle_emeter_32(&emeter_data, 72)/1000;

                /* real power sum consumption - real power sum surplus / 10 */
                em_real_pow = (handle_emeter_32(&emeter_data, 1) - handle_emeter_32(&emeter_data, 2))/10;

                /* 4 byte real real power on L1 */
                em_pow_1 = (handle_emeter_32(&emeter_data, 21) - handle_emeter_32(&emeter_data, 22))/10;
                
                /* 4 byte real real power on L2 */
                em_pow_2 = (handle_emeter_32(&emeter_data, 41) - handle_emeter_32(&emeter_data, 42))/10;
                
                /* 4 byte real real power on L3 */
                em_pow_3 = (handle_emeter_32(&emeter_data, 61) - handle_emeter_32(&emeter_data, 62))/10;

                /* 4 byte real current */
                em_i1 = handle_emeter_32(&emeter_data, 31);
                
                /* 4 byte real current */
                em_i2 = handle_emeter_32(&emeter_data, 51);
                
                /* 4 byte real current */
                em_i3 = handle_emeter_32(&emeter_data, 71);

                /* 4 byte sum power factor all phases */
                em_pf = handle_emeter_32(&emeter_data, 13);

                /* 8 byte consumption hours */
                iConsumptionHours = handle_emeter_64(&emeter_data, 1);

                /* 8 byte surplus hours */
                iSurplusHours = handle_emeter_64(&emeter_data, 2);

                if (recvStringLen > 600) {
                    /* 4 byte sum frequency all phases */
                    em_fr = handle_emeter_32(&emeter_data, 14);
                }

                fprintf(stdout, "SN:%lu; TS:%lu; U1:%d; U2:%d; U3:%d; I1:%d; I2:%d; I3:%d; P:%d; P1:%d; P2:%d; P3:%d; PF:%.3f; FR:%.1f; CON:%.1f; SUR:%.1f\n", em_serial, em_timestamp, em_u1, em_u2, em_u3, em_i1, em_i2, em_i3, em_real_pow, em_pow_1, em_pow_2, em_pow_3, (float)em_pf/1000.0, (float)em_fr/1000.0, (float)iConsumptionHours/3600.0/1000.0, (float)iSurplusHours/3600.0/1000.0);
                fflush(stdout);

                if (loop == FALSE)
                    break;

            }

        }

    }
    
    close(udp_sock);
    
}

/* OBIS Kennzahlen 

Die folgende Tabelle gibt eine Übersicht der Messkanäle und deren Definition:

ID		Aktueller Mittelwert	Zählerstand			Beschreibung
		4-byte					8-byte
Summen
1 		1:1.4.0 				1:1.8.0 			Wirkleistung/-arbeit +
2 		1:2.4.0 				1:2.8.0 			Wirkleistung/-arbeit −
3 		1:3.4.0 				1:3.8.0 			Blindleistung/-arbeit +
4 		1:4.4.0 				1:4.8.0 			Blindleistung/-arbeit −
9 		1:9.4.0 				1:9.8.0 			Scheinleistung/-arbeit +
10 		1:10.4.0 				1:10.8.0 			Scheinleistung/-arbeit −
13 		1:13.4.0									Leistungsfaktor
14		1:14.4.0									Netzfrequenz				(erst ab 608 Byte Datagramm verfügbar, FW HM20: >=2.03.4.R)
Phase 1
21 		1:21.4.0 				1:21.8.0 			Wirkleistung/-arbeit +
22 		1:22.4.0 				1:22.8.0 			Wirkleistung/-arbeit −
23 		1:23.4.0 				1:23.8.0 			Blindleistung/-arbeit +
24 		1:24.4.0 				1:24.8.0 			Blindleistung/-arbeit −
29 		1:29.4.0 				1:29.8.0 			Scheinleistung/-arbeit +
30 		1:30.4.0 				1:30.8.0 			Scheinleistung/-arbeit −
31 		1:31.4.0									Strom
32 		1:32.4.0									Spannung
Phase 2
41 		1:41.4.0 				1:41.8.0 			Wirkleistung/-arbeit +
42 		1:42.4.0 				1:42.8.0 			Wirkleistung/-arbeit −
43 		1:43.4.0 				1:43.8.0 			Blindleistung/-arbeit +
44 		1:44.4.0 				1:44.8.0 			Blindleistung/-arbeit −
49 		1:49.4.0 				1:49.8.0 			Scheinleistung/-arbeit +
50 		1:50.4.0 				1:50.8.0 			Scheinleistung/-arbeit −
51 		1:51.4.0									Strom
52 		1:52.4.0 									Spannung
Phase 3
61 		1:61.4.0 				1:61.8.0 			Wirkleistung/-arbeit +
62 		1:62.4.0 				1:62.8.0 			Wirkleistung/-arbeit −
63 		1:63.4.0 				1:63.8.0 			Blindleistung/-arbeit +
64 		1:64.4.0 				1:64.8.0 			Blindleistung/-arbeit −
69 		1:69.4.0 				1:69.8.0 			Scheinleistung/-arbeit +
70 		1:70.4.0 				1:70.8.0 			Scheinleistung/-arbeit −
71 		1:71.4.0									Strom
72 		1:72.4.0									Spannung
Sonstige
127 	144:0.0.0									Softwareversion (4 Byte)

*/

https://www.sma.de/fr/produits/sma-developer.html

https://www.sma.de/fileadmin/content/global/Partner/Documents/sma_developer/SpeedwireDD-TI-de-10.pdf

https://www.sma.de/fileadmin/content/global/Partner/Documents/SMA_Labs/EMETER-Protokoll-TI-en-10.pdf

Richard Barkestam=> The communication with the Inverter is via TCP on port 502. Your homey will connect and pull information from the inverter.
The communication from EnergyMeter/HomeManager is based on UDP multicast where the EnergyMeter once per second pushes out the current values. In this case, the only thing the app does is open a local socket on your Homey on port 9522 and multicast address 239.12.255.254. Assuming your Homey is able to receive UDP multicast from your EnergyMeter it should work since it is a quite simple and stable setup.
When you add the inverter to your Homey, is the SMA app able to auto-discover it for you or do you have to add it by entering the IP address of it? If the latter, then it would confirm that UDP multicast is blocked in your local network. The discovery of SMA devices is also based on UDP multicast, they call it Speedwire.
No clue I’m afraid if any of this code would work on Solaredge. I guess the foundation of the app would work, like the modbus communication and structure for supporting different inverters which require the use of different modbus registry addresses. But since SMA isn’t using these modbus registry addresses consistently across their product families I would be surprised if it would work across to a different brand.

Bonjour,

Trop de liens et je ne comprends pas toujours le rapport avec ton sujet…
En tout cas, si le 1er lien fonctionne tu a gagné: c’est un demon python à paramétrer et il a une option MQTT donc il te suffira d’installer / paramétrer le plugin jmqtt pour avoir tes infos :slight_smile:

Par ailleurs je ne connais rien au C, j’ai arrêté l’allement au lycée et tes docs sont en allemand autant dire que ça n’aide pas des masses et heu… Lequel des 5 repo de Sattaz a retenu ton attention?

1 « J'aime »

Merci pr ta réponse . Oui, les liens après le code source « c » n’a pas avoir avec la demande . Les liens utilisent un autre protocol pour la communication . Mais les infos permettent de mieux comprendre le code source « c » .
Non , c est malheureusement le code " C " qui commence par

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

Qu’il faut intégrer à jeedom. .
Contrairement aux autres liens ( qui utilisent modbus et mqtt et ou ? ) , le code source en « c » utilise le Protocol OBIS . C’est le OBIS qui permet d’être compatible avec toutes les versions de matériel énergétique et toutes les version sma . Aussi bien les vielles que les nouvelles .

Tu devrais quand même tester le SMA-EM, tu a un objet OBIS sous la main? il est dit dans le readme que ça marche:

HINT

Sma homemanager version 2.3.4R added 8 Byte of measurement data.
This version trys to detect the measurement values on obis ids, so it should be save if new values were added or removed.

Merci pr ton aide, oui , j ai 2 objets " objet OBIS " sur le réseau de jeedom .
J’avance dans le tuto , il a un moment, il demande :

sudo ip route add 224.0.0.0/4 dev interfacename

Mais a quoi cela sert ? Dois je le personnalisé ?

« Edit the /etc/smaemd/config file and customize it to suit your needs (e.g. set SMA energy meter serial number, IP address, enable features) »
=> je dois changer le serial number , je le vois a la 4 ieme ligne ( ou la 26 ? ) " serials=30028xxxxx " ( moi c’est « 19002007XX " pour le emeter . C’est un peux étrange , mais c est aussi 10 chiffres . et j ai " 30011813XX » pour le datamanager M
=> Pour l’IP et " enable features" peux tu me dire c’est quelle ligne ?
C 'est " ipbind=0.0.0.0 " ?? as ton avis ?
«  » enable features »" ??


[SMA-EM]
# serials of sma-ems the daemon should take notice
# separated by space
serials=30028xxxxx
# features could filter serials to, but wouldn't see serials if these serials was not defines in SMA-EM serials
# list of features to load/run
#features=simplefswriter sample pvdata ediplugs mqtt remotedebug symcon influxdb
features=simplefswriter

[DAEMON]
pidfile=/run/smaemd.pid
# listen on an interface with the given ip
# use 0.0.0.0 for any interface
ipbind=0.0.0.0
# multicast ip and port of sma-datagrams
# defaults
mcastgrp=239.12.255.254
mcastport=9522
statusdir=

# each feature/plugin has its own section
# called FEATURE-[featurename]
# the feature section is required if a feature is listed in [SMA-EM]features

[FEATURE-simplefswriter]
# list serials simplefswriter notice
serials=30028xxxxx
# measurement vars simplefswriter should write to filesystem (only from smas with serial in serials)
values=pconsume psupply qsupply ssupply
statusdir=

[FEATURE-sample]
nothing=here

[FEATURE-mqtt]
# MQTT broker details
#mqtthost=::1
mqtthost=mqtt
mqttport=1883
#mqttuser=
#mqttpass=

#The following list contains all possible field names that you can use with
#the features mqtt, symcon, influxdb
#  prefix:  p=real power, q=reactive power, s=apparent power, i=current, u=voltage
#  postfix: unit=the unit of the item, e.g. W, VA, VAr, Hz, A, V, kWh, kVArh, kVAh ...
#  postfix: counter=energy value (kWh, kVArh, kVAh)
#           without postfix counter=>power value (W, VAr, VA)
#mqttfields=pconsume,  pconsumeunit, pconsumecounter, pconsumecounterunit,
#           psupply,   psupplyunit,  psupplycounter,  psupplycounterunit,
#           qconsume,  qconsumeunit, qconsumecounter, qconsumecounterunit,
#           qsupply,   qsupplyunit,  qsupplycounter,  qsupplycounterunit,
#           sconsume,  sconsumeunit, sconsumecounter, sconsumecounterunit,
#           ssupply,   ssupplyunit,  ssupplycounter,  ssupplycounterunit,
#           cosphi,    cosphiunit,
#           frequency, frequencyunit,
#           p1consume, p1consumeunit, p1consumecounter, p1consumecounterunit,
#           p1supply,  p1supplyunit,  p1supplycounter,  p1supplycounterunit, 
#           q1consume, q1consumeunit, q1consumecounter, q1consumecounterunit, 
#           q1supply,  q1supplyunit,  q1supplycounter,  q1supplycounterunit, 
#           s1consume, s1consumeunit, s1consumecounter, s1consumecounterunit, 
#           s1supply,  s1supplyunit,  s1supplycounter,  s1supplycounterunit, 
#           i1,        i1unit,
#           u1,        u1unit,
#           cosphi1,   cosphi1unit,
#           p2consume, p2consumeunit, p2consumecounter, p2consumecounterunit,
#           p2supply,  p2supplyunit,  p2supplycounter,  p2supplycounterunit, 
#           q2consume, q2consumeunit, q2consumecounter, q2consumecounterunit, 
#           q2supply,  q2supplyunit,  q2supplycounter,  q2supplycounterunit, 
#           s2consume, s2consumeunit, s2consumecounter, s2consumecounterunit, 
#           s2supply,  s2supplyunit,  s2supplycounter,  s2supplycounterunit, 
#           i2,        i2unit,
#           u2,        u2unit,
#           cosphi2,   cosphi2unit,
#           p3consume, p3consumeunit, p3consumecounter, p3consumecounterunit,
#           p3supply,  p3supplyunit,  p3supplycounter,  p3supplycounterunit, 
#           q3consume, q3consumeunit, q3consumecounter, q3consumecounterunit, 
#           q3supply,  q3supplyunit,  q3supplycounter,  q3supplycounterunit, 
#           s3consume, s3consumeunit, s3consumecounter, s3consumecounterunit, 
#           s3supply,  s3supplyunit,  s3supplycounter,  s3supplycounterunit, 
#           i3,        i3unit,
#           u3,        u3unit,
#           cosphi3,   cosphi3unit,
#           speedwire-version
mqttfields=pconsume,pconsumecounter,psupply,psupplycounter
#topic will be exteded with serial
mqtttopic=SMA-EM/status
pvtopic=SMA-PV/status
# publish all values as single topics (0 or 1)
publish_single=1
# How frequently to send updates over (defaults to 20 sec)
min_update=5
#debug output
debug=0

# ssl support
# adopt mqttport above to your ssl enabled mqtt port, usually 8883
# options:
# activate without certs=use tls_insecure
# activate with ca_file, but without client_certs
ssl_activate=0
# ca file to verify
ssl_ca_file=ca.crt
# client certs
ssl_certfile=
ssl_keyfile=
#TLSv1.1 or TLSv1.2 (default 2)
tls_protocol=2


[FEATURE-remotedebug]
# Debug settings
debughost=mypc
debugport=9100

[FEATURE-symcon]
# symcon
host=ips
port=3777
timeout=5
user=Symcon
password=SMA-EMdata

#A list of possible field names can be found above under FEATURE-mqtt
fields=pconsume,psupply,p1consume,p2consume,p3consume,p1supply,p2supply,p3supply,psupplycounter,pconsumecounter
emhook=/hook/smaem
pvfields=AC Power,grid frequency,DC input voltage,daily yield,total yield,Power L1,Power L2,Power L3,Status
pvhook=/hook/smawr

# How frequently to send updates over (defaults to 20 sec)
min_update=30

debug=0

[FEATURE-influxdb]
# influx
host=influxdb
port=8086
ssl=
db=SMA

timeout=5
user=
password=
# How frequently to send updates over (defaults to 20 sec)
min_update=30

debug=0
#emdata
measurement=SMAEM

#A list of possible field names can be found above under FEATURE-mqtt
fields=pconsume,psupply,p1consume,p2consume,p3consume,p1supply,p2supply,p3supply

[FEATURE-influxdb2]
debug=0
url=hostname.tld
token=long_token
org=org_name
bucket=bucket_name
measurement=SMAEM
fields=pconsume,psupply,p1consume,p2consume,p3consume,p1supply,p2supply,p3supply
#pvdata
pvmeasurement=SMAWR
pvvields=AC Power,AC Voltage,grid frequency,DC Power,DC input voltage,daily yield,total yield
# How frequently to send updates over (defaults to 20 sec)
min_update=30

#pvdata
pvmeasurement=SMAWR
pvfields=AC Power,grid frequency,DC input voltage,daily yield,total yield,Power L1,Power L2,Power L3

#ediplugs
edimeasurement=edimax

[FEATURE-pvdata]
#Reads data from SMA inverter via Modbus.
#Enable the mqtt feature to publish the data to a mqtt broker (features=pvdata mqtt),
#and/or stored the data to a influx database (features=pvdata influxdb), and/or symcom ...

# How frequently to send updates over (defaults to 20 sec)
min_update=5
# debug output
debug=0

# inverter connection
# ['host', 'port', 'modbus_id', 'manufacturer']
inverters = [
    ['<inverter-ip>', '502', '3', 'SMA'],
    ['<inverter-ip>', '502', '3', 'SMA']
    ]

# For Modbus registers, see e.g. https://www.google.com/search?q=SMA_Modbus-TI-en-23.xlsx
# ['Modbus register address', 'Type', 'Format', 'Name', 'Unit']
# If the mqtt feature is used, 'Name' is included in the MQTT JSON payload as tag name.
registers = [
# Don't change names in this section as they are used by some features/*.py files
# Alternatives for AC Power & daily yield in MQTT: 'SMA-EM/status/30028xxxxx/pvsum' & 'SMA-EM/status/30028xxxxx/pvdaily'
# Also note that the daily yield register is broken for some inverters
    ['30057', 'U32', 'RAW', 'serial', ''],
    ['30201', 'U32', 'ENUM', 'Status',''],
    ['30051', 'U32', 'ENUM', 'DeviceClass',''],
    ['30053', 'U32', 'ENUM', 'DeviceID',''],
#    ['40631', 'STR32', 'UTF8', 'Device_Name', ''],
    ['30775', 'S32', 'FIX0', 'AC Power', 'W'],
    ['30517', 'U64', 'FIX3', 'daily yield', 'kWh'],
#################################################### 
#    ['30813', 'S32', 'FIX0', 'AC_Power_Apparent', 'VA'],
    ['30977', 'S32', 'FIX3', 'AC_Current', 'A'],
#    ['30783', 'S32', 'FIX2', 'AC_Voltage_L1', 'V'],
#    ['30785', 'S32', 'FIX2', 'AC_Voltage_L2', 'V'],
#    ['30787', 'S32', 'FIX2', 'AC_Voltage_L3', 'V'],
#    ['30777', 'S32', 'FIX0', 'AC_Power_L1', 'W'],
#    ['30779', 'S32', 'FIX0', 'AC_Power_L2', 'W'],
#    ['30781', 'S32', 'FIX0', 'AC_Power_L3', 'W'],
    ['30803', 'U32', 'FIX2', 'Grid_Frequency', 'Hz'],
    ['30773', 'S32', 'FIX0', 'DC_Input1_Power', 'W'],
    ['30771', 'S32', 'FIX2', 'DC_Input1_Voltage', 'V'],
    ['30769', 'S32', 'FIX3', 'DC_Input1_Current', 'A'],
    ['30961', 'S32', 'FIX0', 'DC_Input2_Power', 'W'],
    ['30959', 'S32', 'FIX2', 'DC_Input2_Voltage', 'V'],
    ['30957', 'S32', 'FIX3', 'DC_Input2_Current', 'A'],
    ['30953', 'S32', 'FIX1', 'Device_Temperature', u'\xb0C'],
    ['30513', 'U64', 'FIX3', 'Total_Yield', 'kWh'],
    ['30521', 'U64', 'FIX0', 'Operating_Time', 's'],
    ['30525', 'U64', 'FIX0', 'Feed-in_Time', 's'],
    ['30975', 'S32', 'FIX2', 'Intermediate_Circuit_Voltage', 'V'],
    ['30225', 'S32', 'FIX0', 'Isolation_Resistance', u'\u03a9']
    ]

registers_batt = [
# Don't change names in this section as they are used by some features/*.py files
    ['30057', 'U32', 'RAW', 'serial', ''],
    ['30201', 'U32', 'ENUM', 'Status',''],
    ['30051', 'U32', 'ENUM', 'DeviceClass',''],
    ['30053', 'U32', 'ENUM', 'DeviceID',''],
#    ['40631', 'STR32', 'UTF8', 'Device Name', ''],
    ['30775', 'S32', 'FIX0', 'AC Power', 'W'],
    ['30517', 'U64', 'FIX3', 'daily yield', 'kWh'],
#################################################### 
    ['30953', 'S32', 'FIX1', 'Device_Temperature', u'\xb0C'],
    ['30849', 'S32', 'FIX1', 'BatteryTemp', u'\xb0C'],
    ['30843', 'S32', 'FIX3', 'BatteryAmp', 'A'],
    ['30851', 'U32', 'FIX2', 'BatteryVolt', 'V'],
    ['30845', 'U32', 'FIX0', 'BatteryCharge', u'\u0025'],
    ['30955', 'U32', 'ENUM', 'BatteryState', ''],
    ['31391', 'U32', 'ENUM', 'BatteryHealth', ''],
    ['30813', 'S32', 'FIX0', 'AC apparent power', 'VA'],
    ['30803', 'U32', 'FIX2', 'Grid_Frequency', 'Hz'],
#    ['30777', 'S32', 'FIX0', 'Power L1', 'W'],
#    ['30779', 'S32', 'FIX0', 'Power L2', 'W'],
#    ['30781', 'S32', 'FIX0', 'Power L3', 'W'],
    ['30513', 'U64', 'FIX3', 'Total_Yield', 'kWh'],
    ['30521', 'U64', 'FIX0', 'Operating_Time', 's'],
    ['30525', 'U64', 'FIX0', 'Feed-in_Time', 's'],
    ]

[FEATURE-pvdata_kostal_json]
# How frequently to send updates over (defaults to 20 sec)
min_update=15
#debug output
debug=0

#inverter connection
inv_host = <inverter-ip>
#['address', 'NONE', 'NONE' 'description', 'unit']
# to get the same structure of sma pvdata feature
registers = [
      ['33556736', 'NONE', 'NONE', 'DC Power', 'W'],
      ['33555202', 'NONE', 'NONE', 'DC string1 voltage', 'V'],
      ['33555201', 'NONE', 'NONE', 'DC string1 current', 'A'],
      ['33555203', 'NONE', 'NONE', 'DC string1 power', 'W'],
      ['67109120', 'NONE', 'NONE', 'AC Power', 'W'],
      ['67110400', 'NONE', 'NONE', 'AC frequency', 'Hz'],
      ['67110656', 'NONE', 'NONE', 'AC cosphi', u'\xb0C'],
      ['67110144', 'NONE', 'NONE', 'AC ptot limitation', ''],
      ['67109378', 'NONE', 'NONE', 'AC phase1 voltage', 'V'],
      ['67109377', 'NONE', 'NONE', 'AC phase1 current', 'A'],
      ['67109379', 'NONE', 'NONE', 'AC phase1 power', 'W'],
      ['251658754', 'NONE', 'NONE', 'yield today', 'Wh'],
      ['251658753', 'NONE', 'NONE', 'yield total', 'kWh'],
      ['251658496', 'NONE', 'NONE', 'operationtime', ''],
      ]

[FEATURE-ediplugs]
# How frequently to send updates over (defaults to 20 sec)
min_update=15
#debug output
debug=0

# Edimax SP-2101W V2 with Firmware 3.00c change their default password during initial setup.
# Find the actual password using this hack: https://discourse.nodered.org/t/searching-for-help-to-read-status-of-edimax-smartplug/15789/6
# ['<ip>', 'admin', '<password>']
plugs = [
    ['host1', 'admin', '1234'],
    ['host2', 'admin', '1234']
    ]

je vois aussi sur le site du developpeur qu’il y a un json . penses tu que c est plus simpe a integrer a jeedom ?

grafana.json_.txt (23,5 Ko)

Das Feature InfluxDB muss aktiviert und konfiguriert werden, dann sollten die Daten an die InfluxDB gesendet werden; Das Json beschreibt nur, wie Grafana die DAten aus der InfluxDB darstellen soll


Hallo
GitHub - datenschuft/SMA-EM: SMA Energymeter measurement horcht nur am Netzwerk auf Datenpakete vom SMA EM/Homemanager und zerlegt die einzelnen Messwerte und Zählerstände.
Über einzelne Features kann dieser Daemon / dieses Service die Daten weitergeben.
So gibt es auch Feature influxdb, das in der Konfigurationsdatei im Abschnitt [SMA-EM] mit features=influxdb eingebunden/aktiviert werden muss.
Dieses Feature gibt die Daten dann an eine InfluxDB weiter. Details zu dieser Verbindung müssen natürlich auch konfiguriert werden.
[FEATURE-influxdb]

symcon

host=influxdb
port=8086
db=SMA
measurement=SMAEM
timeout=5
user=
password=
fields=pconsume,psupply,p1consume,p2consume,p3consume,p1supply,p2supply,p3supply

Erst danach werden die in fields angegebenen Messwerte an die InfluxDB geschickt.

Laisse tomber influxdb & grafana, on reste sur du mqtt pour jeedom :slight_smile: (tu sais nous traduire?) (quoique, si tu es à l’aise en allemand et avec grafana + influxdb c’est possible aussi voir ce post: [PARTAGE] Jeedom influxdb grafana on en parle ici - #6 par olive )

si tu a 2 objets tu peux mettre les 2 numéros de série séparé par un espace:

serials=19002007XX 30011813XX 

ensuite on utilise mqtt

features=mqtt

Pour l’IP ? Les appareils sont sur le même réseau local avec leur IP propre genre 192.168... ? à mon avis ne fais rien, pas besoin de route spécifique si c’est bien sur le même réseau.

Laisse le bloc [DAEMON] je suppose que ce n’est pas une option, supprime le [FEATURE-simplefswriter] et [FEATURE-sample], pour [FEATURE-mqtt] tu a le choix des champs qui seront envoyés, dans le script python il y a cet exemple:

[FEATURE-mqtt]
# MQTT broker details
mqtthost=mqtt
mqttport=1883
#mqttuser=
#mqttpass=
mqttfields=pconsume,psupply,p1consume,p2consume,p3consume,p1supply,p2supply,p3supply
#topic will be exted3ed with serial
mqtttopic=SMA-EM/status
pvtopic=SMA-PV/status
# publish all values as single topics (0 or 1)
publish_single=1
# How frequently to send updates over (defaults to 20 sec)
min_update=30
#debug output
debug=0
# ssl support
# adopt mqttport above to your ssl enabled mqtt port, usually 8883
# options:
# activate without certs=use tls_insecure
# activate with ca_file, but without client_certs
ssl_activate=0
# ca file to verify
ssl_ca_file=ca.crt
# client certs
ssl_certfile=
ssl_keyfile=
#TLSv1.1 or TLSv1.2 (default 2)
tls_protocol=2

Merci pr ton retour car Wenger Florian ne répond pas par email a ma demande de support technique .
Alors la , tu me téléguide complètement, car pour moi c’est du chinois . Donc je te dis exactement se que je fais pr pas faire de bétises…
oui , les appareils ont une adresse ip fix sur le même réseau 192.168.1.XXX . je ne fais donc rien .

Pourquoi me montres tu un exemple python ? Je dois faire un copier coller et remplacer le mqtt du code par ton exemple ?
Je ne dois pas simplement enlevé le commentaire « # » devant la ligne que je souhaite recevoir ?
Par ex, la ligne " # frequency, frequencyunit, " , je dois simplement enlevé le # pour recevoir la fréquence ?
A certains endroit, il est écrit "password " . comme par ex dans " [FEATURE-influxdb] . je dois mettre le mot de pass des appareils ?
Ensuite, dois-je mettre le code dans le plugin script de jjedom ?
en gros, il me reste cela dans les premières lignes et je n ai rien fais pour le mqtt

[SMA-EM]
serials=30028xxxxx 30028xxxxx ( mes serials number ) 

[DAEMON]
pidfile=/run/smaemd.pid
ipbind=0.0.0.0
mcastgrp=239.12.255.254
mcastport=9522
statusdir=

[FEATURE-mqtt] 
???

Merci :+1:

J’ai juste copié le commentaire du script python pour le mqtt, mais en vrai ce n’est pas du python, c’est un fichier de propriétés ( « properties » ) de la forme clé=valeur et le mot entre crochets désigne un bloc spécifique, ou « section » , donc tu a [SMA-EM] puis [DAEMON] à configurer, et ensuite le bloc [FEATURE-mqtt] qui est activé pour nous (tu peux en ajouter d’autres pour influxdb & grafana si tu veux, et tu peux laisser simplefswriter et sample je ne sais pas ce que ça fait)

Par contre, il ne suffit pas juste d’enlever le # pour décommenter, il faut respecter la syntaxe clé=valeur1,valeur2,valeur3 … sur 1 seule ligne c’est le standard.

mcastgrp=192.168.1.254 je crois pour ton réseau local ou en tout cas il faudrait trouver l’adresse à utiliser ici.

si dans la section influxdb tu vois un mot de passe, c’est celui de influxdb et pas celui de tes appareils.

Ensuite tu enregistre ce fichier dans jeedom dans le répertoire /etc/smaemd/config, tu fais les commandes pour installer / créer les répertoires à partir de ici:

Donc, je dois quand même laisser " [FEATURE-sample] et [FEATURE-simplefswriter] " ?

" mcastgrp= " c’est the multicast address 239.12.255.254 via port 9522 c’est tj le même par lequel SMA envoie les infos datas toutes les secondes sur le réseau . donc je ne peux pas le changer ( si j ai bien compris ) .

A C++ executable to grab measurements from SMA-Emeters™ and SMA-Inverters™ and pass them to InfluxDB™.
SMA-Emeters™ send out udp packets including electrical power and energy measurements at intervals of 1000ms. Each udp packet is 600 bytes long and its format is specified in an publicly available specification document provided by the manufacturer.

The executable starts by discovering all SMA-Emeter™ and SMA-Inverter™ devices on all ip networks connected to the host running the executable. For discovery, it listens to inbound datagrams from the SMA Speedwire™ multicast group 239.12.255.254 at port 9522 an all connected interfaces, and starts a unicast scan within all connected local subnets on port 9522.
Après avoir sauver le fichier config , j ai fais

sudo systemctl daemon-reload
sudo systemctl enable smaemd.service
sudo systemctl start smaemd.service

où puis-je voir les infos après ? Dans " /run/shm " , je n ai aucun fichier .

oui OK, à condition de les citer dans les features, dans la section [SMA-EM]:
features=sample simplefswriter mqtt

D’ailleurs c’est une bonne idée, c’est l’un ou l’autre qui doit écrire dans /run/shm à défaut d’avoir d’autre log… ça donne quoi les commandes systemctl reload / enable / start, c’est ok, pas d’erreur ? Je pense que tu dois les refaire pour prendre en compte toute modif du fichier de config.

non , pas d’erreur quand je lance le service .
Mais rien dans le dossier " /run/shm " , j ai pas le " /em-- "
par contre, mon dossier shm, y a un petit logo noir dessus, je ne sais pas a quoi cela correspond :thinking:
j ai même fait le " sudo pip install -U pymodbus " suivant ce tuto , mais ca change rien .

ssss

Mais si j utilise mqtt,… il serait interessant d avoir 1 broker mqtt… je n ai rien fait pr cela . je suppose que je dois l active sur jeedom ? je continue ma recherche

  1. I have enabled MQTT feature (features=mqtt) to publish the data to an MQTT broker. My Home Assistant application subscribes the required data from the MQTT broker.
  1. Configure the items under [FEATURE-mqtt], enter IP address of your MQTT broker (I use IP address ::1 because the MQTT broker is running on the same device - raspberry), enter port, user name and user password of your MQTT broker.
  2. Use e.g. software MQTT Explorer to test if the data is published to the MQTT broker.

La petite flèche sur le rep shm ça veut sans doute dire que ce répertoire est un lien (un raccourcis) ?

Pour activer MQTT :

  1. installe le plugin jMQTT et installes les dépendances avec en particulier le broker mosquito
  2. configure le plugin suivant la doc et tes besoins, en particulier tu dois créer un équipement broker, et met le en debug pour commencer : https://domotruc.github.io/jMQTT/fr_FR/
  3. dans ton fichier config pour [FEATURE-mqtt] tu peux utiliser l’ip ::1 puisque SMA-EM et le broker mosquito sont sur le même appareil, tu peux aussi mettre user name & password si tu en a mis dans mosquito - à priori tu peux laisser vide ces 2 champs
  4. relance le service smaemd.service pour prendre en compte ce nouveau paramétrage
  5. si ok tu devrais voir quelque chose dans les logs du plugin jmqtt

slt, oui j ai fais … mais les infos ne rentres pas dans jeedom .
Avec mqqtt explorer, y a pas mal de datats qui rentrent, mais pas de data " SMA" .
Si qqun de compétant sur le forum ou ailleurs ( un contact ? ) peut se libérer 1 h pr essayer de le faire à ma place … $ via vnc ou temaviewer… Merci

The energymeter source 100% guaranteed to work. Compile it at raspberry with

gcc -o smaem main.c

after then

chmod +x smaem

done!

Start with

./smaem

If your energymeter isn’t configured incorrectly, e.g. to send the multicast datagram to a specific IP address (this is false!), the smaem shows data.


There is a feature that send the measuremenv values via mqtt / topics.
If jeedom can receive mqtt topics, an integration should be easy.

maybe the german manual (how sma-em-daemon works) can help you
maybe it is translateable by google translate to french.
https://www.unifox.at/software/sma-em-daemon/

En tout cas si tu a bien des data dans le mqtt, ça vient bien de tes appareils :slight_smile: non? ça ressemble à quoi ces datas ? Je suppose que côté jeedom ça va générer automatiquement des input, des objets et leurs informations - ou pas, peut être qu’il faut configurer manuellement la création de ces objets…

1 « J'aime »

Slt @pifou ,
J’ai plein de mqtt , mais je n ai pas de generation automatique du plugin . Je n’ai jamais fait de mqtt et je pense être maladroit pr faire des tests sans savoir déjà fair 1 configuration normale qui fonctionne .
Si qqun a 15 min avec teamviewer pr m aider je lui en serais reconnaissant . J’ai deja passer 2 jours complet la dessus, je jette l’éponge sans aide extérieur . J’ai fais une demande sur " codeur " et les devis sont de 500 euro minimum … trop pr moi . Pourtant le développeur du code source me dit que cela fonctionne tres bien et simplement .

Hello, pour l’instant ma connaissance en mqtt se limite à lancer un container docker… J’ai le projet de migrer mes objets zwave en zwaveJs2mqtt donc si je concrétise je pourrais t’aider pour la suite mais pour l’instant j’ai pas eu le temps de commencer. Et, pour ce que j’en ai lu c’est pas si simple que ça en avait l’air de prime abord, je comprends que tu ai eu des difficulté.

1 « J'aime »