Na aanleiding van deze post:
Op dit moment haal ik de data van Intelliweb binnen dmv een MQTT topic wat door Intelliweb beschikbaar wordt gesteld. Echter, de feed is een beetje wiebelig en ligt er af en toe uit, maar het is nog altijd beter dan niets en so far voor mij de enige methode om ook AC/DC voltages binnen te halen (Productie meet ik los met een Kwh meter met S0 uitgang).
Ik gebruik nu een los draaiend python scriptje wat de data, in mijn geval, door zet naar IP Symcon, maar dat kan eigenlijk elk domotica systeem zijn als de code daarvoor een beetje aangepast wordt. Er zijn wat afhankelijkheden, zoals paho maar niets onoverkomelijks als je toch al iets als een rPi hebt draaien voor bijv. domoticz, IP Symcon, etc. Zie de code hieronder:
En de nodige vragen die ik kreeg over hoe ik het uiteindelijk werkend heb gekregen heb ik maar even het een en ander opgeschreven.deWit schreef op dinsdag 23 augustus 2016 @ 13:41:
Ik heb een Mastervolt Web 1500 omvormer welke z'n data publiceerd op een portal van Mastervolt: IntelliWeb. Vanuit daar is met een MQTT feed de data op te halen, om de 10s word er gepubliceerd volgens hun API documentatie: (zie hier)
Op dit moment haal ik de data van Intelliweb binnen dmv een MQTT topic wat door Intelliweb beschikbaar wordt gesteld. Echter, de feed is een beetje wiebelig en ligt er af en toe uit, maar het is nog altijd beter dan niets en so far voor mij de enige methode om ook AC/DC voltages binnen te halen (Productie meet ik los met een Kwh meter met S0 uitgang).
Ik gebruik nu een los draaiend python scriptje wat de data, in mijn geval, door zet naar IP Symcon, maar dat kan eigenlijk elk domotica systeem zijn als de code daarvoor een beetje aangepast wordt. Er zijn wat afhankelijkheden, zoals paho maar niets onoverkomelijks als je toch al iets als een rPi hebt draaien voor bijv. domoticz, IP Symcon, etc. Zie de code hieronder:
Python:
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
| #!/usr/bin/env python import paho.mqtt.client as mqtt import json import requests from requests.auth import HTTPBasicAuth import time import logging import logging.handlers import argparse import sys # Deafults LOG_FILENAME = "/tmp/mastervoltmqtt.log" LOG_LEVEL = logging.INFO # Could be e.g. "DEBUG" or "WARNING" # Configure logging to log to a file, making a new file at midnight and keeping the last 3 day's data # Give the logger a unique name (good practice) logger = logging.getLogger(__name__) # Set the log level to LOG_LEVEL logger.setLevel(LOG_LEVEL) # Make a handler that writes to a file, making a new file at midnight and keeping 3 backups handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME, when="midnight", backupCount=3) # Format each log message like this formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s') # Attach the formatter to the handler handler.setFormatter(formatter) # Attach the handler to the logger logger.addHandler(handler) # Make a class we can use to capture stdout and sterr in the log class MyLogger(object): def __init__(self, logger, level): """Needs a logger and a logger level.""" self.logger = logger self.level = level def write(self, message): # Only log if there is a message (not just a new line) if message.rstrip() != "": self.logger.log(self.level, message.rstrip()) # Replace stdout with logging to file at INFO level sys.stdout = MyLogger(logger, logging.INFO) # Replace stderr with logging to file at ERROR level sys.stderr = MyLogger(logger, logging.ERROR) # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. client.subscribe("/IntelliWeb/v1/account/+/devices/+/monitoringData") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): # print(msg.topic+" "+str(msg.payload)) parsed_json = json.loads(msg.payload) # print json.dumps(parsed_json, sort_keys=True, indent=4, separators=(',', ': ')) AC = parsed_json['AC'][0] DC = parsed_json['DC'][0] # Specific for IP Symcon, but can be adjusted for any domotica software package. IPSrpc("SetValue", [17473, AC['P']]) IPSrpc("SetValue", [18782, AC['V']]) IPSrpc("SetValue", [41738, DC['V']]) IPSrpc("SetValue", [40413, parsed_json['T']]) IPSrpc("SetValue", [59939, parsed_json['E']]) print("Values send to IP Symcon") # JSON-RPC to IP Symcon def IPSrpc(methodIps, paramIps): url = "http://IP_SYMCON_IP:PORT/api/" auth=HTTPBasicAuth('IP_SYMCON_USERNAME', IP_SYMCON_PASSWORD') headers = {'content-type': 'application/json'} payload = { "method": methodIps, "params": paramIps, "jsonrpc": "2.0", "id": "0", } response = requests.post(url, auth=auth, data=json.dumps(payload), headers=headers) print(response) # Open MQTT Client and start getting data client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.tls_set("/etc/ssl/certs/ca-certificates.crt") client.username_pw_set("INTELLIWEB_USERNAME", "INTELLIWEB_API_KEY") client.user_data_set("IINTELLIWEB_USERNAME") client.connect("intelliweb.mastervolt.com", 8883, 60) # Blocking call that processes network traffic, dispatches callbacks and # handles reconnecting. # Other loop*() functions are available that give a threaded interface and a # manual interface. client.loop_forever() |