NEWS
Shelly plus 1pm OTA Tasmota flashen
-
@frankd sagte in Shelly plus 1pm OTA Tasmota flashen:
Das "failed to update" kommt extrem schnell
Dann wird, so macht man das eigentlich auch, Shelly wohl eine Prüfsumme haben. Damit kann man Übertragungsfehler erkennen und verhindern, dass man bei einer defekt geladenen "bin" das Device zerflasht.
Die FW erwartet jetzt eine "bin" mit einer Prüfsumme "123", die tasmota.bin hat aber "456" (mal ganz einfach gesprochen).
Daran kannst du so nichts ändern, außer halt direkt per FTDI mittels RX/TX flashen, denn da schickt er die bin 1:1 und prüft vorher nichts, da im Flashmodus dann nichts von der Original-Firmware mehr läuft, sondern nur noch die rudimentäre Flashroutine des ESP-Chips. Du musst es leider nochmal per Kabel versuchen... -
Lt Shelly API Dokumentation sollte es so gehen
curl http://${SHELLY}/ota?url=http://third-party-firmware.site/path/to/image.zip
Das Beispiel hat ein zip - kann also sein, dass das Web-Interface den Fehler rauswirft, weil es ein ungeziptes Bin bekommt.
https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Shelly#http-endpoint-otaEDIT:
Weitergesucht und dies gefunden:
https://github.com/tasmota/mgos32-to-tasmota32
Da sind die bins gezipt.Ich kann das leider gerade nicht probieren, weil kein Testgerät verfügbar.
-
Was ist der Vorteil von Tasmota auf dem/den Shelly(s) ?
-
- vergisst zum Bespiel die Zählerstände nach einem Reboot nicht
- Direkte Emulation von Steckdose oder Licht für Alexa & Co ohne Cloud/Skill
- Dank Rules mehr Möglichkeiten für Automatisierung
- Zeitpläne auch ohne App oder Cloud
- ab ESP32 Modellen auch kleine Skripte direkt auf dem Gerät
- Automatische Backups der Konfiguration möglich (ich nutze https://github.com/danmed/TasmoBackup) und so einfach Austausch bei einem Defekt (ich habe über 100 Geräte und ja, da geht auch mal eines kaputt)
- Tasmota auch für ESP8266 oder ESP32 direkt verfügbar für eigene Projekte - Kleine Info-Display, Kühlschranküberwachung, Temperaturfühler mit mehreren Sensoren, Alte Haustürklingel mit 4x Mono-D smart machen sind einige meiner Projekte.
- Geräte verschiedener Hersteller bekommen so eine einheitliche Oberfläche (Shelly, Sonoff, Blitzwolff, Nous usw.) und Bedienformat
- mir fällt bestimmt noch mehr ein ...
-
@bananajoe OK.
Danke für die Auflistung. Habe bisher erst 5 Shelly im Einsatz und deshalb die Frage.
-
Hi,
nur zum Verständnis - wieso verwendet Ihr nicht das hier :
https://github.com/tasmota/mgos32-to-tasmota32Da braucht nichts an den Shelly gelötet werden, sondern die Datei wird (über den angegebenen Link) direkt über die Weboberfläche geflasht.
-
@BananaJoe und @all,
der Thread ist schon älter, erscheint mir aber der richtige zu sein.
Ich möchte die Leistung meines BKW sinnvoll messen und diese Messwerte auch für weitere Berechnungen verwenden.
Es kommt dafür aus praktischen Gründen ein Shelly Plus 1 PM zum Einsatz. Leider zappeln die Messwerte ziemlich rum und kommen auch in unregelmäßigen Abständen.
Daraus kann ich keine Werte gewinnen, mit denen man sinnvoll rechnen kann. Daher spiele ich mit dem Gedanken den PM auf Tasmota zu flashen.Fragen dazu:
Bietet der mit Tasmota geflashte Shelly dann auch die Möglichkeit in definierten Zeitabständen (1Min.) einen Mittelwert mittels MQTT an den iobroker zu senden?
Die mir bekannten Tasmotas wie Nous A1T und der Hichi IR Adapter bieten diese Option ja out of the box.
Und ist nach dem Flashen auch ein Abgleich der Spannungs- und Stromwerte möglich wie bei den genannten Geräten?Danke und Gruß
-
@opöl So ein Shelly der mit Tasmota geflasht wurde verhält der sich genauso und sieht auch so aus wie du das von deinen Nous kennst (einmal das richtige Template eingestellt und Kalibriert).
Wie oft er die Leistungsdaten per MQTT sendet kann du über die
TelePeriod
einstellen, Default ist meine ich300
für 300 Sekunden, das kleinste ist 15 Sekunden, ich habe was Strom misst zumeist auf 60 Sekunden. Die Solaranlagen auf 15 Sekunden damit es schöne Kurven gibt und meine Statusanzeige sich schneller aktualisiert. -
vielen Dank. Hat soweit geklappt mit dieser Anleitung:
https://github.com/tasmota/mgos32-to-tasmota32
Das originale gezappel der Messwerte ist jetzt unter Kontrolle, die Werte gleichen sehr einem Nous Adapter, der zur Kontrolle mitläuft. Im ersten Ansatz habe ich nur geflasht nach der Anleitung und habe zeitweise noch längere Aussetzer des Shellys. Das heißt, dass er zeitweise keine Werte liefert, sich dann aber wieder von selbst fängt. Gerade habe ich noch auf die aktuelle FW aktualisiert. Mal sehen, wie es morgen aussieht.Nun habe ich noch zwei Fragen. Vielleicht kannst Du mir auch dabei helfen.
-
Kann man die Tasmota Geräte (Hichi IR, Nous, geflashte Shellys) auch aktiv via Script abfragen? Grund ist, dass ich Berechnungen durchführen möchte und die Messwerte idealerweise zur gleichen Zeit zur Verfügung stehen sollten.
-
Bei einem zweiten Plus 1 PM bin ich nach den Flashen bei der Eingabe des Web Admin Passworts abgelenkt worden. Was soll ich sagen… Ich kann mich nicht mehr an die Web Oberfläche anmelden. MQTT und iobroker Anbindung funktioniert aber. Hast Du oder sonst jemand aus dem Forum die Möglichkeit das Ding gegen Aufwandsentschädigung wieder zugänglich zu machen? Entweder mit originaler Shelly oder Tasmota SW. Ich möchte das Gerät nicht einfach entsorgen, sondern mit Blick auf die Ressourcen gerne wiederbeleben.
Danke und Gruß
-
-
@opöl zu 1: Ja, per http-Request. kannst du dir die Werte auch holen:
http://{HOST.IP}/cm?user={$TASMOTA_USER}&password={$TASMOTA_PASSWORD}&cmnd=Status%208 {HOST.IP} = IP des Gerätes {$TASMOTA_USER} = admin {$TASMOTA_PASSWORD} = dein Passwort cmnd=Status%208 = Führe den Befehl "Status 8" aus, %20 = Leerzeichen
Alternativ kannst du auch per MQTT im
cmnd
Zweig (da wo auch POWER steht) ein TopicStatus
mit dem Wert8
senden, das Triggert das Senden des Wertes unmittelbar an. Das passiert auch beim http-Request.zu 2:
Du könntest GPIO0 und GND für 40 Sekunden miteinander verbinden nachdem du den Shelly mit Strom versorgt hast. Das könnte aber gefährlich sein (Da der dann an 230V hängt, oder du hängst den solange an 12V)Einfacher wäre den einfach noch mal zu flashen (also per Kabel) mit vorherigem Löschen. Jetzt müsste man einen Flasher haben der die Option bietet, wenn man den Webflasher nimmt sehe ich die Option da nicht.
Der hat doch einen Knopf auf der Rückseite, Reset könnte klappen wenn der Shelly Saft hat und du diesen Knopf länger als 40 Sekunden drückst.
Ansonsten gäbe es noch die Tasmota "Quick Power" Methode:
- Gerät mit Strom Versorgen und eine Minute oder mehr so lassen
- Gerät für 30 Sekunden vom Strom trennen
- Gerät 6 mal Ein und wieder Ausschalten, der Abstand zwischen den einzelnen Ein- und Aus muss weniger als 10 Sekunden betragen
- Gerät nach dem letzten Aus wieder Einschalten und An lassen. Es sollte nun auf Werkseinstellungen stehen.
Siehe auch: https://tasmota.github.io/docs/Device-Recovery/
-
Das Wiederbeleben hat geklappt, vielen Dank. Für die Nachwelt:
Meinen 1. Plus 1 PM, aus dem ich mich ausgesperrt hatte, habe ich mit dem Reset Knopf auf der Rückseite (40 Sekunden betätigen) dazu bekommen, wieder das Tasmota Netz aufzuspannen. Danach konnte ich ihn wie gewohnt konfigurieren. Die vorher geflashte Tasmota Version blieb dabei erhalten.
Ein 2. Plus 1 PM blieb nach dem Flashen per .zip File von hier: https://github.com/tasmota/mgos32-to-tasmota32
in der "Safeboot" Schleife hängen. Das Gerät war im WLAN ansprechbar, hat aber nur die Temperatur gezeigt. Nach einem OTA per Update URL wie hier beschrieben:
https://github.com/yaourdt/mgos-to-tasmota
war auch dieses Gerät im Leben zurück.Die "Quick Power" Methode hat bei meinen Shellys leider nicht funktioniert.
Der Shelly Plus 1 PM, den ich für dieLeistungsmessung meines BKW einsetze, ist sich seit dem Flashen mit Tasmota auch weitgehend einer Meinung mit der zur Kontrolle eingesetzten Nous Steckdose (auch mit Tasmota), was die BKW Leistung angeht. Beide sind aber speziell bei größeren Änderungen der Leistung nicht der gleichen Meinung wie der Boss (Deye) WR, außerdem gibt es hin und wieder noch Ausreißer, die sich nicht durch Änderung der Einstrahlung erklären lassen. Kannst Du solche Ausreißer bei den Messwerten auch bestätigen und wenn ja, wie kompensierst Du das?
Dein o.g. Tipp, mit dem die Tasmotas direkt ausgelesen werden können klappt ebenfalls super:
http://{HOST.IP}/cm?user={$TASMOTA_USER}&password={$TASMOTA_PASSWORD}&cmnd=Status%208 {HOST.IP} = IP des Gerätes {$TASMOTA_USER} = admin {$TASMOTA_PASSWORD} = dein Passwort cmnd=Status%208 = Führe den Befehl "Status 8" aus, %20 = Leerzeichen
Auslesen meines Hichi Stromzählers ergibt:
{ "StatusSNS": { "Time": "2024-03-09T18:44:14", "Stromz": { "Counter": 14597.6, "Watt_L1": 121.92, "Watt_L2": 0, "Watt_L3": 79.62, "Power": 201.57, "Volt_L1": 230.7, "Volt_L2": 230.3, "Volt_L3": 230.8, "Total_out": 0 } } }
Könntest Du mir noch einen Code Schnipsel geben der zeigt, wie ich das per Java Script umsetze, um die einzelnen Werte in Variablen zu bekommen?
Mein Ziel ist es ja, für Berechnungen und zur Automatisierung die Geräte gezielt abzufragen, damit Messwerte mit annähernd gleichem Zeitstempel vorliegen. Dann könnte ich diese Werte auch per Script in die DB schreiben und auf die MQTT Messages der Geräte verzichten.
Vielen Dank und Gruß
-
@opöl müsste - wenn ich mich nicht vertan habe - auf Anhieb funktionieren.
Pfade, Adressen, Passwort anpassen!<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</variable> <variable id="1dcL`^?r}+f7z~SP)(ud">JSONWert</variable> <variable id="nQ8OGR590H_l`?A^^;Wo">Einheit</variable> <variable id="481|Dt$rVMnSnlk,J!1?">JSON_Value</variable> <variable id="de{+~TZqTNY6TW,2vZ_0">Stammpfad_Hichi</variable> <variable id="3ME[S-]bgXBpt[S)a=I*">JSON_Object</variable> <variable id="}blX?6,REU$3TVqk[0|r">Benutzer</variable> <variable id="OZAhl(+T)M6^~0UBwO~A">Passwort</variable> <variable id="5_yg^SSe`K/^74FWi4:)">IP_Adresse</variable> <variable id="dQ86e:G0lqzF/yxQSsIY">result</variable> </variables> <block type="procedures_defcustomnoreturn" id="l(.(|wVZ(GS{-P%@qK=|" x="38" y="-962"> <mutation statements="false"> <arg name="Stammpfad" varid="??n.IB}@F$R+yuB8Pj_S"></arg> <arg name="JSONWert" varid="1dcL`^?r}+f7z~SP)(ud"></arg> <arg name="Einheit" varid="nQ8OGR590H_l`?A^^;Wo"></arg> </mutation> <field name="NAME">CreatyMyStateV2</field> <field name="SCRIPT">aWYgKEVpbmhlaXQubGVuZ3RoID09PSAwKSB7DQogICAgYXdhaXQgY3JlYXRlU3RhdGVBc3luYyhTdGFtbXBmYWQgKyBKU09OV2VydCwgMCwgeyB0eXBlOiAnbnVtYmVyJywgcmVhZDogdHJ1ZSwgd3JpdGU6IGZhbHNlIH0pOw0KfSBlbHNlIHsNCiAgICBhd2FpdCBjcmVhdGVTdGF0ZUFzeW5jKFN0YW1tcGZhZCArIEpTT05XZXJ0LCAwLCB7IHR5cGU6ICdudW1iZXInLCByZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UgLCB1bml0OiBFaW5oZWl0IH0pOw0KfQ==</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> <block type="procedures_defnoreturn" id=")wl+9Qrk`.UZ@vOm*Z;v" x="38" y="-912"> <mutation> <arg name="JSON_Value" varid="481|Dt$rVMnSnlk,J!1?"></arg> </mutation> <field name="NAME">WriteToState</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="control_ex" id="hNvq`6;2Z0BVTBTD=l+!"> <field name="TYPE">false</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="OID"> <shadow type="field_oid" id="C]`KNdvfy+4E1E^WN{5A"> <field name="oid">Object ID</field> </shadow> <block type="text_join" id="FX/{iZD7Uej7ddPz4xkN"> <mutation items="2"></mutation> <value name="ADD0"> <block type="variables_get" id="(OeMfaw27fwM%=;CJ0MA"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="cQ]Y(,I7GF_)ON=-*iVJ"> <field name="VAR" id="481|Dt$rVMnSnlk,J!1?">JSON_Value</field> </block> </value> </block> </value> <value name="VALUE"> <shadow type="logic_boolean" id="dLL+]Q?WZ8wDoG6wkn(G"> <field name="BOOL">TRUE</field> </shadow> <block type="get_attr" id="wKLe[f8ZY{2LFX=Zif=i" inline="false"> <value name="PATH"> <shadow type="text" id="]cG4fgRAdpJFupi@AoIl"> <field name="TEXT"></field> </shadow> <block type="text_join" id="~t1W.@J]$%=EN~+FeB,v"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="bs1t`e0#019cyRmka:[%"> <field name="TEXT">StatusSNS.Stromz.</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="9Ky[tx~(fn}tvXRrcb;n"> <field name="VAR" id="481|Dt$rVMnSnlk,J!1?">JSON_Value</field> </block> </value> </block> </value> <value name="OBJECT"> <block type="variables_get" id="lM}O8!Ok,4~4-%fvB%XZ"> <field name="VAR" id="3ME[S-]bgXBpt[S)a=I*">JSON_Object</field> </block> </value> </block> </value> <value name="DELAY_MS"> <shadow type="math_number" id="?#T4d(2@aMV`N5N8esHW"> <field name="NUM">0</field> </shadow> </value> </block> </statement> </block> <block type="comment" id="nAbszD8.ekn0PcQ/Q2.y" x="38" y="-587"> <field name="COMMENT">Pfad wo die Objekte angelegt werden sollen</field> <next> <block type="comment" id="hx5VP1-ch5_hQb!c^8XT"> <field name="COMMENT">. Punkt am Ende nicht vergessen!</field> <next> <block type="variables_set" id=";K--N08duhPa$a]$B@DG"> <field name="VAR" id="de{+~TZqTNY6TW,2vZ_0">Stammpfad_Hichi</field> <value name="VALUE"> <block type="text" id="aHOB#1%1UFsbW.6^q-]t"> <field name="TEXT">0_userdata.0.000-Testen.Hichi.</field> </block> </value> <next> <block type="comment" id="_2_7}Ds4`i~UUr6azPA!"> <field name="COMMENT">Zugangsdaten Hichi</field> <next> <block type="variables_set" id="r1kbopWpMPP5cwZhwTAa"> <field name="VAR" id="}blX?6,REU$3TVqk[0|r">Benutzer</field> <value name="VALUE"> <block type="text" id="NWP)JE:,j|fkZe%?C50/"> <field name="TEXT">admin</field> </block> </value> <next> <block type="variables_set" id="8-f/Sb%Fd61WR2c3?T9P"> <field name="VAR" id="OZAhl(+T)M6^~0UBwO~A">Passwort</field> <value name="VALUE"> <block type="text" id="n5Q,:?Ngbqj@VS~uSDeK"> <field name="TEXT">meinpasswort</field> </block> </value> <next> <block type="variables_set" id="[ow`@Wx^QRxtoNI04~R:"> <field name="VAR" id="5_yg^SSe`K/^74FWi4:)">IP_Adresse</field> <value name="VALUE"> <block type="text" id="W.ghF|2Zd^l)my]:z:o{"> <field name="TEXT">192.168.1.167</field> </block> </value> <next> <block type="comment" id="vg(|^)ui$k[QUMd9P3}E"> <field name="COMMENT">Datenpunkte anlegen</field> <next> <block type="procedures_callcustomnoreturn" id="{Vrmrelmqo6`1tv~hR3o" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="|z,l*k)_KTg!GVUB6jcY"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="TPz)p_M:fntJ3l8MT#uk"> <field name="TEXT">Counter</field> </block> </value> <value name="ARG2"> <block type="text" id="`=hQ`,|k7v[xn;*:y`Vo"> <field name="TEXT"></field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="s/7}m:0;oNDv=mH`zOB/" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="v9z?0yqW6I:Y5?M}gNC#"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="qv](l/?Tz!PV`!PRv`|["> <field name="TEXT">Watt_L1</field> </block> </value> <value name="ARG2"> <block type="text" id=",b-bFy4J.[.}?Vx[{ei5"> <field name="TEXT">W</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="DeLlV`ic~7QaB-+efz?#" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="t9Kh#9Sr`@JnqRWc6Aui"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="-EOlXPWkVBre8!fPb)pX"> <field name="TEXT">Watt_L2</field> </block> </value> <value name="ARG2"> <block type="text" id="FXAvlfhXCk+Md?*.4ZRz"> <field name="TEXT">W</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="gMN7m88;9yfF29G([)}P" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="G_@M(tlpi1tdBRFLw#d+"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="#q1fuLm6$%_AI[`rZ/L5"> <field name="TEXT">Watt_L3</field> </block> </value> <value name="ARG2"> <block type="text" id="GHBs3b-2S$n:|A)~#rpb"> <field name="TEXT">W</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="2XgSJ8DsFUj5MO`i|sRf" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="U?eE;KUyw20H$o{3@?Ks"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id=")_fYO5{-|fAh[|KIY#E="> <field name="TEXT">Power</field> </block> </value> <value name="ARG2"> <block type="text" id="$Ym]u1d,n1(M}4uR{):3"> <field name="TEXT">W</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="/,$`Uie}EPG{;:[bO4Br" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="}Q:$|B6{s|`hiDZ%[+A$"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="FIc|2WxN;L!8y(#?vTkG"> <field name="TEXT">Volt_L1</field> </block> </value> <value name="ARG2"> <block type="text" id="l]E8^-~CC{AQ4`[ND+9E"> <field name="TEXT">V</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="q.,UBQ_;Ay4,ynpy1+6z" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="-|[ICdpZfzLc2#Ex%.GC"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="@ePdzLQwS=:q/U=rH#5c"> <field name="TEXT">Volt_L2</field> </block> </value> <value name="ARG2"> <block type="text" id="K*Hd1},QIV],OS_O4g*|"> <field name="TEXT">V</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="4E$_:EZmQ*%BF|].T/wf" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="zuC=lfYdIlRYRx/{Th7]"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="{$=Y:7JL0KKpOSr9QPwh"> <field name="TEXT">Volt_L3</field> </block> </value> <value name="ARG2"> <block type="text" id="jdR4%D4#V`{hR=)8JP@:"> <field name="TEXT">V</field> </block> </value> <next> <block type="procedures_callcustomnoreturn" id="Hdvy.j|yU)mcr-eGH)mA" inline="true"> <mutation name="CreatyMyStateV2"> <arg name="Stammpfad"></arg> <arg name="JSONWert"></arg> <arg name="Einheit"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="g1Yv?lX.wFDbFG=0i}2m"> <field name="VAR" id="??n.IB}@F$R+yuB8Pj_S">Stammpfad</field> </block> </value> <value name="ARG1"> <block type="text" id="r9MW6?*q.sMXDi_2%?]t"> <field name="TEXT">Total_out</field> </block> </value> <value name="ARG2"> <block type="text" id="*T_dh!T`{14E$^tVEl``"> <field name="TEXT"></field> </block> </value> <next> <block type="comment" id="|GJ7]V-*I/eg1[%IqNx$"> <field name="COMMENT">StatusSNS per http holen</field> <next> <block type="request" id="^eHa^)9[r-Yq6rzvfp_,"> <mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="true"></mutation> <field name="WITH_STATEMENT">TRUE</field> <field name="LOG"></field> <value name="URL"> <shadow type="text" id="Z~ayiLoA2s5H5n8_d@E*"> <field name="TEXT">http://</field> </shadow> <block type="text_join" id="G.RPz+JIMxkjl#gj1|Ym"> <mutation items="7"></mutation> <value name="ADD0"> <block type="text" id="OA3b=!-zzom9Px7D)0*A"> <field name="TEXT">http://</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="vKFPh-E@#T%qHXnXWzcE"> <field name="VAR" id="5_yg^SSe`K/^74FWi4:)">IP_Adresse</field> </block> </value> <value name="ADD2"> <block type="text" id="A2wyc}BvWfj@gIBP3/b4"> <field name="TEXT">/cm?user=</field> </block> </value> <value name="ADD3"> <block type="variables_get" id="lGe]55TlM1dNUqBzRJ!X"> <field name="VAR" id="}blX?6,REU$3TVqk[0|r">Benutzer</field> </block> </value> <value name="ADD4"> <block type="text" id="m$+#}a=JEBQ6j,PV:+la"> <field name="TEXT">&password=</field> </block> </value> <value name="ADD5"> <block type="variables_get" id="]Lx$[U)$,Ve%J/Lhw$v-"> <field name="VAR" id="OZAhl(+T)M6^~0UBwO~A">Passwort</field> </block> </value> <value name="ADD6"> <block type="text" id=")F.YGJMxd8n31*Dp0P#d"> <field name="TEXT">&cmnd=Status%208</field> </block> </value> </block> </value> <statement name="STATEMENT"> <block type="variables_set" id="^_Q(4yi6ApsQnqM.NLU."> <field name="VAR" id="3ME[S-]bgXBpt[S)a=I*">JSON_Object</field> <value name="VALUE"> <block type="convert_json2object" id="FV|/o4I)0At@.[ph%$gF"> <value name="VALUE"> <block type="variables_get" id="k-nB*{cPgm_3#7yoUK`C"> <field name="VAR" id="dQ86e:G0lqzF/yxQSsIY">result</field> </block> </value> </block> </value> <next> <block type="procedures_callnoreturn" id="QY~wI0nzp};pB*.XH,9W" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="2gMHnAin4ZkhC9jhmO*U"> <field name="TEXT">Counter</field> </block> </value> <next> <block type="procedures_callnoreturn" id="Ig;A*u5(IU^6@(b+B%]/" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="e%ecf$ga=FgJ.O^L2SY~"> <field name="TEXT">Watt_L1</field> </block> </value> <next> <block type="procedures_callnoreturn" id="}YHu8yF$@Xl@Y3KSHdj5" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="UHbv4w6/4*7]^!`L1Tv;"> <field name="TEXT">Watt_L2</field> </block> </value> <next> <block type="procedures_callnoreturn" id="BJcdoz?Y^rF=$tO.O0i4" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="UT@(l1hd)vB4,fQ8o3FB"> <field name="TEXT">Watt_L3</field> </block> </value> <next> <block type="procedures_callnoreturn" id="R}%(|{`enKjj-w}K7%(b" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="h#f0?siwP%a]97M[UtLl"> <field name="TEXT">Power</field> </block> </value> <next> <block type="procedures_callnoreturn" id="77*sEXgT$FPwpJu9M{IY" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="zl*UHPOrmcs]?4.wXZFd"> <field name="TEXT">Volt_L1</field> </block> </value> <next> <block type="procedures_callnoreturn" id="/ST~J4!%Bn~r2#),-zG%" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="yY)oJ6Rmk}e0s*i5ofN_"> <field name="TEXT">Volt_L2</field> </block> </value> <next> <block type="procedures_callnoreturn" id="aoATB(vUL-35W504PR5d" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="xJR.kY+f0rceuOVubZ0n"> <field name="TEXT">Volt_L3</field> </block> </value> <next> <block type="procedures_callnoreturn" id="/Vj*:0Q4Qs,ZlYF:g;9T" inline="true"> <mutation name="WriteToState"> <arg name="JSON_Value"></arg> </mutation> <value name="ARG0"> <block type="text" id="sJn/ob%Xu{5hI3BaMch8"> <field name="TEXT">Total_out</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </xml>
Es werden die Datenpunkte angelegt (so das man diese sofort benutzen kann) und dann einmal die Daten geholt und geschrieben.
Nachtrag:
Ich hatte mir gestern zufällig genau so etwas gebaut (Daten von Pylontech per http holen und den JSON auseinander bauen). Da du den JSON gleich mitgeliefert hast, habe ich mein Skript einfach nur anpassen müssen. -
ich habe es mal kurz probiert, aber mit Blockly fremdel ich momentan noch mehr als mit Java Script. Kurzum, es liegt ziemlich sicher an mir, aber aber ich bin mit Deinem Blockly nicht weiter gekommen.
Stattdessen habe ich den Weg mit der direkten HTTP Abfrage mal eruiert. Das sieht bisher sehr gut aus. Ich frage die Werte des Hichi Stromzählers und des Shelly Plus 1 PM (beide auf Tasmota geflasht) alle 6 Sekunden ab und errechne daraus meinen Eigenverbrauch (in 1/10 Wm). Wenn man das System in Ruhe laufen lässt, klappt das bisher auch zuverlässig. Auffällig ist, dass die teilweise langen Aussetzer des Shellys (bisher) nicht mehr auftreten. Mit den Werten kann man rechnen
Der Offset von einem W im Bild kommt von dem Nous Adapter, der im Moment noch zur Kontrolle mitläuft und seine Werte via MQTT übermittelt. Der hat zeitweise noch Aussetzer.Ich habe so den Verdacht, als ob im Zweifelsfall die direkte HTTP Abfrage zuverlässiger ist.
Ich behalte das Ganze noch eine Weile im Auge, aber es sieht im Moment so aus, als ob das der richtige Weg ist.
Danke nochmal für Deine Unterstützung.
Gruß
-
@opöl naja, alle 10 Sekunden über MQTT vs alle 6 Sekunden per Web abfragen.
Du rechnest Bezug gegen erzeugte Solarleistung um den Eigenverbrauch zu erhalten?
Ich rechne da nur die Endsummen gegen ... Stromzähler Bezug aktueller Tag gegen Produktion Solar aktueller Tag. -
ja, wenn der Bezug negativ ist (=Einspeisung) errechne ich aus der Differenz zur PV Leistung die Eigennutzung. Ziel ist ja, ein Gefühl dafür zu bekommen, wieviel einspeist wird und wo es sich lohnt, mittels Verbrauchssteuerung den Eigenanteil zu vergrößern.
Mir geht es weniger um die Abfragefrequenz als um die Zeitstempel der beiden Werte.
Soweit mir bekannt, kann man bei Tasmota nur via Telemetry Period die zeitlichen Abstände einstellen, man hat aber keinen Einfluss darauf, dass die Werte zu einem bestimmten Zeitpunkt gemessen werden. Daher habe ich die Zeitsteuerung per Cron gewählt. Dann kommen die benötigten Werte annähernd gleichzeitig (vielleicht mit einem Delay von ein paar ms) rein.
Ich lasse mich aber bez. der Telemetry Period gerne belehren.Bei den aktuell 6 Messungen / Minute soll es auch nicht bleiben. Ich will schließlich den Raspberry nicht unnötig beschäftigen. Im Moment taste ich mich da noch ran.
Was mich noch interessieren würde ist, ob Du auch solche Aussetzer hast:
Rein mit der PV Strahlung ist das nicht erklärbar, weil zu der Zeit bedingt durch eine geschlossene Wolkendecke eine geringe, aber ziemlich gleichmäßige Einstrahlung vorlag.
Nach dem flashen mit Tasmota ist das deutlich weniger geworden. Vorher, mit der Shelly Software hatte der Plus 1 PM auch öfter mal längere Ausfälle und hat dann keine Daten geliefert.
Auch die hohe Abfragefrequenz ist offensichtlich nicht der Grund dafür.
Kann es eventuell an Störungen liegen, die elektronisch geregelte Verbraucher (DLE mit elektronischer Temperatursteuerung) in das Netz einstreut und die Messungen durcheinanderbringt?Gruß
-
@opöl sagte in Shelly plus 1pm OTA Tasmota flashen:
Soweit mir bekannt, kann man bei Tasmota nur via Telemetry Period die zeitlichen Abstände einstellen
Das kann per Rule oder Scripting selbst bestimmt werden.
längere Ausfälle und hat dann keine Daten geliefert
Prüfen ob der Shelly im Netzwerk bleibt, anpingen, Anmeldungen im Router etc.
-
@opöl Ja, aber Tasmota rechnet die doch schon die Summen aus, also aktueller Tageswert, gestern und Gesamt.
Da muss man doch nur - zu einem beliebigen Zeitpunkt - gegenrechnen. Wenn du es Stundgenau haben willst dann halt jede Stunde und den Wert ablegen.
Mir reichen da Tageswerte. Den Rest sehe ich in der Kurve mit der aktuellen Leistung:
Oben rechts sind die Tageswert von allem, errechnet aus den Tageszählern von diversen Tasmotageräten (Solaranlage, Stromzähler, Klimaanlage, Akku-Einspeisung).Die Kurven und Zahlen unten sind die aktuellen Watt-Werte die ich alle 15 Sekunden von den gleichen Tasmotageräten per MQTT erhalte. Das ganze mit eCharts und "percentil" damit es schön abgerundet ist (sonst ist es ein Zackenmeer)
-
hmmm ich glaube, ich habe mein Problem nicht ausreichend erklärt. Ich versuche es nochmal ausführlicher.
Mein Stromzähler hat eine Rücklaufsperre. Ich sehe also nur die eingespeiste Leistung, es gibt dafür aber keinen Zählerstand. Mein Beitrag vom 9.3. (betreffend JSON) war misweisend, da der gezeigte Zähler für die Einspeisung nicht funktioniert. Der ist von einem Test übrig geblieben. Insofern Sorry.
Also was bleibt, ist die erzeugte PV Leistung und die Einspeisung ins Netz (wenn die Leistung am Zähler negativ wird).
Um also meinen Eigenverbrauch zu ermitteln und somit die Sinnhaftigkeit eines Akkus einschätzen zu können, muss ich diesen und die eingespeiste Energie errechnen.
Und genau das versuche ich hier mit mäßigem Erfolg hinzukriegen, denn nur mit Messwerten, die zum gleichen Zeitpunkt ermittelt wurden, kann man rechnen.
Im Moment hageln mir noch Aussetzer etc. da rein.Aber mal zum Thema eCharts:
Den Adapter habe ich auch installiert und schon mal den einen oder anderen Grafen direkt aus iobroker heraus dargestellt. Im Moment lese ich den Monsterthread dazu.
Dein Bild sieht aber nicht so aus, als ob Du das direkt aus dem iobroker Link heraus erstellt hast.
Hast Du eCharts über / in Vis einrichtet?
Das wäre dann noch eine neue Spielwiese, die vielversprechend aussieht.Gruß
-
Das wird aber schwer da du deinen Gesamtverbrauch nicht kennst.
Ich messe einmal hinter der Solaranlage (wie du) und weis was diese Produziert. Moment, als Watt Wert und in Summe, als kWh für den Tag.Wenn dein Stromzähler das nicht hergibt würde ich an deiner Stelle etwas wie einen Shelly 3EM einbauen (lassen). Kostet um die 100 Euro und zählt in 2 Richtungen (man muss nur die Klemmen richtig rum setzen): https://www.shelly.com/de/products/shop/shelly-3em-1
Den haben schon ganz viele hier im Einsatz, die ersten 1 1/2 Jahre war der auch mein Dreh- und Angelpunkt bis der Stromzähler ausgetauscht wurde und das auch konnte. Der war sich mit meinem alten Ferrari-Zähler einig was den verbrauch anging.
Ich wüsste nicht wie man aus den Leistungsdaten das errechnen sollte und das es genau wäre, das sind ja immer nur Momentaufnahmen. Ja das geht schon, wurde hier im Forum auch schon gemacht (wenn ich jetzt 100W habe und eine Minute später 100W habe ich schon mal 100Wm (Watt Minuten) und das ganze addieren. Wird aber trotzdem ungenau sein.
-
Leider lässt mein Zählerschrank nur noch die Absicherung für den geplanten Anschluss in der TG zu. Platz für einen Shelly 3 EM gibt es da nicht mehr. Das ist ja der Grund für meine Rechnerei.
Ich will ja erst einmal grob überschlagen, wieviel im Jahresverlauf für einen Akku übrig bleiben würde. Bisher bin ich ja auf eine Schätzung der Eigennutzung angewiesen.
Sollte es auf eine Akkulösung hinauslaufen, käme wohl der kleine Maxxicharge in Betracht.
Dann in Verbindung mit einer gescheiten Messeinrichtung wie z.B. einem externen 3 EM und meine temporäre Lösung zur Leistungserfassung ist Geschichte.Im Übrigen bin ich der Meinung, dass bei Messungen im 1/10 Minuten Raster die errechnete Energie sooo ungenau nicht ist. Die Modernen Zähler machen es in Endeffekt auch nicht anders, aber deutlich häufiger.
P.S.: Gerade entdeckt: Bei Tasmota Geräten kann die Anzahl der Nachkommastellen eingestellt werden. Gute Idee, die Shellys auf Tasmota zu flashen. Seitdem laufen die auch wunderbar stabil.
Gruß