NEWS
UVR1611 -> C.M.I -> modbus -> ioBroker -> Grafana
-
Hallo Forum,
mein Setup besteht aus einer UVR1611, einem CMI, einem Raspberry 4 mit ioBroker, modbus Adapter, InfluxDB und Grafana.
Nach diversen Stolpersteinen und viel Probieren läuft jetzt die Übertragung und Anzeige der analogen Werte in Grafana und auch schon pr iFrame in VIS.
Jetzt stehe ich vor der Herausforderung, die digitalen Schaltzustände ebenfalls sichtbar zu machen. Die Übertragung zu ioBroker funktioniert bereits. Auch der Bug mit den vertauschten true/false Werten ist bekannt.
Mein Problem ist, dass ich die Status in boolsche Werten in die Datenbank schreiben muss/möchte. Also true=1 und false =0 (bzw. wegen dem Bug umgekehrt). Wisst ihr wie ich das anstellen kann?
Ist das mit Blockli möglich?Danke für eure Hilfe.
HenriP.S. bei Bedarf stelle ich euch gerne mal meine komplette Anleitung von der UVR bis zu Grafana zur Verfügung.
-
@hennerich sagte:
true=1 und false =0 (bzw. wegen dem Bug umgekehrt). Wisst ihr wie ich das anstellen kann? Ist das mit Blockli möglich?
Ja, aber einfacher mit Alias-Datenpunkten.
Alternativ mit Blockly:
Wert findet man unter "Trigger".
-
Hallo hennerich,
ich betreibe auch eine UVR1611 und UVR16x2.
Ich hätte Interesse an Deiner Anleitung.Danke
-
@piet gib mir mal bis morgen Zeit
-
@paul53 Vielen Dank Paul.
Wenn du so nett wärst, mir als Laie mal noch die praktische Anwendung des Alias zu erklären? Die Doku sieht mir zu sehr nach Programmierung aus und die anderen Postings, die ich dazu finden konnte, habe mich nicht wirklich weiter gebracht.
Bisher hab ich verstanden, dass ich hier einen alias hinzufügen muss:
Den vorhandenen Eintrag hab ich erst gefunden, als ich die Ansicht auf "Show Tree View" gestellt und dann wieder zurück gewechselt bin. Sehr komisch.
Dann musste ich erstmal erkennen, dass dieses Objekt ein Ordner ist, unter dem man dann weitere Objekte plazieren kann.
Also auf das Objekt alias.0 klicken und oben "Tochterobjekt zu ausgewähltem Objekt hinzufügen" klicken.
Dann bekomme ich das:
Und jetzt dachte ich mir, dass ich einfach "irgendwo" mein Quellobjekt auswählen und dazu dann die entsprechende Form der Umwandlung konfigurieren kann. Bei der Auswahl des Quellobjektes bin ich gescheitert. Ich finde weder diese Option noch die Stelle, an der ich das per Code (davon hab ich keine Ahnung) konfigurieren kann.Grüße
HenriP.S. Falls hier jemand mitliest, der die alias Funktion erstellt hat: Wäre es von der Usability nicht besser gewesen, dass man Aliase einfach so hinzufügt und diese dann unter diesem Ordner auftauchen?
-
@hennerich sagte:
Und jetzt dachte ich mir, dass ich einfach "irgendwo" mein Quellobjekt auswählen und dazu dann die entsprechende Form der Umwandlung konfigurieren kann.
So einfach funktioniert es leider nicht. Wenn man manuell Datenpunkte im Tab "Objekte" erstellen will, sollte man sich schon etwas auskennen. Einfacher geht es mit einem Script, das eine Hilfestellung durch die Kommentare gibt. In Deinem Fall z.B.
// Original-Datenpunkt const idOrigin = 'modbus.0.coils.11_PumpeSol'; // Alias-Datenpunkt const idAlias = 'Solar.Pumpe'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich // nameAlias = 'Licht Haustür'; desc = 'per Script erstellt'; typeAlias = 'number'; // oder 'number' read = "val ? 0 : 1"; // Erkennung "Aus" --> false erfolgt automatisch // write = "val ? 'Ein' : 'Aus'"; role = 'value'; min = 0; // nur Zahlen max = 1; // nur Zahlen // unit = '%'; // nur für Zahlen // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein) custom = []; // verhindert doppelte Ausführung von history, telegram, mqtt-client, ... function createAlias(idSrc, idDst) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj); } } createAlias(idOrigin, 'alias.0.' + idAlias);
-
Anleitung Einbindung UVR/CMI in ioBroker (und Grafana):
Verwendete Versionen:
UVR1611: A3.28DE
C.M.I.: V1.37.1
ioBroker: 4.0.10
modbus: 3.0.0Zuerst möchte ich euch mitgeben, dass ich kein Experte auf diesem Gebiet bin und ich mich erst seit einer Woche mit ioBroker beschäftige. Daher kann es durchaus sein, dass ich ev. aufkommende Fragen von euch nicht beantworten kann. Gerne ergänze ich aber diesen Thread hier um weitere Informationen, die dann andere Nutzer helfen.
Es geht los mit der Konfiguration der UVR1611 (ich vermute, bei der UVR16x2 ist das ähnlich).-
Zuerst den Ausgang 14 als Datenleitung konfigurieren (stand in der UVR Anleitung drin und ich nahm an, dass dies die Voraussetzung für jegliche Übertragung von Datenwerten ist)
-
Dann sollen (in meinem Fall) analoge und digitale Werte zum CMI übertragen werden. Also klicke ich im Hauptmenü auf Netzwerk/ Ausgangsvariablen (diejenigen, die „aus der UVR raus gehen“, das hat nichts mit den Aus- bzw. Eingängen in der UVR zu tun). Man kann jeweils eine Quelle auswählen (Eingänge, Ausgänge oder Funktionen), in meinem Fall für den ersten (Netzwerk)Ausgang der Eingang „TKollektor1“. Als Ziel immer CAN auswählen. Hier bei den analogen (Netzwerk)Ausgängen überträgt man alles, was kein Zustand (z.B. Pumpe läuft/läuft nicht) ist.
-
Die digitalen (Netzwerk)Ausgänge habe ich ebenso konfiguriert
-
Jetzt geht’s in der CMI weiter.
Unter Einstellungen Eingänge werden alle von der UVR per CAN-Bus übertragenen Werte, die wir eben konfiguriert haben, „entgegengenommen“. Daher heißt der Punkt auch Eingänge. Hat wieder nichts mit irgendwelchen Eingängen an der UVR zu tun (sehr verwirrend, wenn man sich damit zum ersten Mal beschäftigt).
Dort konfiguriert ihr unter CAN-BUS eure analogen und digitalen Werte.
Wichtig!! Ihr habt oben in meinem Screenshot von der UVR1611 gesehen, dass dort oben drüber Knoten 1 steht. Genau das muss bei Knotennummer: angegeben werden. Und der Wert für den Netzwerkausgang: ergibt sich aus der Stelle, an der ihr den jeweiligen Wert in der UVR programmiert habt. Beispiel: Meine Außentemperatur ist in der UVR im Knoten 1 am analogen (Netzwerk)Ausgang 5 programmiert.
Der Einfachheit halber habe ich die gleichen Positionen wie in der UVR verwendet. Also Ausgang 5 in der UVR ist auch Eingang 5 im CMI. Ich muss nicht erwähnen, dass ihr das genauso auch für die digitalen Eingänge im CMI macht.
- Die Konfiguration des modbus Adapters im ioBroker ist nicht ganz einfach.
ACHTUNG!! Wichtiger Hinweis #1: Nach der Installation von des modbus Adapters im ioBroker muss die „Partner IP Adresse“ auf 0.0.0.0 stehen. Das scheint noch ein Bug zu sein und hat mir echt Kopfschmerzen bereitet.
ACHTUNG!! Wichtiger Hinweis #2: Entgegen aller Logik und der diversen Userbeschreibungen hier im Forum stimmt es (bei mir) nicht, dass die (Partner) Geräte ID: mit der im CMI unter Ausgänge konfigurierten Gerät: ID übereinstimmen muss. So habe ich das konfiguriert:
Von den Einstellungen unter Allgemein habe ich keine Ahnung, die hab ich nur so von einem anderen User übernommen. So funktioniert es jedenfalls auch bei mir.
- Jetzt geht’s zu den Ausgängen (aus dem CMI) in Richtung modbus. Die Ausgänge nehmen den in Eingängen konfigurierten Wert entgegen und bereiten ihr zur Übertragung nach extern vor. In unserem Fall per Modbus Master (nicht per CAN) zum ioBroker. Letzterer ist dann übrigens der Modbus Slave.
Die Bezeichnung kann frei vergeben werden. Der Eingang: ist immer CAN-Bus (es sei denn ihr habt unter Eingänge etwas anderes gemacht) und mittels Drop-Down wählt ihr euren gewünschten Datenpunkt aus.
Die Geräte IP: mit der ihr euch verbinden wollt ist die IP eures Clients, auf dem ioBroker läuft. Hier muss übrigens eine IP Adresse angegeben werden, und kein DNS Name (hätte ich besser gefunden).
Bei Gerät: habe ich „irgendwas“ anderes reingeschrieben als 1 (ist immer die UVR), 56 (ist immer das CMI) oder 10 (ist bei mir ioBroker). Ich sage euch, bevor ich das rausbekommen hab bin ich fast verzweifelt).
Die Funktion: bleibt immer auf 06.
Die Adresse: ist frei wählbar (nun schon die dritte Adresse, die wir neben der in der UVR und der im CMI unter Eingängen einstellen müssen) und wird dann im ioBroker zur Zuordnung des Datenpunktes verwendet. Auch hier habe ich (möglichst) die gleichen Werte verwendet.
Den Rest der Werte habe ich default gelassen.
Bei den digitalen Werten sieht das übrigens so aus:
Weil ich übrigens nicht wusste, ob der ioBroker eine fortlaufende ID für die analogen und digitalen Werte aus dem CMI benötigt, habe ich mit der ersten Adresse: 11 für meine digitalen Werte begonnen.
- Als nächstes müssen die Werte im ioBroker abgeholt werden. Wenn der modbus bei euch läuft und keine Fehler wirft, dann könnt ihr mittels der Holding Register die analogen Werte einlesen. ACHTUNG: Der Modbus Adapter wird vermutlich erst grün, wenn ihr mindestens ein Register konfiguriert habt. Ansonsten bleibt er gelb.
Wie ihr sehen könnt, ist die verwendete Adresse das Wichtigste, um den korrekten Wert zu identifizieren. Der Name und die Beschreibung hat wieder (mal) nichts mit den Bezeichnungen zu tun, die ihr vorher in der CMI oder UVR verwendet habt. Ihr könnt hier also wieder eure eigene Bezeichnung eintragen. Der Typ des Datenpunktes muss übrigens mit den in der CMI konfigurierten Datentyp: und Byte-Reihenfolge: übereinstimmen (siehe Screenshot oben). Auch davon hab ich keine Ahnung und die Doku dazu habe ich nicht verstanden. Unter Role habe ich für die Temperaturen den Wert value.temperature verwendet. Das erschien mir als die passendste Option. Bei der Anzahl der Brennerstarts und der Brennerlaufzeit hab ich nur value verwendet.
-
Die digitalen Werte schreibt ihr in die Diskreten Ausgänge:
-
Jetzt sollten im ioBroker die Werte (nach und nach, hat bei mir bis zu 5min gedauert, also Geduld ) unter Objekte/ modbus.0 auftauchen:
(Grafana kommt noch)
-
-
Teil 2 – Werte in Grafana einbinden (DRAFT)
Da ich mit Grafana noch nicht so weit bin, hab ich mal DRAFT in die Überschrift geschrieben. Ich denke, dass sich da nach und nach noch Erweiterungen ergeben, die es lohnen hier erwähnt zu werden. Z.B. plane ich die Anzeige von analogen und digitalen Werten in einem Graphen. Zum Glück habe ich Kollegen, die bei uns die Grafana Installation verwalten und die ich dazu befragen kann.
Zuerst gehe ich davon aus, dass ihr bereits eure Grafana Installation und die dazugehörige Datenbank (bei mir InfluxDB) installiert und konfiguriert habt. Anleitungen dazu gibt es sehr gute z.B. bei Youtube.Das erste was ihr machen müsst ist, die im Teil 1 erzeugten Werte aus den Objekten im ioBroker in die Datenbank zu schreiben. Dazu müsst ihr im Objekt Browser das jeweilige Objekt auswählen und mittels Edit bearbeiten:
Dort setzt ihr den Haken bei InfluxDB und speichert ab. Und schon "fließen die Werte in die Datenbank".Im Grafana erstellt ihr euch ein neues Dashboard (ich hab meins Heizung genannt) und im Dashboard ein neues Panel:
Im Panel wählt ihr zuerst die Datenquelle aus. Es gibt default und bei mir InfluxDB. Das ist das gleiche bzw. die default DB ist die InfluxDB, sofern ihr wie ich nur die eine DB installiert habt. Ansonsten wählt halt die richtige bei euch aus.
Dann klickt ihr auf select measurement und bekommt direkt die zur Verfügung stehenden Werte zur Auswahl angezeigt.
Damit der Graph dann noch etwas schöner aussieht, wählt ihr bei Group By statt der default Einstellung fill (previous) aus. Das sorgt dafür, dass für Nullpunkte der Wert des vorherigen Datenpunktes angenommen wird und dadurch eine schönere Linie angezeigt wird.
Außerdem habe ich noch einen sprechenden Namen vergeben, denn der Standardwert heißt so wie euer Objekt in ioBroker.Wenn ihr jetzt abspeichert, werden schon die Werte, die in der Datenbank vorhanden sind in Grafana angezeigt.
Es macht manchmal Sinn, der Grafik noch etwas mehr Informationen wie Min, Max und aktueller Wert hinzuzufügen. Dazu wählt ihr in der rechten Navigation unter Legend folgendes aus:
und damit sieht das Ganze nun so im Graphen aus:
Speichert das Dashboard nun ab.
Hinweis: Ihr werde sicherlich bei der Einrichtung von Grafana mit der grafana.ini Bekanntschaft gemacht haben. Macht nicht den gleichen Fehler wie ich, nämlich anzunehmen, dass die im Terminal anders als die Kommentare gefärbten und mit vorgestellten ; versehenen Parameter nicht auskommentiert sind.
Das Semikolon muss entfernt werden, damit die Option angezogen wird. -
@paul53 Danke schön Paul. Habs eingebaut und es funktioniert.
-
@hennerich
vielen Dank für Deine Anleitung. -
@hennerich
Vielen Dank für die Anleitung.
Ich spiel mich nun schon seit Tagen mit meinem CMI Modul und dem Modbus Adapter, aber ich bekomm es nicht zum Laufen. Der Modbus Adapter startet zwar bleibt aber gelb. Die Verbindung mit Modbus kann nicht aufgebaut werden. Mein iobroker rennt auf einer Syno NAS mit Docker. Muss ich da irgendwelche Ports weiterleiten oder frei geben? Die Firewall der NAS hab ich schon abgedreht. Weiß da jemand eine Lösung? -
@HeKo
Grüß dich, die Anbindung mit der CMI mittels Modbus ist tatsächlich nicht nachvollziehbar. Gerade die Tatsache mit der IP Adresse ist schon kurios und selbst nach weiteren Modbus Updates immer noch so.
Was ich bei der Anbindung meiner PV Anlage via Modbus gemerkt habe ist, dass dort die Verbindung erst grün wird, sobald man auch Register konfiguriert hat.
Hast du das schon? Falls nicht, versuch das bitte mal. Ports musste ich keine freischalten. Ich hab eine Fritzbox bei mir zu Hause am Start. -
@hennerich
Danke, das war die Lösung. -
@HeKo
...habs mal oben im Punkt 7 noch ergänzt