NEWS
iobroker, MQTT und Shelly - Was geht wie?
-
@laser Ich habe keine Ahnung mit was Du schaltest. Das hat ja mit MQTT erst mal nichts zu tun, sondern mit Deiner Logikmaschine mit der Du schaltest.
Wenn das der Scheduler im Shelly selbst ist, dann musst Du halt schauen, dass der Shelly die richtige Zeit hat, wenn Du puzzelst, dann ist da halt was verkehrt, aber da können Dir die Puzzlefreunde besser helfen. Ich bin bekanntlich kein Verfechter dieser Puzzleteilchen.
-
@mickym Ich schalte über MQTT. Umweg über einen Alias.
Ist ja irre! Ein Scheduler war drin! -
@laser sagte in iobroker, MQTT und Shelly - Was geht wie?:
@mickym Ich schalte über MQTT. Umweg über einen Alias.
Ist ja irre! Ein Scheduler war drin!Na dann hast Du ja den Fehler gefunden. Aber wie gesagt auch wenn Du über MQTT oder einen Alias schaltest, ist der Trigger ja entweder eine Logikmaschine oder ein Trigger im Shelly selbst. Sprich über welchen Weg Du schaltest ist erst mal unwichtig, wichtig was ja den Trigger zu finden und das hast Du ja nun getan.
-
@mickym Da ist eigentlich nur ein Script, welches den Shelly schaltet. Und weil 14 Uhr im Programm und 2 Uhr schaltet die Kiste, dachte ich irgendwie an 24/12 Stunden Problem. Ein Witz, daß der Scheduler ausgerechnet auf 2 Uhr stand.
-
@laser Na ja wie gesagt, vielleicht hat das auch was mit dem Shelly Adapter zu tun gehabt (den ich nicht kenne), dass Du über diesen Adapter auch intern den Scheduler ansteuern kannst. Soweit ich weiß, hattest Du doch den Shelly mal mit dem Adapter angesteuert.
-
@mickym Schwer zu sagen, wie der Scheduler da rein kam. Ich dachte eigentlich, der Shelly war neu. Der Shelly- Adapter ist schon gut. So wie alle Adapter, wenn Sie gepflegt werden. IO Broker lebt doch von den Adaptern. Man kann nicht immer im Urschleim anfangen. Da löst man nie anspruchsvolle Aufgaben, weil die Zeit irgendwann nicht mehr reicht.
-
@laser Klar sind Adapter gut, aber sie bringen halt grundsätzlich eine zustätzliche Fehlerquelle mit und interpretieren halt die Dinge, die sie kennen. Sobald was neu ist, muss ein Entwickler wieder dran.
Ich nutze ja auch Adapter, die Dinge oder APIs toll verkapseln (ein hervorragender Adapter ist zum Beispiel der mercedes-me Adapter, den ich hier mal besonders lobend herausstellen will, weil hier das mit der Authentifizierung nicht einfach ist und bei Problemen quasi noch am gleichen Tag vom Entwickler eine Lösung bereitgestellt wird). Aber alles was mqtt spricht betreibe ich lieber direkt, da braucht es in meinen Augen keine Adapter. mqtt ist ein allgemeines Protokoll und leicht lesbar. Man muss sich also nur mit den topics etc. auskennen und die Basis von JSON und das ist wirklich kein Hexenwerk.
Teilweise ist das ja auch alles historisch gewachsen. Und über die Aliasfunktion, die ja nun richtig komfortabel ist, kann man auch selbst viele Dinge quasi "standardisieren".Aber lasser wir lieber die Diskussion, ich hab mir hier mit meiner Meinung schon genug Ärger zugezogen.
Jeder hat halt so seine Meinung und das ist auch gut so. Ich bin ja wie gesagt auch kein Puzzlefreund und finde die "roten Knoten" viel mächtiger, wenn man nicht herkömmlich codieren will.
-
@mickym Hallo mickym, ich stehe genau vor dem von Dir geschilderten Problem. Für meine neue WP habe ich einen neuen 3Phasen Shelly Energiezähler installiert. Aber dieses Gerät wird (noch) nicht vom Shelly Adapter unterstützt. Einen HW request habe ich in Github gestellt, aber KA wann der eingebaut wird.
Mit dem Mqtt Server kann ich die json Daten sehen. Jetzt habe ich einige Daten und überlege, wie ich die in verschiedenen DP bekomme.
Vielleicht kannst Du mir erklären, wie ich die Leistungsdaten ( z.B. Gesamtleistung war gerade 2,8kw = total_act_power":2865.999, und wenn möglich je Phase) in DP bekomme?Hier die json:
{"src":"shellypro3em63-..........."shellypro3em63-........./events","method":"NotifyStatus","params":{"ts":............,"em:0":{"id":0,"a_act_power":-932.3,"a_aprt_power":2434.9,"a_current":10.391,"a_freq":50.0,"a_pf":0.38,"a_voltage":234.5,"b_act_power":2215.8,"b_aprt_power":2462.7,"b_current":10.524,"b_freq":50.0,"b_pf":0.90,"b_voltage":234.1,"c_act_power":1582.4,"c_aprt_power":2779.7,"c_current":11.904,"c_freq":50.0,"c_pf":0.57,"c_voltage":233.5,"n_current":null,"total_act_power":2865.999,"total_aprt_power":7677.312,"total_current":32.819}}}
-
@hal Nun du kannst Dir entweder Aliase erstellen, für die Datenpunkte, die Dich interessieren:
https://forum.iobroker.net/post/980575Oder Du nutzt Deine Logikmaschine. Wenn Du NodeRed nutzt, habe ich auch einen Flow der Dir alles in einzelne Datenpunkte zerlegt, aber das braucht man in der Regel nicht.
Also nachdem Dein Objekt ein Doppelpunkt enthält und auch deine Daten nicht sauber sind, habe ich das hier mal mit einem Alias für Dich nachgebaut:
Also wenn Dein Datenpunkt diesen JSON enthält:
{ "method": "NotifyStatus", "params": { "em:0": { "id": 0, "a_act_power": -932.3, "a_aprt_power": 2434.9, "a_current": 10.391, "a_freq": 50, "a_pf": 0.38, "a_voltage": 234.5, "b_act_power": 2215.8, "b_aprt_power": 2462.7, "b_current": 10.524, "b_freq": 50, "b_pf": 0.9, "b_voltage": 234.1, "c_act_power": 1582.4, "c_aprt_power": 2779.7, "c_current": 11.904, "c_freq": 50, "c_pf": 0.57, "c_voltage": 233.5, "n_current": null, "total_act_power": 2865.999, "total_aprt_power": 7677.312, "total_current": 32.819 } } }
Dann ist da ein Doppelpunkt bei dem em:0 drin - und den musst Du dann in Deiner Konverierungsfunktion, wie folgt schreiben:
JSON.parse(val).params['em:0'].total_act_power
Dann erhälst du im Alias auch Deinen Wert einzeln.
-
@mickym boah super DANKE, ich schaue mir das später richtig an und versuche das so umzusetzen.
Hat geklappt , nochmals DANKE !
-
@mickym noch eine Frage, der Wert wird normal angezeigt, im log steht aber :
Invalid read function for "alias.0.WP_Leistung": "JSON.parse(val).params['em:0'].total_act_power" => Cannot read properties of undefined (reading 'total_act_power')
Muss ich da noch etwas definieren ?
-
@hal Nein - ausser es kommt zu diesem Zeitpunkt ein Wert rein, der nicht das ganze Objekt enthält. Ich weiß aber auch nicht, wie man das unterdrückt.
-
@hal wenn es zu sehr nervt, dann nimm deine Logikmaschine und schreib Dir selbst einen Datenpunkt unter 0_userdata.0
-
@mickym Alles klar, Danke
-
@mickym
Hallo mickym, leider wird mein log jetzt massive von den Alias Fehlern vollgeschrieben und ich muß einen anderen Weg finden. Mit Blockly habe ich es versucht, bin aber auch nicht erfolgreich gewesen:
Du hast von einem NoteRed Flow geschrieben, der die einzelnen DP erzeugt. Kannst Du mir den zur Verfügung stellen ?
-
@hal sagte in iobroker, MQTT und Shelly - Was geht wie?:
Du hast von einem NoteRed Flow geschrieben, der die einzelnen DP erzeugt. Kannst Du mir den zur Verfügung stellen ?
Klar - Du musst den nur importieren:
https://forum.iobroker.net/topic/43856/json-oder-javascript-objekt-in-iobroker-datenpunkte-zerlegen
Ich habs gerade auch nochmal getestet, funktioniert ohne Fehler:
Kannst auch direkt importieren:
Du musst nur im Node-Red Adapter das Erstellen von Fremdobjekten zulassen:
Diese Node erzeugt Dir dann folgenden Ast aus einzelnen Datenpunkten:
-
@hal Ich habs aber gerade auch nochmal im Blockly für Dich probiert und so funktioniert es meines Erachtens:
Du musst Dich halt den Pfad lang schlängeln:Hier der Import:
Aber wie gesagt, wenn Du meinen NodeRed Flow nehmen und wenn Du den ganzen Shelly triggerst und keepTopic gleich true verwendest, wird Dir auch der ganze Baum zerlegt.
-
9@mickym Jetzt habe ich die Qual der Wahl
Sowohl RedNote als auch Blockly funktionert .
DANKE . -
@hal Wenn Du mit dem Flow den ganzen Baum exportierst, dann sieht das so aus:
Da kannst Du den 1. Teil dann wieder mit einer Text Node kürzen, dass dan mqtt.1.shellies zum Beispiel nicht mitkommt.
Also das gleiche Beispiel nur der Anfang des Topics weggekürzt:
In diesem Fall, lässt Du bei keepTopic einfach den Teil des topic durch einen Leerstring ersetzen:
Wichtig ist halt dass Du über Wildcard Deinen ganzen Ast bzw. alle Datenpunkte Deines Shellies triggern lässt.
Aber wenn beides funktioniert, dann hast Du ja nun wieder alle Möglichkeiten. -
@hal Falls Du übrigens auch in Node-Red nur EINEN Wert und nicht das ganze JSON Objekt extrahieren willst, geht das genauso einfach wie in Blockly. Du musst das ganze mit einer JSON NOde nur in ein Objekt verwandeln:
Hier auch zum Ausprobieren: