Modbus.tcp & telegraf, probleem met decimalen?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Ik heb een Solaredge SE2200h die ik uitlees over modbus.tcp. Nu merk ik dat als de omvormer lage vermogens geeft ('s ochtends en 's avonds) dat de statistieken die ik eruit trek ERG hoge vermogens geven, zoals ~3kW, wat niet zou mogen kunnen omdat de omvormer maar 2.2kW is. Nu bijvoorbeeld deze ochtend. Het is nu ~07:05 op de moment dat ik dit schrijf. Ik zou vermoeden dat de zonnepanelen nu misschien 17W of 170W zouden geven. Mijn andere panelen die ernaast liggen, geven op dezelfde moment 86W en die liggen zuid gericht. Het lijkt me logisch dat de omvormer waar ik het nu over heb (die panelen liggen voorlopig volledig plat op het dak) dan meer zou moeten geven, 170W dus, maar echt nog geen 1,7kW.

Afbeeldingslocatie: https://tweakers.net/i/F7d4x2symjd_zcjztT5zHMH3bjk=/800x/filters:strip_exif()/f/image/0314onyHpfXYslNZ8LeCgRev.png?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/NnaGWAohjQ2kz0zKTMVaMig27e0=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/miwavyHoESbwVUvRn7wwjK5v.png?f=user_large

Maar goed, ik stop nu ff met posten, ik vul straks mijn post aan met wanneer de omvormer/telegraf wél juiste waardes geeft.

Mijn vermoeden is dat telegraf, de omvormer niet juist uitleest, of foute waardes in de influxdb pusht om welke reden dan ook.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
pi@stats:~ $ sudo cat /etc/telegraf/telegraf.d/se2200h.conf 
sudo: unable to resolve host stats: Name or service not known
[[inputs.modbus]]
 interval = "5s"
 name_override="SE2200H"
 name = "SE2200h" # Not used
 tagexclude = ["type", "name", "host"]

 slave_id = 1
 timeout = "5s"
 controller = "tcp://10.10.10.22:1502"

 # Note: most static data is omitted (pointless to monitor)
 # Note: battery and meter data is omitted (as i have none)
 #
 # Always 0/not used: 
 #  { name = "I_Status_Vendor", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [108]} 

 # Disabled for now since Telegraf does not support reading strings
 # { name = "c_serialnumber", address = [52, 67]},
 holding_registers = [
    { name = "C_SunSpec_DID", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [69]},
    { name = "I_AC_Current", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [71]},
    { name = "I_AC_CurrentA", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [72]},
    { name = "I_AC_CurrentB", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [73]},
    { name = "I_AC_CurrentC", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [74]},
    { name = "I_AC_Current_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [75]},
    { name = "I_AC_VoltageAB", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [76]},
    { name = "I_AC_VoltageBC", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [77]},
    { name = "I_AC_VoltageCA", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [78]},
    { name = "I_AC_VoltageAN", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [79]},
    { name = "I_AC_VoltageBN", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [80]},
    { name = "I_AC_VoltageCN", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [81]},
    { name = "I_AC_Voltage_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [82]},
    { name = "I_AC_Power", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [83]},
    { name = "I_AC_Power_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [84]},
    { name = "I_AC_Frequency", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [85]},
    { name = "I_AC_Frequency_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [86]},
    { name = "I_AC_VA", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [87]},
    { name = "I_AC_VA_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [88]},
    { name = "I_AC_VAR", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [89]},
    { name = "I_AC_VAR_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [90]},
    { name = "I_AC_PF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [91]},
    { name = "I_AC_PF_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [92]},
    { name = "I_AC_Energy_WH", byte_order = "ABCD", data_type = "INT32", scale=1.0,  address = [93, 94]},
    { name = "I_AC_Energy_WH_SF", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [95]},
    { name = "I_DC_Current", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [96]},
    { name = "I_DC_Current_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [97]},
    { name = "I_DC_Voltage", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [98]},
    { name = "I_DC_Voltage_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [99]},
    { name = "I_DC_Power", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [100]},
    { name = "I_DC_Power_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [101]},
    { name = "I_Temp", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [103]},
    { name = "I_Temp_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [106]},
    { name = "I_Status", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [107]}
  ]

pi@stats:~ $

[ Voor 61% gewijzigd door bucovaina89 op 16-05-2022 07:11 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
En hier filpt hij van correcte waarden naar foute waarden.

In de grafana screenshot heb ik 29615 aandeduid, die je dan weer ziet in de influxql query result, ook daar aangeduid.

Heeft iemand een idee wat dit zou kunnen zijn?

Afbeeldingslocatie: https://tweakers.net/i/WRUEL7ECNwK-H0hwhDWkwaFGB7k=/800x/filters:strip_exif()/f/image/FIASOzErIli0uguYNKUAKZoj.png?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/p_L1PAXFLwM-DMv-0S9f0NFanO4=/800x/filters:strip_exif()/f/image/Yjt6V2acG9IhM5LzscwzkbpW.png?f=fotoalbum_large

En voor de volledigheid: mijn andere omvormer lees ik ook uit over modbus.tcp, maar met een python script
[code]
En misschien voor nog meer volledigheid, de data die ik uitlees van mijn SE3000h, is ook over modbus.tcp, maar dat doe ik met dit python script, dus niet met telegraf waar ik dit probleem dus wel mee heb. Mijn python scripts zijn erg slecht, maar op deze manier gaat het wel.

Ik zou beide omvormers liefst via telegraf willen kunnen uitlezen, dat vind ik persoonlijk veel netter dan een python script in een systemd unit gooien. Mocht iemand de opmerking maken: doe dan toch via dat Python script ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/env python3

import argparse
import sys
import time

from influxdb import InfluxDBClient
import requests
import solaredge_modbus


if __name__ == "__main__":
    argparser = argparse.ArgumentParser()
    argparser.add_argument("host", type=str, help="Modbus TCP address")
    argparser.add_argument("port", type=int, help="Modbus TCP port")
    argparser.add_argument("--timeout", type=int, default=1, help="Connection timeout")
    argparser.add_argument("--unit", type=int, default=1, help="Modbus device address")
    argparser.add_argument("--interval", type=int, default=10, help="Update interval")
    argparser.add_argument("--influx_host", type=str, default="localhost", help="InfluxDB host")
    argparser.add_argument("--influx_port", type=int, default=8086, help="InfluxDB port")
    argparser.add_argument("--influx_db", type=str, default="solaredge", help="InfluxDB database")
    argparser.add_argument("--influx_user", type=str, help="InfluxDB username")
    argparser.add_argument("--influx_pass", type=str, help="InfluxDB password")
    args = argparser.parse_args()

    try:
        if args.influx_user and args.influx_pass:
            client = InfluxDBClient(
                host=args.influx_host,
                port=args.influx_port,
                username=args.influx_user,
                password=args.influx_pass
            )
        else:
            client = InfluxDBClient(host=args.influx_host, port=args.influx_port)

        client.switch_database(args.influx_db)
    except (ConnectionRefusedError, requests.exceptions.ConnectionError):
        print(f"database connection failed: {args.influx_host,}:{args.influx_port}/{args.influx_db}")
        sys.exit()

    inverter = solaredge_modbus.Inverter(
        host=args.host,
        port=args.port,
        timeout=args.timeout,
        unit=args.unit
    )

    while True:
        values = {}
        values = inverter.read_all()
        meters = inverter.meters()
        batteries = inverter.batteries()

        json_body = []
        current_time = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())

        inverter_data = {
            "measurement": "inverter",
            "tags": {
                "c_manufacturer": values["c_manufacturer"],
                "c_model": values["c_model"],
                "c_version": values["c_version"],
                "c_serialnumber": values["c_serialnumber"],
                "c_deviceaddress": values["c_deviceaddress"],
                "c_sunspec_did": values["c_sunspec_did"]
            },
            "time": current_time,
            "fields": {}
        }

        for k, v in values.items():
            if (isinstance(v, int) or isinstance(v, float)) and "_scale" not in k:
                k_split = k.split("_")
                scale = 0

                if f"{k_split[len(k_split) - 1]}_scale" in values:
                    scale = values[f"{k_split[len(k_split) - 1]}_scale"]
                elif f"{k}_scale" in values:
                    scale = values[f"{k}_scale"]

                inverter_data["fields"].update({k: float(v * (10 ** scale))})

        json_body.append(inverter_data)

        for meter, params in meters.items():
            meter_values = params.read_all()

            meter_data = {
                "measurement": "meter",
                "tags": {
                    "c_manufacturer": meter_values["c_manufacturer"],
                    "c_model": meter_values["c_model"],
                    "c_option": meter_values["c_option"],
                    "c_version": meter_values["c_version"],
                    "c_serialnumber": meter_values["c_serialnumber"],
                    "c_deviceaddress": meter_values["c_deviceaddress"],
                    "c_sunspec_did": meter_values["c_sunspec_did"]
                },
                "time": current_time,
                "fields": {}
            }

            for k, v in meter_values.items():
                if (isinstance(v, int) or isinstance(v, float)) and "_scale" not in k:
                    k_split = k.split("_")
                    scale = 0

                    if f"{k_split[len(k_split) - 1]}_scale" in meter_values:
                        scale = meter_values[f"{k_split[len(k_split) - 1]}_scale"]
                    elif f"{k}_scale" in meter_values:
                        scale = meter_values[f"{k}_scale"]

                    meter_data["fields"].update({k: float(v * (10 ** scale))})

            json_body.append(meter_data)

        for battery, params in batteries.items():
            battery_values = params.read_all()

            if not battery_values["c_model"]:
                continue

            battery_data = {
                "measurement": "battery",
                "tags": {
                    "c_manufacturer": battery_values["c_manufacturer"],
                    "c_model": battery_values["c_model"],
                    "c_version": battery_values["c_version"],
                    "c_serialnumber": battery_values["c_serialnumber"],
                    "c_deviceaddress": battery_values["c_deviceaddress"],
                    "c_sunspec_did": battery_values["c_sunspec_did"]
                },
                "time": current_time,
                "fields": {}
            }

            for k, v in battery_values.items():
                if isinstance(v, int) or isinstance(v, float):
                    battery_data["fields"].update({k: v})

            json_body.append(battery_data)

        client.write_points(json_body)
        time.sleep(args.interval)

[ Voor 77% gewijzigd door bucovaina89 op 16-05-2022 07:34 ]


Acties:
  • 0 Henk 'm!

  • hcQd
  • Registratie: September 2009
  • Nu online
Ik neem aan dat I_AC_POWER_SF (scale factor?) ook nog wel een rol speelt.

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
@hcQd : geen idee wat het verschil tussen beide is :)

Hier een query van beide naast elkaar van dezelfdes time stamps als de screenshots in de opening post.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
> SELECT I_AC_Power_SF, I_AC_Power   FROM elektriciteit..SE2200H WHERE time > '2022-05-16 05:05:15' AND time < '2022-05-16 05:08:05'
name: SE2200H
time                I_AC_Power_SF I_AC_Power
----                ------------- ----------
1652677520000000000 -3            22120
1652677525000000000 -3            19367
1652677530000000000 -3            20821
1652677535000000000 -3            25485
1652677540000000000 -3            21590
1652677545000000000 -3            23686
1652677550000000000 -3            21608
1652677555000000000 -3            22813
1652677560000000000 -3            23648
1652677565000000000 -3            23080
1652677570000000000 -3            23538
1652677575000000000 -3            20909
1652677580000000000 -3            24049
1652677585000000000 -3            25634
1652677590000000000 -3            24610
1652677595000000000 -3            25538
1652677600000000000 -3            26804
1652677605000000000 -3            27111
1652677610000000000 -3            26994
1652677615000000000 -3            24932
1652677620000000000 -3            28163
1652677625000000000 -3            29140
1652677630000000000 -3            28977
1652677635000000000 -3            27618
1652677640000000000 -3            27774
1652677645000000000 -2            3000
1652677650000000000 -2            3116
1652677655000000000 -2            3112
1652677660000000000 -3            29615
1652677665000000000 -3            29110
1652677670000000000 -2            3079
1652677675000000000 -2            3198
1652677680000000000 -2            3372
>

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Oh wacht eens, zou -3 dan betekenen delen door 1000 en -2 delen door 100?

Acties:
  • 0 Henk 'm!

  • hcQd
  • Registratie: September 2009
  • Nu online
bucovaina89 schreef op maandag 16 mei 2022 @ 07:39:
Oh wacht eens, zou -3 dan betekenen delen door 1000 en -2 delen door 100?
Precies.

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Makes sense. Maar dan is mijn volgende vraag, geen idee hoe ik van "-2" , "/100" maak en "-3", "/1000" in de grafana query. Ik vermoed dat ik iets ga moeten doen zoals onderstaande screenshot (werkt niet en obviously totaal fout). Wie kan me hier in verder helpen?

Afbeeldingslocatie: https://tweakers.net/i/LdS__GKAPQQ3HjN6QXzsSLHBpXE=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/17Uoo5GYG3JxOp5YeHIekCEs.png?f=user_large

Acties:
  • +1 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 21:36
Kun je de correctie niet al in je uitleesscript doen, zodat je in je DB gewoon leesbare/begrijpbare data hebt?

Acties:
  • +2 Henk 'm!

  • EricTC
  • Registratie: November 2006
  • Laatst online: 20:32
Je moet vermenigvuldigen met 10 tot de macht I_AC_POWER_SF als je dit wil bereiken.

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
@ThinkPad : OK dan ga ik eens in de opties van telegraf duiken. Het lijkt me een betere approach om de data gewoon "leesbaar" in de database te steken want ik wil de data niet alleen met grafana gebruiken maar ook met Home Assistant en mogelijk nog wat. Dan ga ik telkens hetzelfde probleem moeten gaan oplossen.

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Als tijdelijke workaround heb ik dit al in grafana geprobeerd:
code:
1
math( * 10**mean("I_AC_Power_SF"))

en
code:
1
math( * 10^mean("I_AC_Power_SF"))


In beide gevallen verdwijnt de grafiek en komt er "No Data" te staan. Ik vermoed omdat ik ergens iets niet juist heb staan in die formule, maar wat?

Afbeeldingslocatie: https://tweakers.net/i/0vEtXb7vLX9uJWCRv1O-ckgFn0c=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/jlAVTrl0gz3IQhZHp9mdJniT.png?f=user_large

Acties:
  • 0 Henk 'm!

  • Nutral
  • Registratie: Mei 2005
  • Laatst online: 11-09 13:30

Nutral

gamer/hardware freak

bucovaina89 schreef op maandag 16 mei 2022 @ 09:09:
Als tijdelijke workaround heb ik dit al in grafana geprobeerd:
code:
1
math( * 10**mean("I_AC_Power_SF"))

en
code:
1
math( * 10^mean("I_AC_Power_SF"))


In beide gevallen verdwijnt de grafiek en komt er "No Data" te staan. Ik vermoed omdat ik ergens iets niet juist heb staan in die formule, maar wat?

[Afbeelding]
Volgens mij moet je de andere waarde ook inladen in de grafiek, en dan met transformations de waarde uitrekenen.

Ik zou het ook in telegraf proberen te doen. je kunt starlark operaties doen op input waardes en dan meteen de juiste gegevens krijgen in de database.
[[processors.starlark]]
# Reads the Starlark script embedded
source = '''
def apply(metric):
x = metric.fields['value']
e = metric.fields['factor']
metric.fields['power'] = x*10**e
return metric

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Idd, ik dacht als tijdelijke workaround die math te doen in grafana. Met transformations gaat het ook niet, alleen +,-,*,/ kan je doen. Da's wel erg basis :).

Dan kijk ik eens naar die starlark processor. Dat gaat het waar definitief fixen.

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Ik wilde het eens proberen omdat me nog niet duidelijk is hoe starlark werkt en hoe je input/output velden regel, dus gewoon eens zien hoe ver ik geraak. Blijkbaar doe ik iets mis met de syntax.

code:
1
2
3
4
root@stats:~# telegraf --config /etc/telegraf/telegraf.d/se2200h.conf 
2022-05-20T11:53:53Z I! Starting Telegraf 1.21.4
2022-05-20T11:53:53Z E! [telegraf] Error running agent: Error: no outputs found, did you provide a valid config file?
root@stats:~#


code:
1
2
3
4
5
6
7
8
9
10
11
... # snippet uit /etc/telegraf/telegraf.d/se2200h.conf
... # de volledige file staat in de code block hieronder
...
[[processors.starlark]]
  # Reads the Starlark script embedded
  source = '''
  def apply(metric):
  x = metric.fields['I_AC_Power']
  e = metric.fields['I_AC_Power_SF']
  metric.fields['I_AC_Power'] = x*10**e 
  return metric # ===> lijn 64 in de config


Ook met systemctl restart wil telegraf niet opstarten. Hieronder de relevante settings.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
root@stats:~# cat /etc/telegraf/telegraf.d/se2200h.conf 
[[inputs.modbus]]
 interval = "5s"
 name_override="SE2200H"
 name = "SE2200h" # Not used
 tagexclude = ["type", "name", "host"]

 slave_id = 1
 timeout = "5s"
 controller = "tcp://10.10.10.22:1502"

 # Note: most static data is omitted (pointless to monitor)
 # Note: battery and meter data is omitted (as i have none)
 #
 # Always 0/not used: 
 #  { name = "I_Status_Vendor", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [108]} 

 # Disabled for now since Telegraf does not support reading strings
 # { name = "c_serialnumber", address = [52, 67]},
 holding_registers = [
    { name = "C_SunSpec_DID", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [69]},
    { name = "I_AC_Current", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [71]},
    { name = "I_AC_CurrentA", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [72]},
    { name = "I_AC_CurrentB", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [73]},
    { name = "I_AC_CurrentC", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [74]},
    { name = "I_AC_Current_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [75]},
    { name = "I_AC_VoltageAB", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [76]},
    { name = "I_AC_VoltageBC", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [77]},
    { name = "I_AC_VoltageCA", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [78]},
    { name = "I_AC_VoltageAN", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [79]},
    { name = "I_AC_VoltageBN", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [80]},
    { name = "I_AC_VoltageCN", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [81]},
    { name = "I_AC_Voltage_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [82]},
    { name = "I_AC_Power", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [83]},
    { name = "I_AC_Power_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [84]},
    { name = "I_AC_Frequency", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [85]},
    { name = "I_AC_Frequency_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [86]},
    { name = "I_AC_VA", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [87]},
    { name = "I_AC_VA_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [88]},
    { name = "I_AC_VAR", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [89]},
    { name = "I_AC_VAR_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [90]},
    { name = "I_AC_PF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [91]},
    { name = "I_AC_PF_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [92]},
    { name = "I_AC_Energy_WH", byte_order = "ABCD", data_type = "INT32", scale=1.0,  address = [93, 94]},
    { name = "I_AC_Energy_WH_SF", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [95]},
    { name = "I_DC_Current", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [96]},
    { name = "I_DC_Current_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [97]},
    { name = "I_DC_Voltage", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [98]},
    { name = "I_DC_Voltage_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [99]},
    { name = "I_DC_Power", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [100]},
    { name = "I_DC_Power_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [101]},
    { name = "I_Temp", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [103]},
    { name = "I_Temp_SF", byte_order = "AB", data_type = "INT16", scale=1.0,  address = [106]},
    { name = "I_Status", byte_order = "AB", data_type = "UINT16", scale=1.0,  address = [107]}
  ]

[[processors.starlark]]
  # Reads the Starlark script embedded
  source = '''
  def apply(metric):
  x = metric.fields['I_AC_Power']
  e = metric.fields['I_AC_Power_SF']
  metric.fields['I_AC_Power'] = x*10**e
  return metric

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Ah opgelost, de correcte syntax is:
code:
1
2
3
4
5
6
7
8
9
[[processors.starlark]]
  # Reads the Starlark script embedded
  source = '''
  def apply(metric):
  x = metric.fields['I_AC_Power']
  e = metric.fields['I_AC_Power_SF']
  metric.fields['I_AC_Power'] = x*10**e 
  return metric # ===> lijn 64 in de config
'''


Nu een halve stap verder:
code:
1
2
3
4
2022-05-20T14:00:05+02:00 E! [telegraf] Error running agent: could not initialize processor starlark: :1:3: got indent, want primary expression
2022-05-20T14:00:05+02:00 E! [telegraf] Error running agent: could not initialize processor starlark: :1:3: got indent, want primary expression
2022-05-20T14:00:06+02:00 E! [telegraf] Error running agent: could not initialize processor starlark: :1:3: got indent, want primary expression
2022-05-20T14:00:06+02:00 E! [telegraf] Error running agent: could not initialize processor starlark: :1:3: got indent, want primary expression

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
En weer een stapje dichter:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
root@stats:~# systemctl restart telegraf && systemctl status telegraf.service 
● telegraf.service - The plugin-driven server agent for reporting metrics into InfluxDB
     Loaded: loaded (/lib/systemd/system/telegraf.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-05-20 14:06:41 CEST; 39ms ago
       Docs: https://github.com/influxdata/telegraf
   Main PID: 14468 (telegraf)
      Tasks: 1 (limit: 3720)
        CPU: 8ms
     CGroup: /system.slice/telegraf.service
             └─14468 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d

May 20 14:06:41 stats systemd[1]: Started The plugin-driven server agent for reporting metrics into InfluxDB.
root@stats:~# tail -f /var/log/telegraf/telegraf 
2022-05-20T14:06:46+02:00 E! [processors.starlark] Error: key "I_AC_Power" not in Fields
2022-05-20T14:06:46+02:00 E! [processors.starlark] Error in plugin: key "I_AC_Power" not in Fields
2022-05-20T14:06:46+02:00 E! [processors.starlark] Traceback (most recent call last):
2022-05-20T14:06:46+02:00 E! [processors.starlark]   :3:20: in apply
2022-05-20T14:06:46+02:00 E! [processors.starlark] Error: key "I_AC_Power" not in Fields
2022-05-20T14:06:46+02:00 E! [processors.starlark] Error in plugin: key "I_AC_Power" not in Fields
2022-05-20T14:06:47+02:00 E! [processors.starlark] Traceback (most recent call last):
2022-05-20T14:06:47+02:00 E! [processors.starlark]   :3:20: in apply
2022-05-20T14:06:47+02:00 E! [processors.starlark] Error: key "I_AC_Power" not in Fields
2022-05-20T14:06:47+02:00 E! [processors.starlark] Error in plugin: key "I_AC_Power" not in Fields
2022-05-20T14:06:48+02:00 E! [processors.starlark] Traceback (most recent call last):
2022-05-20T14:06:48+02:00 E! [processors.starlark]   :3:20: in apply
2022-05-20T14:06:48+02:00 E! [processors.starlark] Error: key "I_AC_Power" not in Fields
2022-05-20T14:06:48+02:00 E! [processors.starlark] Error in plugin: key "I_AC_Power" not in Fields
2022-05-20T14:06:49+02:00 E! [processors.starlark] Traceback (most recent call last):
2022-05-20T14:06:49+02:00 E! [processors.starlark]   :3:20: in apply
2022-05-20T14:06:49+02:00 E! [processors.starlark] Error: key "I_AC_Power" not in Fields
2022-05-20T14:06:49+02:00 E! [processors.starlark] Error in plugin: key "I_AC_Power" not in Fields
^C
root@stats:~# vi /etc/telegraf/telegraf.d/se2200h.conf 
root@stats:~# tail /etc/telegraf/telegraf.d/se2200h.conf

[[processors.starlark]]
source = '''
def apply(metric):
  # Reads the Starlark script embedded
  x = metric.fields['I_AC_Power']
  e = metric.fields['I_AC_Power_SF']
  metric.fields['I_AC_Power'] = x * e
  return metric
'''
root@stats:~#

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Wow wacht, ik moet deze eerst ff lezen: http://oostens.me/posts/solaredge-se3000h-monitoring/

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
ja gefixt door die pagina deftig te lezen en niet enkel een deel van de config over te nemen :)
Pagina: 1