New Image v2.0.6

Update: Image v2.0.6

(see english version below)

Hey Leute,

wie ihr ja schon mitbekommen habt, ist das neue Image v2.0.6 online. Nachdem auch das Update für die App endlich von Apple durchgewunken wurde und damit für iOS/Android in wenigen Stunden bereitstehen sollte, hier jetzt der Post zum neuen Image.

Neue Features

  • Neu dazugekommen sind die Unterstützungen für MaxxFan über I2C bzw. die neue Multicom Schnittstelle auf dem Core Pro und für den Bayernlüfter, der komplett über HTTP Requests angesteuert wird.

    • Der MaxxFan liefert leider keine Daten zurück, wir speichern also den Status in NR. Wenn man aber z.B. mit der original Fernbedienung schaltet, können wir den Status nicht wissen. Dafür gibt es einen Reset Knopf, damit wird der Lüfter geschlossen und ausgeschaltet, und wir wissen wieder den aktuellen Stand.
    • Der Bayernlüfter ist da deutlich praktikabler und liefert den Status per einfacher Abfrage. Damit wird der aktuelle Stand immer im Dashboard direkt angepasst.
  • Der neue Lagesensor auf dem Core Pro ist deutlich genauer und wird ab dieser Version vollständig unterstützt. Ob das im Praxisbetrieb einen deutlichen Unterschied macht bleibt allerdings erstmal abzuwarten.

  • Die Daten des Pekaway Wifi Shunt werden direkt über MQTT (bei entsprechender Konfiguration des Shunts) verarbeitet und angezeigt (Shunt über Devices > Pekaway Shunt aktivieren)

  • Ein neuer systemd service sorgt dafür, dass der Wifi-Powersave Modus ausgeschaltet bleibt

Neuer Menüpunkt “Devices”

  • Es gibt im Config Menü einen neuen Punkt “Devices”, dort finden sich jetzt die Einstellungen für die Lüfter, Boiler und die BLE Anbindungen.

Boilersteuerung überarbeitet

  • Es gibt eine automatische Temperaturkontrolle
  • Es gibt Sicherheitslimits (Wasserstand und Temperatur), sollten dieser über- bzw. unterschritten werden, wird der Boiler ausgeschaltet
  • Es gibt eine automatische Boilersteuerung, bei dem die Temperatur über einen einstellbaren Zeitraum gehalten wird
  • Zusätzlich kann ein Boost aktiviert werden, dabei wird zusätzlich die Heizung eingeschaltet, um das Wasser noch schneller zu erwärmen

Änderungen in /boot/firmware/config.txt

Hinweis: Die vorhandene Datei wird NICHT automatisch ersetzt bei einem Online Update!

  • Die CPU-Frequenz ist jetzt festgelegt auf 600-1400MHz (RPI4) bzw. 600-1500MHz (RPI5)
  • arm_boost wurde abgeschaltet
  • Die “act led” wurde umgestellt auf “heartbeat”. Sollte das System hängen, friert auch der Herzschlag ein
  • HDMI wurde abgeschaltet
  • Optionen zum Abschalten des internen Bluetooth Chips wurden hinzugefügt (standardmäßig auskommentiert). Ich werde nochmal eine Anleitung schreiben, wie man mit einem externen USB-Dongle deutlich stabilere Verbindungen hinbekommt.

Weitere Änderungen

  • Neue globale Variable i2c_detect, um verfügbare I2C-Adressen beim Systemstart abzufragen
  • HTTP-API wurde angepasst (Lüfter-Support)
  • Node “get heater stats” wurde überarbeitet (GET /heater):
    • Namen für die App anpassbar in den Zeilen 115/135 (generisch) und 169/173 (Autoterm), allerdings nicht im Dashbaord umsetzbar
  • Neue Kalibrierungstabellen im Flow “Pekaway Shunt + Waterlevel” für 10- bzw. 11-Punkt-Kalibrierung, ADC Werte müssen manuell eingestellt werden. Diese Funktion wurde noch nicht weiter getestet!
  • Updatescript speichert und reintegriert automatisch Flows mit “userflow” oder “user flow” im Namen (muss freistehen, “test123_userflow”/“userflow1” wird nicht funktionieren, “test123 userflow” oder “userflow 2” hingegen schon)
    • Extrahiert alle flows mit “userflow” im Namen
    • Lädt die neuen FLows vom Server
    • die extrahierten Flows werden automatisch wieder eingefügt

App Updates

  • Unterstützung für MaxxFan und Bayernlüfter (Heizungsseite)
  • Vereinfachter Onboardingprozess (IP/Account/Demo)
  • Ladebildschirm zeigt Ziel-IP und/oder gekürzte Mailadresse

LTE-Bridge & Touchdisplay

  • Unterstützen jetzt MaxxFan, Bayernlüfter und Boilersteuerung

Changelog & Download

Ausblick

Das nächste Update ist bereits in Entwicklung und wird nicht mehr allzu lange brauchen. Es bringt:

  • Volle Unterstützung für die neuen Pro-Series Produkte:
    • Dimmy Pro mit RGB
    • In-Out-X Pro für mehr Ein-/Ausgänge
    • Truma Unterstützung über CI-Bus

Langfristig: Umstellung auf Node-RED Dashboard 2.0 mit umfassender Überarbeitung der Software.

English: Update Image v2.0.6

Hey everyone,

As many of you have already noticed, the new image v2.0.6 is now live. With the app update finally approved by Apple, it should be available for both iOS and Android within the next few hours. So here’s the official post about the new image:

New Features

  • Support for MaxxFan via I2C and the new Multicom interface on the Core Pro, plus support for the “Bayernlüfter”, which is controlled entirely through HTTP requests.

    • MaxxFan does not provide feedback. The current state is stored in Node-RED. If you use the original remote, we can’t track changes. A reset button now closes and turns off the fan to re-synchronize state.
    • Bayernlüfter is more convenient as it reports its state via a simple query, so the dashboard is always up to date.
  • The new position sensor on the Core Pro is significantly more accurate and now fully supported. It’s yet to be seen how much impact this has in practice.

  • The data from the Pekaway WiFi Shunt is processed and displayed directly via MQTT (provided the shunt is configured accordingly). To enable it, go to Devices > Pekaway Shunt.

  • A new systemd service ensures that the WiFi power-saving mode remains disabled.

New Config Section: “Devices”

  • A new menu item “Devices” now holds settings for fans, boiler, and BLE integration.

Overhauled Boiler Control

  • Automatic temperature regulation
  • Safety limits (water level & temperature) that shut off the boiler if exceeded
  • Timer-based automatic boiler mode to maintain temperature
  • Boost mode: Activates heater to warm water faster

Changes to /boot/firmware/config.txt

Note: This file is NOT replaced during online updates!

  • Fixed CPU frequency:
    • RPi4: 600–1400MHz
    • RPi5: 600–1500MHz
  • arm_boost disabled to prevent max turbo boost
  • “act” LED now uses heartbeat mode. Should the system freeze, the heartbeat will freeze as well
  • HDMI disabled to save power
  • Option to disable internal Bluetooth (commented out); use of USB dongles is recommended. I will provide a tutorial on how to use an external USB-dongle for much better connections

Other Improvements

  • New global variable i2c_detect queries I2C devices at boot
  • HTTP API updated for fan support
  • Node “get heater stats” (GET /heater) improved:
    • Custom heater names for smartphone app possible (lines 115/135 for generic, 169/173 for Autoterm), it is not possible to set these in the dashboard though
  • New Calibration tables for the “Pekaway Shunt + Waterlevel” flow. ADC values need to be set manually in the editor. This function has not been tested further!
  • The update script automatically saves and reinserts flows with “userflow” or “user flow” in their name (it must be a separate word — “test123_userflow” or “userflow1” will not work, but “test123 userflow” or “userflow 2” will).
    • Extracts all flows with “userflow” in their name
    • Loads new flows from server
    • Re-inserts user flows afterward

Reminder: config.txt is no longer overwritten automatically!

App Updates

  • Support for MaxxFan and Bayernlüfter (shown on heating page if enabled)
  • Simplified onboarding for IP/account setup or demo mode
  • Loading screen shows IP or shortened email address (depending on connection speed, the screen may flash quickly)

LTE-Bridge & Touch Display

  • Both updated to support MaxxFan, Bayernlüfter, and boiler control

Changelog & Download

What’s Next?

The next update is already in development and won’t take long. It will add full support for the new Pro-Series products:

  • Dimmy Pro with RGB support
  • In-Out-X Pro for expanded I/O
  • Truma heater support via CI-Bus

In the long term, we will rebuild the software entirely and upgrade to Node-RED Dashboard 2.0, bringing various quality-of-life improvements and new features.

1 Like

Hallo Vince,

wurde von Euch die Truma Heizung nun integriert?

Gruss, Stefan

Hallo,

Ist eine TouchDisplay-Version mit französischer Übersetzung geplant?


Hello,
Is a version of TouchDisplay with French translation support planned?

Guten Morgen,
Gibt es zufällig auch eine Lösung, das neu angelge Module in der Palette bei einem Update automatisch mit geladen werden.
Gibt es eine Datei in der man das (Die Module)eintragen kann???
Das mit dem userflow ist ja schon mal super :wink:
Gruß Arno

@ahtdf
Im Updatescript ab Zeile 365:

# compare older package.json with new one and ask for merging
echo "comparing original package.json with the new one:"
sleep 3
show_progress "checking package.json"

extramodules=$(diff <(jq --sort-keys .dependencies ~/.node-red/package.json) <(jq --sort-keys .dependencies ~/pekaway/nrbackups/package-backup.json) | grep '>')

if [[ -n $extramodules ]]; then
    echo -e "Your original package.json file has the following additonal modules listed:"
	echo -e "$extramodules"

   if [[ "$1" == "node-red-auto-update" ]] || [[ "$needUpdate" == 'true' ]]; then
	echo -e "updating from Node-RED, adding additional lines automatically."
		# cd ~/.node-red
		echo `jq -s '.[0] * .[1]' ~/.node-red/package.json ~/pekaway/nrbackups/package-backup.json` > ~/pekaway/nrbackups/package1.json && jq . ~/pekaway/nrbackups/package1.json > ~/pekaway/nrbackups/pretty.json && rm ~/pekaway/nrbackups/package1.json && mv ~/pekaway/nrbackups/pretty.json ~/pekaway/nrbackups/package1.json
		echo "Missing lines have been added to package.json"
		echo "New package.json:"
		cat ~/.node-red/package.json
   else
		while true; do
			read -r -p "Do you want them to be added to the new package.json? [y/n]" input
			case $input in
				  [yY][eE][sS]|[yY])
						# cd ~/.node-red
						echo `jq -s '.[0] * .[1]' ~/.node-red/package.json ~/pekaway/nrbackups/package-backup.json` > ~/pekaway/nrbackups/package-backup1.json
						jq . ~/pekaway/nrbackups/package-backup1.json > ~/pekaway/nrbackups/pretty.json 
						mv ~/pekaway/nrbackups/package-backup.json ~/pekaway/package-backup.json # keep backup just in case
						rm -f ~/pekaway/nrbackups/package1.json
						mv ~/pekaway/nrbackups/pretty.json ~/.node-red/package.json
						echo "Missing lines have been added to package.json"
						echo "New ~/.node-red/package.json:"
						cat ~/.node-red/package.json
						break
						;;
				  [nN][oO]|[nN])
						echo "No modules added to package.json, proceeding..."
						break
						;;
				  *)
						echo "Invalid input... please type 'y' (yes) or 'n' (no)"
						;;
			esac
		done
	fi
else
    echo "modules are identical, proceeding..."
fi

Theoretisch werden die alte package.json und die neue package.json verglichen, und zusammengeführt, sodass später alle Module wieder da sein sollten. Im Zweifel kannst du die zusätzlich installierten Module aber auch händisch in die neue package.json kopieren und dann im Ordner .node-red einmal npm install ausführen und dann NR neustarten.
Ich werde den Teil auch nochmal überarbeiten, da wir bei Versionskonflikten von Modulen aktuell die Version aus der alten package.json nehmen.

@Bzed Unfortunately a french translation for the Touchdisplay is not currently planned. But I can at least work the french translation into the smartphone app, that is relatively easy since the app is multilingual already (currently supported are german, english, dutch and spanish, languages are chosen automatically depending on the smartphone OS language).

@range4200t kommt jetzt im nächsten Update, dauert nicht mehr lange. Zumindest der CI Part, muss sehen wie ich Trumanita einigermaßen nahtlos mit reinbekomme.

Super
Danke für die schnelle Antwort.
Aber wenn es nicht mehr lange dauert, warte ich sicher auf die Nächse Version :+1: :+1: :rofl:
Gruß Arno

Hallo Vince,

wie ist den der Stand bei der Integration des Voltronic-Shunts?

Gruß Peter

Moin

Habe ein paar Sachen die ich gerne teilen möchte.

Folgendes ist mir aufgefallen nach dem Update:

  1. In der App wird mir ein Generic Heater angezeigt leider aber nicht meine Autoterm

  1. Beim Maxxfan kann ich über den Browser steuern aber nur An/Aus keine Geschwindigkeit oder so einstellbar. Gleiches gilt in der App oder dem Display

  1. Es werden mir nur 2 Temperaturen angezeigt obwohl mehr installiert sind. 3 x DS18B20 und 2 x RuuviTag

  2. Beim Victron Shunt werden bei AUX sehr komische Werte angezeigt.

Weitere Punkte folgen

Beim Maxxfan geht folgendes

Im Browser:

  1. An/Aus
  2. In/Out
  3. Automode Aktivieren (Temp einstellung nicht möglich)
  4. Es kann kein Speed eingestellt werden

Am Display:

  1. Open/Close
  2. In/out
  3. Reset

Keine Funktion bei

  1. Minus / Plus
  2. Auto

In der App:
Komplett keine Funktion

Noch was zum Display

Im Display habe ich entdeckt das der Boiler “Springt”.

Er ist im System nicht angewählt, wenn man nun im Display auf den Reiter geht ist der Boiler da aber nach ca 2 Sekunden ist er weg.

Wenn man nun das Display “am Leben” hält kommt er nach 10 Sekunden zurück und Verschwindet dann nach 2 Sekunden wieder.

Im System ist noch Folgendes:

Im System Springt der TimeToGo massiv hin und her die Batterien sind voll und er Pendelt von 24 Stunden auf 2 Wochen dann auf 4 Stunden.

Daten von den Victron Geräten werden wieder viel zu hoch angezeigt beim MPPT z.B. 7570 A statt 7,57 A

Ersetz einfach mal den Flow Inhalt (VE.Direct)mit diesem:

[{"id":"1bb9fe8186ec0a2c","type":"function","z":"eaf4189c977e6ca6","name":"Phonenix Inverter","func":"msg.payload = msg.payload.toString();\nmsg.payload = msg.payload.split(\"\\n\");\n\nmsg.payload = {\n    \"PID\": msg.payload[1].substring(4),\n    \"FW\": msg.payload[2].substring(3),\n    \"SER\": msg.payload[3].substring(5),\n    \"MODE\": msg.payload[4].substring(5),\n    \"CS\": msg.payload[5].substring(3),\n    \"AC_V\": parseFloat(msg.payload[6].substring(9)/100),\n    \"AC_I\": parseFloat(msg.payload[7].substring(9)/10),\n    \"Vin\": parseFloat(msg.payload[8].substring(2)/1000),\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":650,"y":380,"wires":[["319867ea1e43bc2e","90390cedcd5db098","49acbb70134582c3"]]},{"id":"bc7dc672c894a3b6","type":"link in","z":"eaf4189c977e6ca6","name":"Serial Connect Ve.direct","links":["788c0148719bd99c","1abad3b522bc0cdb","9a58f3a0ce2f303c","6a7fd365793465ff","1f60a35e099f02b6"],"x":95,"y":440,"wires":[["3d7b575b4d1a5c0f","79d1975d40e1d596"]]},{"id":"3d7b575b4d1a5c0f","type":"function","z":"eaf4189c977e6ca6","name":"search PID","func":"\nmsg.pid = msg.payload.toString();\nmsg.pid = msg.pid.split(\"\\n\");\n\n\n\n\nmsg.pid = msg.pid[1].substring(4,10);\n\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":200,"y":440,"wires":[["c47982e62a0b4a9d","f10b77713d7d166f","07dd43d13ddc443c","8ae17b5c444c27c9"]]},{"id":"380bafc7e0eef919","type":"ui_text","z":"eaf4189c977e6ca6","group":"4b3907bf.1686b8","order":0,"width":0,"height":0,"name":"","label":"AC Voltage","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1110,"y":240,"wires":[]},{"id":"319867ea1e43bc2e","type":"function","z":"eaf4189c977e6ca6","name":"AC_V","func":"msg.payload=msg.payload.AC_V;\nglobal.set(\"VE_AC_V\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":240,"wires":[["380bafc7e0eef919"]]},{"id":"f4e3226bf85660ee","type":"ui_text","z":"eaf4189c977e6ca6","group":"4b3907bf.1686b8","order":1,"width":0,"height":0,"name":"","label":"AC Current","format":"{{msg.payload}}","layout":"row-spread","className":"","x":1110,"y":280,"wires":[]},{"id":"90390cedcd5db098","type":"function","z":"eaf4189c977e6ca6","name":"AC_I","func":"msg.payload=msg.payload.AC_I;\nglobal.set(\"VE_AC_i\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":280,"wires":[["f4e3226bf85660ee"]]},{"id":"57734a9d91a97bf1","type":"ui_text","z":"eaf4189c977e6ca6","group":"4b3907bf.1686b8","order":2,"width":0,"height":0,"name":"","label":"Vin","format":"{{msg.payload}}","layout":"row-spread","x":1090,"y":320,"wires":[]},{"id":"49acbb70134582c3","type":"function","z":"eaf4189c977e6ca6","name":"Vin","func":"msg.payload=msg.payload.Vin;\nglobal.set(\"VE_Vin\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":320,"wires":[["57734a9d91a97bf1"]]},{"id":"78da6cc6771ab890","type":"function","z":"eaf4189c977e6ca6","name":"Smart Solar MPPT","func":"msg.payload = msg.payload.toString();\nlet lines = msg.payload.split(\"\\n\");\n\n// Prüfen, ob mindestens 18 Zeilen vorhanden sind\nif (lines.length < 18) {\n    return null;  // Keine Ausgabe bei unvollständigen Daten\n}\n\nmsg.payload = {\n    \"PID\": lines[1]?.substring(4) || \"\",\n    \"FW\": lines[2]?.substring(3) || \"\",\n    \"SER\": lines[3]?.substring(5) || \"\",\n    \"Vbatt\": parseFloat(lines[4]?.substring(2)) / 1000 || 0,\n    \"Current\": parseFloat(lines[5]?.substring(2)) / 1000 || 0,\n    \"PanelVolt\": parseFloat(lines[6]?.substring(4)) / 1000 || 0,\n    \"PanelPower\": parseFloat(lines[7]?.substring(4)) || 0,\n    \"Error\": lines[10]?.substring(4) || \"\",\n    \"Iload\": parseFloat(lines[12]?.substring(3)) || 0,\n    \"kwhcounter\": parseFloat(lines[13]?.substring(4)) || 0,\n    \"kwhcountertoday\": parseFloat(lines[14]?.substring(4)) || 0,\n    \"maxPowerToday\": parseFloat(lines[15]?.substring(4)) || 0,\n    \"kwhcounterYesterday\": parseFloat(lines[16]?.substring(4)) || 0,\n    \"maxPowerYesterday\": parseFloat(lines[17]?.substring(4)) || 0\n};\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":440,"wires":[["51857b4c4fb4a602","227ecd02df78445d","6d60fd34fbdae283","84ba464472fc687f","0c6f96888c02efa6","45f1f8e8636dbe61","f8be803186426e8b"]]},{"id":"050dd439e187701d","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":2,"width":0,"height":0,"name":"","label":"Panel Volt","format":"{{msg.payload}} V","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1100,"y":420,"wires":[]},{"id":"51857b4c4fb4a602","type":"function","z":"eaf4189c977e6ca6","name":"PanelVolt","func":"msg.payload=msg.payload.PanelVolt;\nglobal.set(\"VE_PanelVolt\",msg.payload);\nglobal.set(\"mppt_pv_volts\", msg.payload)\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":420,"wires":[["050dd439e187701d"]]},{"id":"6cf9c75ab81e187e","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":1,"width":0,"height":0,"name":"","label":"Panel Power","format":"{{msg.payload}} W","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1110,"y":460,"wires":[]},{"id":"227ecd02df78445d","type":"function","z":"eaf4189c977e6ca6","name":"PanelPower","func":"msg.payload=msg.payload.PanelPower;\nglobal.set(\"VE_PanelPower\",msg.payload);\nglobal.set(\"mppt_pv_watts\", msg.payload)\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":460,"wires":[["6cf9c75ab81e187e"]]},{"id":"397d4cd0ecf86774","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":3,"width":0,"height":0,"name":"","label":"Battery","format":"{{msg.payload}} V","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1100,"y":500,"wires":[]},{"id":"6d60fd34fbdae283","type":"function","z":"eaf4189c977e6ca6","name":"BatteryVolt","func":"msg.payload=msg.payload.Vbatt;\nglobal.set(\"VE_BatteryVolt\",msg.payload);\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":500,"wires":[["397d4cd0ecf86774"]]},{"id":"a64add83c45e6b15","type":"function","z":"eaf4189c977e6ca6","name":"","func":"msg.payload={\"group\":{\"hide\":[\"Info_Victron_Inverter\",\"Info_Victron_SmartSolar\",\"Info_Victron_Shunt\"]}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":200,"wires":[["8daecfd463e67b59"]]},{"id":"80aaed50e8eadd35","type":"inject","z":"eaf4189c977e6ca6","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":200,"wires":[["a64add83c45e6b15"]]},{"id":"8daecfd463e67b59","type":"ui_ui_control","z":"eaf4189c977e6ca6","name":"","events":"all","x":420,"y":200,"wires":[[]]},{"id":"6f74422bb392ff95","type":"function","z":"eaf4189c977e6ca6","name":"Shunt","func":"msg.payload = msg.payload.toString();\nmsg.payload = msg.payload.split(\"\\n\");\n\nmsg.payload = {\n    \"PID\": msg.payload[1].substring(4),\n    \"Vbatt\":parseFloat(msg.payload[2].substring(2)/1000),\n    \"Vaux\": parseFloat(msg.payload[3].substring(2)),\n    \"Current\": parseFloat(msg.payload[4].substring(2)/1000),\n    \"Power\": parseFloat(msg.payload[5].substring(2)),\n    \"CE\": parseFloat(msg.payload[6].substring(3)/1000),\n    \"SOC\": parseFloat(msg.payload[7].substring(4)/10),\n    \"TTG\": parseFloat(msg.payload[8].substring(4)),\n}\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":500,"wires":[["f60e55abe4de66f4","43dcd7129658db7a","fc8edb505366dc7b","3d1287408371e8e8","971c858237e871a7","764777437fa6fbc6","fe3165c954f7667f","32d317419d16d410"]]},{"id":"5db4bcd4baac4a66","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":1,"width":0,"height":0,"name":"","label":"MainBattery","format":"{{msg.payload}} V","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1110,"y":700,"wires":[]},{"id":"f60e55abe4de66f4","type":"function","z":"eaf4189c977e6ca6","name":"MainBattery","func":"msg.payload=msg.payload.Vbatt.toFixed(2);\nglobal.set(\"VE_Mainbattery\",msg.payload);\nglobal.set(\"BATTvolt\",msg.payload);\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":700,"wires":[["5db4bcd4baac4a66"]]},{"id":"43dcd7129658db7a","type":"function","z":"eaf4189c977e6ca6","name":"Vaux","func":"msg.payload=msg.payload.Vaux;\nglobal.set(\"VE_Aux\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":740,"wires":[["5d380195bf2be0a6"]]},{"id":"fc8edb505366dc7b","type":"function","z":"eaf4189c977e6ca6","name":"Current","func":"msg.payload=msg.payload.Current;\nglobal.set(\"VE_Current\",msg.payload);\nglobal.set(\"BATTamps\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":780,"wires":[["88660a0cb34ef5dd"]]},{"id":"971c858237e871a7","type":"function","z":"eaf4189c977e6ca6","name":"Consumed AMPHOurs","func":"msg.payload=msg.payload.CE;\nglobal.set(\"VE_consumedAH\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":920,"y":860,"wires":[["5d6998eea63878c0"]]},{"id":"5d380195bf2be0a6","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":6,"width":0,"height":0,"name":"","label":"AuxChannel","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1110,"y":740,"wires":[]},{"id":"88660a0cb34ef5dd","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":2,"width":0,"height":0,"name":"","label":"Current","format":"{{msg.payload}} A","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1100,"y":780,"wires":[]},{"id":"5d6998eea63878c0","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":5,"width":0,"height":0,"name":"","label":"Consumed Ah","format":"{{msg.payload}} Ah","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1120,"y":860,"wires":[]},{"id":"a1cae1f748ab114b","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":7,"width":0,"height":0,"name":"","label":"Max Volt","format":"{{msg.payload.H8}} V","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":860,"y":1060,"wires":[]},{"id":"8826bcdf4d1d0372","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":8,"width":0,"height":0,"name":"","label":"Min Volt","format":"{{msg.payload.H7}} V","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":860,"y":1100,"wires":[]},{"id":"84ba464472fc687f","type":"function","z":"eaf4189c977e6ca6","name":"solarCurrent","func":"msg.payload=msg.payload.Current;\nglobal.set(\"VE_solarCurrent\",msg.payload);\nglobal.set(\"mppt_pv_amps\", msg.payload)\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":540,"wires":[["5c811a9665a03336"]]},{"id":"5c811a9665a03336","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":4,"width":0,"height":0,"name":"","label":"Charge Current","format":"{{msg.payload}} A","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1120,"y":540,"wires":[]},{"id":"79d1975d40e1d596","type":"function","z":"eaf4189c977e6ca6","name":"Check H Values","func":"msg.h = msg.payload.toString();\nmsg.h = msg.h.split(\"\\n\");\nmsg.h = msg.h[1].substring(0,2);\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":1020,"wires":[["944938075254d4bf"]]},{"id":"944938075254d4bf","type":"switch","z":"eaf4189c977e6ca6","name":"","property":"h","propertyType":"msg","rules":[{"t":"eq","v":"H1","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":490,"y":1020,"wires":[["a99c671e072f6c6d"]]},{"id":"a99c671e072f6c6d","type":"function","z":"eaf4189c977e6ca6","name":"Shunt H values","func":"msg.payload = msg.payload.toString();\nmsg.payload = msg.payload.split(\"\\n\");\n\nmsg.payload = {\n    \"H1\": msg.payload[1] != undefined ? parseFloat(msg.payload[1].substring(3)/1000) : 0,\n    \"H2\": msg.payload[2] != undefined ? parseFloat(msg.payload[2].substring(3) / 1000) : 0,\n    \"H3\": msg.payload[3] != undefined ? msg.payload[3].substring(3).trim() : \"0\",\n    \"H4\": msg.payload[4] != undefined ? parseFloat(msg.payload[4].substring(3) / 1000) : 0,\n    \"H5\": msg.payload[5] != undefined ? parseFloat(msg.payload[5].substring(3)) : 0,\n    \"H6\": msg.payload[6] != undefined ? msg.payload[6].substring(3).trim() : \"0\",\n    \"H7\": msg.payload[7] != undefined ? parseFloat(msg.payload[7].substring(3) / 1000) : 0,\n    \"H8\": msg.payload[8] != undefined ? parseFloat(msg.payload[8].substring(3) / 1000) : 0,\n    \"H9\": msg.payload[9] != undefined ? parseFloat(msg.payload[9].substring(3) / 1000) : 0\n}\n\nglobal.set(\"VE_minVolt\",msg.payload.H7);\nglobal.set(\"VE_maxVolt\",msg.payload.H8);\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":1080,"wires":[["a1cae1f748ab114b","8826bcdf4d1d0372"]]},{"id":"3d1287408371e8e8","type":"function","z":"eaf4189c977e6ca6","name":"Power","func":"msg.payload=msg.payload.Power;\nglobal.set(\"VE_Power\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":820,"wires":[["65a8901e1547e5a3"]]},{"id":"65a8901e1547e5a3","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":3,"width":0,"height":0,"name":"","label":"Power","format":"{{msg.payload}} W","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1090,"y":820,"wires":[]},{"id":"355e0179870bad2c","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":4,"width":0,"height":0,"name":"","label":"SOC","format":"{{msg.payload}} %","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1090,"y":900,"wires":[]},{"id":"440d5687fa3edb69","type":"comment","z":"eaf4189c977e6ca6","name":"globals","info":"/////VE.direct\n//Inverter\nglobal.set(\"VE_AC_V\",0);\nglobal.set(\"VE_AC_i\",0);\nglobal.set(\"VE_Vin\",0);\n//SmartSolar\nglobal.set(\"VE_PanelVolt\",0);\nglobal.set(\"VE_PanelPower\",0);\nglobal.set(\"VE_BatteryVolt\",0);\nglobal.set(\"VE_solarCurrent\",0);\n//Shunt\nglobal.set(\"VE_Mainbattery\",0);\nglobal.set(\"VE_StarterBattery\",0);\nglobal.set(\"VE_Current\",0);\nglobal.set(\"VE_Power\",0);\nglobal.set(\"VE_consumedAH\",0);\nglobal.set(\"VE_SOC\",0);\nglobal.set(\"VE_maxVolt\",0);\nglobal.set(\"VE_minVolt\",0);\nglobal.set(\"VE_timetogo\",0);\n","x":1090,"y":200,"wires":[]},{"id":"764777437fa6fbc6","type":"function","z":"eaf4189c977e6ca6","name":"SOC","func":"msg.payload=msg.payload.SOC;\nglobal.set(\"VE_SOC\",msg.payload);\nglobal.set(\"BATTsoc\",msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":900,"wires":[["355e0179870bad2c"]]},{"id":"71b0048d0efa12dd","type":"inject","z":"eaf4189c977e6ca6","name":"every 2min","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"120","crontab":"","once":true,"onceDelay":"50","topic":"","payload":"","payloadType":"date","x":670,"y":140,"wires":[["87f617d376aff797"]]},{"id":"87f617d376aff797","type":"function","z":"eaf4189c977e6ca6","name":"reset globals","func":"/////VE.direct\n//Inverter\nglobal.set(\"VE_AC_V\",\"\");\nglobal.set(\"VE_AC_i\",\"\");\nglobal.set(\"VE_Vin\",\"\");\n//SmartSolar\nglobal.set(\"VE_PanelVolt\",\"\");\nglobal.set(\"VE_PanelPower\",\"\");\nglobal.set(\"VE_BatteryVolt\",\"\");\nglobal.set(\"VE_solarCurrent\",\"\");\n//Shunt\nglobal.set(\"VE_Mainbattery\",\"\");\nglobal.set(\"VE_StarterBattery\",\"\");\nglobal.set(\"VE_Current\",\"\");\nglobal.set(\"VE_Power\",\"\");\nglobal.set(\"VE_consumedAH\",\"\");\nglobal.set(\"VE_SOC\",\"\");\nglobal.set(\"VE_maxVolt\",\"\");\nglobal.set(\"VE_minVolt\",\"\");\nglobal.set(\"VE_timetogo\",\"\");\n\nmsg.payload = \"\";\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":140,"wires":[["380bafc7e0eef919","f4e3226bf85660ee","57734a9d91a97bf1","050dd439e187701d","6cf9c75ab81e187e","397d4cd0ecf86774","5c811a9665a03336","5db4bcd4baac4a66","5d380195bf2be0a6","88660a0cb34ef5dd","65a8901e1547e5a3","5d6998eea63878c0","355e0179870bad2c"]]},{"id":"c47982e62a0b4a9d","type":"function","z":"eaf4189c977e6ca6","name":"usbPortcheck","func":"if(msg.pid != null) \nglobal.set(\"usbPortcheck_victron\", true);","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":340,"wires":[[]]},{"id":"f10b77713d7d166f","type":"function","z":"eaf4189c977e6ca6","name":"Check Phoenix Inverter","func":"function handlePhoenixInverter(msg) {\n    const supportedDevices = [\n        { pid: \"0xA201\", name: \"Phoenix Inverter 12V 250VA 230V\" },\n        { pid: \"0xA202\", name: \"Phoenix Inverter 24V 250VA 230V\" },\n        { pid: \"0xA204\", name: \"Phoenix Inverter 48V 250VA 230V\" },\n        { pid: \"0xA211\", name: \"Phoenix Inverter 12V 375VA 230V\" },\n        { pid: \"0xA212\", name: \"Phoenix Inverter 24V 375VA 230V\" },\n        { pid: \"0xA214\", name: \"Phoenix Inverter 48V 375VA 230V\" },\n        { pid: \"0xA221\", name: \"Phoenix Inverter 12V 500VA 230V\" },\n        { pid: \"0xA222\", name: \"Phoenix Inverter 24V 500VA 230V\" },\n        { pid: \"0xA224\", name: \"Phoenix Inverter 48V 500VA 230V\" },\n        { pid: \"0xA231\", name: \"Phoenix Inverter 12V 250VA 230V\" },\n        { pid: \"0xA232\", name: \"Phoenix Inverter 24V 250VA 230V\" },\n        { pid: \"0xA234\", name: \"Phoenix Inverter 48V 250VA 230V\" },\n        { pid: \"0xA239\", name: \"Phoenix Inverter 12V 250VA 120V\" },\n        { pid: \"0xA23A\", name: \"Phoenix Inverter 24V 250VA 120V\" },\n        { pid: \"0xA23C\", name: \"Phoenix Inverter 48V 250VA 120V\" },\n        { pid: \"0xA241\", name: \"Phoenix Inverter 12V 375VA 230V\" },\n        { pid: \"0xA242\", name: \"Phoenix Inverter 24V 375VA 230V\" },\n        { pid: \"0xA244\", name: \"Phoenix Inverter 48V 375VA 230V\" },\n        { pid: \"0xA249\", name: \"Phoenix Inverter 12V 375VA 120V\" },\n        { pid: \"0xA24A\", name: \"Phoenix Inverter 24V 375VA 120V\" },\n        { pid: \"0xA24C\", name: \"Phoenix Inverter 48V 375VA 120V\" },\n        { pid: \"0xA251\", name: \"Phoenix Inverter 12V 500VA 230V\" },\n        { pid: \"0xA252\", name: \"Phoenix Inverter 24V 500VA 230V\" },\n        { pid: \"0xA254\", name: \"Phoenix Inverter 48V 500VA 230V\" },\n        { pid: \"0xA259\", name: \"Phoenix Inverter 12V 500VA 120V\" },\n        { pid: \"0xA25A\", name: \"Phoenix Inverter 24V 500VA 120V\" },\n        { pid: \"0xA25C\", name: \"Phoenix Inverter 48V 500VA 120V\" },\n        { pid: \"0xA261\", name: \"Phoenix Inverter 12V 800VA 230V\" },\n        { pid: \"0xA262\", name: \"Phoenix Inverter 24V 800VA 230V\" },\n        { pid: \"0xA264\", name: \"Phoenix Inverter 48V 800VA 230V\" },\n        { pid: \"0xA269\", name: \"Phoenix Inverter 12V 800VA 120V\" },\n        { pid: \"0xA26A\", name: \"Phoenix Inverter 24V 800VA 120V\" },\n        { pid: \"0xA26C\", name: \"Phoenix Inverter 48V 800VA 120V\" },\n        { pid: \"0xA271\", name: \"Phoenix Inverter 12V 1200VA 230V\" },\n        { pid: \"0xA272\", name: \"Phoenix Inverter 24V 1200VA 230V\" },\n        { pid: \"0xA274\", name: \"Phoenix Inverter 48V 1200VA 230V\" },\n        { pid: \"0xA279\", name: \"Phoenix Inverter 12V 1200VA 120V\" },\n        { pid: \"0xA27A\", name: \"Phoenix Inverter 24V 1200VA 120V\" },\n        { pid: \"0xA27C\", name: \"Phoenix Inverter 48V 1200VA 120V\" },\n        { pid: \"0xA281\", name: \"Phoenix Inverter 12V 1600VA 230V\" },\n        { pid: \"0xA282\", name: \"Phoenix Inverter 24V 1600VA 230V\" },\n        { pid: \"0xA284\", name: \"Phoenix Inverter 48V 1600VA 230V\" },\n        { pid: \"0xA291\", name: \"Phoenix Inverter 12V 2000VA 230V\" },\n        { pid: \"0xA292\", name: \"Phoenix Inverter 24V 2000VA 230V\" },\n        { pid: \"0xA294\", name: \"Phoenix Inverter 48V 2000VA 230V\" },\n        { pid: \"0xA2A1\", name: \"Phoenix Inverter 12V 3000VA 230V\" },\n        { pid: \"0xA2A2\", name: \"Phoenix Inverter 24V 3000VA 230V\" },\n        { pid: \"0xA2A4\", name: \"Phoenix Inverter 48V 3000VA 230V\" }\n    ];\n\n    const device = supportedDevices.find(device => device.pid === msg.pid);\n    return device ? msg : null; // Return msg if supported, otherwise null\n}\nif (handlePhoenixInverter(msg)) { return msg}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":380,"wires":[["1bb9fe8186ec0a2c"]]},{"id":"07dd43d13ddc443c","type":"function","z":"eaf4189c977e6ca6","name":"Check Smart Solar","func":"function handleSolarMPPT(msg) {\n    const supportedDevices = [\n        { pid: \"0x0300\", name: \"BlueSolar MPPT 70|15\" },\n        { pid: \"0xA040\", name: \"BlueSolar MPPT 75|50\" },\n        { pid: \"0xA041\", name: \"BlueSolar MPPT 150|35\" },\n        { pid: \"0xA042\", name: \"BlueSolar MPPT 75|15\" },\n        { pid: \"0xA043\", name: \"BlueSolar MPPT 100|15\" },\n        { pid: \"0xA044\", name: \"BlueSolar MPPT 100|30\" },\n        { pid: \"0xA045\", name: \"BlueSolar MPPT 100|50\" },\n        { pid: \"0xA046\", name: \"BlueSolar MPPT 150|70\" },\n        { pid: \"0xA047\", name: \"BlueSolar MPPT 150|100\" },\n        { pid: \"0xA049\", name: \"BlueSolar MPPT 100|50 rev2\" },\n        { pid: \"0xA04A\", name: \"BlueSolar MPPT 100|30 rev2\" },\n        { pid: \"0xA04B\", name: \"BlueSolar MPPT 150|35 rev2\" },\n        { pid: \"0xA04C\", name: \"BlueSolar MPPT 75|10\" },\n        { pid: \"0xA04D\", name: \"BlueSolar MPPT 150|45\" },\n        { pid: \"0xA04E\", name: \"BlueSolar MPPT 150|60\" },\n        { pid: \"0xA04F\", name: \"BlueSolar MPPT 150|85\" },\n        { pid: \"0xA050\", name: \"SmartSolar MPPT 250|100\" },\n        { pid: \"0xA051\", name: \"SmartSolar MPPT 150|100\" },\n        { pid: \"0xA052\", name: \"SmartSolar MPPT 150|85\" },\n        { pid: \"0xA053\", name: \"SmartSolar MPPT 75|15\" },\n        { pid: \"0xA054\", name: \"SmartSolar MPPT 75|10\" },\n        { pid: \"0xA055\", name: \"SmartSolar MPPT 100|15\" },\n        { pid: \"0xA056\", name: \"SmartSolar MPPT 100|30\" },\n        { pid: \"0xA057\", name: \"SmartSolar MPPT 100|50\" },\n        { pid: \"0xA058\", name: \"SmartSolar MPPT 150|35\" },\n        { pid: \"0xA059\", name: \"SmartSolar MPPT 150|100 rev2\" },\n        { pid: \"0xA05A\", name: \"SmartSolar MPPT 150|85 rev2\" },\n        { pid: \"0xA05B\", name: \"SmartSolar MPPT 250|70\" },\n        { pid: \"0xA05C\", name: \"SmartSolar MPPT 250|85\" },\n        { pid: \"0xA05D\", name: \"SmartSolar MPPT 250|60\" },\n        { pid: \"0xA05E\", name: \"SmartSolar MPPT 250|45\" },\n        { pid: \"0xA05F\", name: \"SmartSolar MPPT 100|20\" },\n        { pid: \"0xA060\", name: \"SmartSolar MPPT 100|20 48V\" },\n        { pid: \"0xA061\", name: \"SmartSolar MPPT 150|45\" },\n        { pid: \"0xA062\", name: \"SmartSolar MPPT 150|60\" },\n        { pid: \"0xA063\", name: \"SmartSolar MPPT 150|70\" },\n        { pid: \"0xA064\", name: \"SmartSolar MPPT 250|85 rev2\" },\n        { pid: \"0xA065\", name: \"SmartSolar MPPT 250|100 rev2\" },\n        { pid: \"0xA066\", name: \"BlueSolar MPPT 100|20\" },\n        { pid: \"0xA067\", name: \"BlueSolar MPPT 100|20 48V\" },\n        { pid: \"0xA068\", name: \"SmartSolar MPPT 250|60 rev2\" },\n        { pid: \"0xA069\", name: \"SmartSolar MPPT 250|70 rev2\" },\n        { pid: \"0xA06A\", name: \"SmartSolar MPPT 150|45 rev2\" },\n        { pid: \"0xA06B\", name: \"SmartSolar MPPT 150|60 rev2\" },\n        { pid: \"0xA06C\", name: \"SmartSolar MPPT 150|70 rev2\" },\n        { pid: \"0xA06D\", name: \"SmartSolar MPPT 150|85 rev3\" },\n        { pid: \"0xA06E\", name: \"SmartSolar MPPT 150|100 rev3\" },\n        { pid: \"0xA06F\", name: \"BlueSolar MPPT 150|45 rev2\" },\n        { pid: \"0xA070\", name: \"BlueSolar MPPT 150|60 rev2\" },\n        { pid: \"0xA071\", name: \"BlueSolar MPPT 150|70 rev2\" },\n        { pid: \"0xA072\", name: \"BlueSolar MPPT 150/45 rev3\" },\n        { pid: \"0xA073\", name: \"SmartSolar MPPT 150/45 rev3\" },\n        { pid: \"0xA074\", name: \"SmartSolar MPPT 75/10 rev2\" },\n        { pid: \"0xA075\", name: \"SmartSolar MPPT 75/15 rev2\" },\n        { pid: \"0xA076\", name: \"BlueSolar MPPT 100/30 rev3\" },\n        { pid: \"0xA077\", name: \"BlueSolar MPPT 100/50 rev3\" },\n        { pid: \"0xA078\", name: \"BlueSolar MPPT 150/35 rev3\" },\n        { pid: \"0xA079\", name: \"BlueSolar MPPT 75/10 rev2\" },\n        { pid: \"0xA07A\", name: \"BlueSolar MPPT 75/15 rev2\" },\n        { pid: \"0xA07B\", name: \"BlueSolar MPPT 100/15 rev2\" },\n        { pid: \"0xA07C\", name: \"BlueSolar MPPT 75/10 rev3\" },\n        { pid: \"0xA07D\", name: \"BlueSolar MPPT 75/15 rev3\" },\n        { pid: \"0xA07E\", name: \"SmartSolar MPPT 100/30 12V\" },\n        { pid: \"0xA07F\", name: \"All-In-1 SmartSolar MPPT 75/15 12V\" },\n        { pid: \"0xA102\", name: \"SmartSolar MPPT VE.Can 150/70\" },\n        { pid: \"0xA103\", name: \"SmartSolar MPPT VE.Can 150/45\" },\n        { pid: \"0xA104\", name: \"SmartSolar MPPT VE.Can 150/60\" },\n        { pid: \"0xA105\", name: \"SmartSolar MPPT VE.Can 150/85\" },\n        { pid: \"0xA106\", name: \"SmartSolar MPPT VE.Can 150/100\" },\n        { pid: \"0xA107\", name: \"SmartSolar MPPT VE.Can 250/45\" },\n        { pid: \"0xA108\", name: \"SmartSolar MPPT VE.Can 250/60\" },\n        { pid: \"0xA109\", name: \"SmartSolar MPPT VE.Can 250/70\" },\n        { pid: \"0xA10A\", name: \"SmartSolar MPPT VE.Can 250/85\" },\n        { pid: \"0xA10B\", name: \"SmartSolar MPPT VE.Can 250/100\" },\n        { pid: \"0xA10C\", name: \"SmartSolar MPPT VE.Can 150/70 rev2\" },\n        { pid: \"0xA10D\", name: \"SmartSolar MPPT VE.Can 150/85 rev2\" },\n        { pid: \"0xA10E\", name: \"SmartSolar MPPT VE.Can 150/100 rev2\" },\n        { pid: \"0xA10F\", name: \"BlueSolar MPPT VE.Can 150/100\" },\n        { pid: \"0xA112\", name: \"BlueSolar MPPT VE.Can 250/70\" },\n        { pid: \"0xA113\", name: \"BlueSolar MPPT VE.Can 250/100\" },\n        { pid: \"0xA114\", name: \"SmartSolar MPPT VE.Can 250/70 rev2\" },\n        { pid: \"0xA115\", name: \"SmartSolar MPPT VE.Can 250/100 rev2\" },\n        { pid: \"0xA116\", name: \"SmartSolar MPPT VE.Can 250/85 rev2\" },\n        { pid: \"0xA117\", name: \"BlueSolar MPPT VE.Can 150/100 rev2\" }\n    ];\n\n    const device = supportedDevices.find(device => device.pid === msg.pid);\n    return device ? msg : null; // Return msg if supported, otherwise null\n}\n\nif (handleSolarMPPT(msg)) { return msg}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":440,"wires":[["78da6cc6771ab890"]]},{"id":"8ae17b5c444c27c9","type":"function","z":"eaf4189c977e6ca6","name":"Check SHUNT ","func":"// BMV-700\nif(msg.pid == \"0x203\") \nreturn msg;\n\n// BMV-702\nif(msg.pid == \"0x204\") \nreturn msg;\n\n// BMV-700H\nif(msg.pid == \"0x205\") \nreturn msg;\n\n// SmartShunt 500A/50mV\nif(msg.pid == \"0xA389\") \nreturn msg;\n\n//SmartShunt IP65\nif(msg.pid == \"0xC030\")\nreturn msg;\n\n//SmartShunt IP65 rev2\nif(msg.pid == \"0xC035\")\nreturn msg;\n\n//BMV??? not tested yet\nif(msg.pid == \"0xA381\")\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":500,"wires":[["6f74422bb392ff95"]]},{"id":"d12756ddbec66b62","type":"ui_ui_control","z":"eaf4189c977e6ca6","name":"","x":1340,"y":980,"wires":[[]]},{"id":"315fb185ecb5ce9b","type":"function","z":"eaf4189c977e6ca6","name":"Show in INFO","func":"msg.payload = {\"group\":{\"show\":[\"Info_Victron_Shunt\"]}};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1160,"y":980,"wires":[["d12756ddbec66b62"]]},{"id":"fe3165c954f7667f","type":"delay","z":"eaf4189c977e6ca6","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"3","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":920,"y":980,"wires":[["315fb185ecb5ce9b"]]},{"id":"c806a94dd40c6907","type":"inject","z":"eaf4189c977e6ca6","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":960,"y":1020,"wires":[["315fb185ecb5ce9b"]]},{"id":"b64ce745ceb27bdb","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":6,"width":"3","height":"1","name":"","label":"Daily Yield","format":"{{msg.payload}} Wh","layout":"col-center","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1110,"y":620,"wires":[]},{"id":"0c6f96888c02efa6","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":5,"width":0,"height":0,"name":"","label":"Panel Power Max","format":"{{payload.maxPowerToday}} W","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1130,"y":580,"wires":[]},{"id":"28ba0ad37404c839","type":"ui_text","z":"eaf4189c977e6ca6","group":"7bd243ed.9f706c","order":7,"width":"3","height":"1","name":"","label":"Yesterday Yield","format":"{{msg.payload}} Wh","layout":"col-center","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1120,"y":660,"wires":[]},{"id":"45f1f8e8636dbe61","type":"function","z":"eaf4189c977e6ca6","name":"dailyYield","func":"msg.payload = msg.payload.kwhcountertoday * 10;\nglobal.set(\"VE_dailyyield\",msg.payload);\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":620,"wires":[["b64ce745ceb27bdb"]]},{"id":"f8be803186426e8b","type":"function","z":"eaf4189c977e6ca6","name":"yesterdayYield","func":"msg.payload = msg.payload.kwhcounterYesterday * 10;\nglobal.set(\"VE_yesterdayyield\",msg.payload);\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":900,"y":660,"wires":[["28ba0ad37404c839"]]},{"id":"32d317419d16d410","type":"function","z":"eaf4189c977e6ca6","name":"TimeToGo","func":"const minutes = msg.payload.TTG;\n\nfunction formatTime(minutes) {\n    let weeks = Math.floor(minutes / (7 * 24 * 60));\n    minutes %= (7 * 24 * 60);\n\n    let days = Math.floor(minutes / (24 * 60));\n    minutes %= (24 * 60);\n\n    let hours = Math.floor(minutes / 60);\n    minutes %= 60;\n\n    // Construct the time string dynamically\n    let result = [];\n    if (weeks > 0) result.push(`${weeks} week${weeks > 1 ? 's' : ''}`);\n    if (days > 0) result.push(`${days} day${days > 1 ? 's' : ''}`);\n    if (hours > 0) result.push(`${hours} hour${hours > 1 ? 's' : ''}`);\n    if (minutes > 0) result.push(`${minutes} minute${minutes > 1 ? 's' : ''}`);\n\n    return result.join(\", \");\n}\n\nif(minutes == -1) {\n    msg.label=\"Time to Full\"\n    global.set(\"VE_timetogo\", \"charging\");\n\n        // Get values from global context\n    let consumedAh = Number(global.get(\"VE_consumedAH\")); // Negative value (e.g., -55.55)\n    let chargingCurrentA = Number(global.get(\"VE_Current\")); // Current in Amps\n\n    // Prevent division by zero\n    if (chargingCurrentA <= 0) {\n        msg.payload = \"Not charging\";\n        return msg;\n    }\n\n    // Calculate time in minutes\n    let timeToFullMinutes = (consumedAh * -1) / chargingCurrentA / 0.016666666;\n\n    // Convert minutes to weeks, days, hours, and minutes\n    let weeks = Math.floor(timeToFullMinutes / 10080); // 10080 minutes in a week\n    let days = Math.floor((timeToFullMinutes % 10080) / 1440); // 1440 minutes in a day\n    let hours = Math.floor((timeToFullMinutes % 1440) / 60);\n    let minutes = Math.round(timeToFullMinutes % 60);\n\n    // Build the formatted result dynamically, omitting zero values\n    let timeFormatted = [];\n\n    if (weeks > 0) timeFormatted.push(`${weeks} week${weeks > 1 ? \"s\" : \"\"}`);\n    if (days > 0) timeFormatted.push(`${days} day${days > 1 ? \"s\" : \"\"}`);\n    if (hours > 0) timeFormatted.push(`${hours} hour${hours > 1 ? \"s\" : \"\"}`);\n    if (minutes > 0) timeFormatted.push(`${minutes} minute${minutes > 1 ? \"s\" : \"\"}`);\n\n    // If all values are 0, show \"less than a minute\"\n    if (timeFormatted.length === 0) {\n        timeFormatted.push(\"less than a minute\");\n    }\n\n    // Join values with commas\n    msg.payload = timeFormatted.join(\", \");\n    global.set(\"VE_TimeToFull\", msg.payload);\n}\nelse {\n    msg.payload = formatTime(minutes)\n    msg.label = \"Time To Go\"\n    global.set(\"VE_timetogo\",msg.payload);\n}\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":940,"wires":[["a9aa359b960c8557"]]},{"id":"a9aa359b960c8557","type":"ui_text","z":"eaf4189c977e6ca6","group":"6ea26502.8c263c","order":0,"width":0,"height":0,"name":"ttgo","label":"{{msg.label}}","format":"<center>{{msg.payload}}","layout":"col-center","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":1090,"y":940,"wires":[]},{"id":"4b3907bf.1686b8","type":"ui_group","name":"Victron Inverter","tab":"150fce8d5d1bec4f","order":1,"disp":true,"width":"6","collapse":true,"className":""},{"id":"7bd243ed.9f706c","type":"ui_group","name":"Victron SmartSolar","tab":"150fce8d5d1bec4f","order":2,"disp":true,"width":"6","collapse":true,"className":""},{"id":"6ea26502.8c263c","type":"ui_group","name":"Victron Shunt","tab":"150fce8d5d1bec4f","order":3,"disp":true,"width":"6","collapse":true,"className":""},{"id":"150fce8d5d1bec4f","type":"ui_tab","name":"Victron","icon":"mi-usb","order":4,"disabled":false,"hidden":false}]

Gruß Wulle

Hast du die LTE Bridge geupdatet ?
Sehe am Screen dass die App via Bridge mit dem System verbunden bist.

Blockzitat 2. Beim Maxxfan kann ich über den Browser steuern aber nur An/Aus keine Geschwindigkeit oder so einstellbar. Gleiches gilt in der App oder dem Display

Im Automodus lässt sich die Geschwindigkeit nicht regeln.
Da regelt der automatisch die Drehzahl.

Eventuell kommt daher das Problem mit der Bedingung.

Ich hab mich mal an die 10 Punkt Kalibrierung getraut, da ich eine Radkasten Wassertank habe.
Und die Funktioniert ohne Probleme.

Wie bin ich vor gegangen.
Ich habe mir im Debug die ADC Werte des entsprechendes Tankes aufgeschrieben.
Dabei habe ich mit einen Leeren Tank angefangen und immer 10% meines Tankes aufgefüllt, bei mir also 2,5 Liter, da mein Tank insgesammt nur 25 Liter hat. Das ganze bis der Tank zu 100 Prozent gefüllt war.

Sieht bei mir so aus:

Einmal Deploy gedrückt und den timestamp ausgelöst und sie da, funktioniert :slight_smile:

Die Bridge ist Aktuell Display und Core auch sowie die App

Was ich auch nicht verstehe ist das ich weder im Browser und auch nicht auf dem Display die Geschwindigkeit ändern kann also Manuell, normal sollte dies aber gehen oder sehe ich das Falsch ?

Wenn er auf Auto ist im Browser oder Display geschaltet ändert sich auch an der Geschwindigkeit nix habe es mal versucht Via Heißluftfön etwas zu simulieren.

Kabel ist Ok via Tester gemessen.

Habe nun noch mal probiert das Update auf die Bridge zu packen da ich nicht gesehen hatte das es das v0.1.4 gibt nun bekomme ich folgendes.

Er macht das Update leider nicht woran kann es liegen ?

Ich habe die Brigde nun soweit hin bekommen per Reset das ich das Update auf 0.1.4 aufspielen konnte so weit so gut nun kann ich folgendes in der App mit dem Maxxfan machen:

Öffnen / Schließen
Automodus (Geschwindigkeit ändert sich nicht)
Drehrichtung In/Out
Reset

Immer noch keine Funktion bei “Speed” dort kann man Hoch oder Runterschalten aber nix verändert sich.

Beim Display und im Browser wie gehabt keine Änderungen immer noch wie oben genannt.

Bei den Victron Geräten habe ich nun noch mal die Einheiten verändert wie ich es schon in früheren Versionen gemacht habe, da passen nun die Werte nur der Wert bei AUX am Shunt ist immer noch nicht so wie er sein soll.

Den Boiler habe ich nun im NodeRed Deaktiviert seitdem ist nun auch im Display alles ok.

Der TimeToGo wert pendelt immer noch.

Die Autoterm ist nun in der App auch verfügbar habe die anderen Heizungen im NodeRed deaktiviert.