Hi,
ich habe gestern angefangen, mich mit dem Backend auseinanderzusetzen und mir sind dabei ein paar Dinge aufgefallen (hatten schon kurz per Mail kontakt, hier etwas ausführlicher). Meine Mission war es, den internen Autotherm Temperatursensor als Innenraumtemperatursensor für die Heizungssteuerung zu verwenden, da ich noch keinen am Raspberry hängen habe. Dazu habe ich das Dropdown Menü bei den Settings um einen siebten Sensor erweitert und anschließend die betreffenden Funktionen bei der Heizung. Es betrifft folgende Funktionen:
- Heater Autotherm: check sensor (gibt es dort 2x)
- HeaterControls + MaxxFan: get inside tempsensor (gibt es dort auch 2x in sehr ähnlich)
- und vermutlich bei jeder anderen Heizung…
zunächst zur Funktion:
01 msg.payload = global.get("heattempsensor");
02
03 var usb1 = parseInt(global.get("usb1uart"));
04 var usb2 = parseInt(global.get("usb2uart"));
05 var usb3 = parseInt(global.get("usb3uart"));
06 var usb4 = parseInt(global.get("usb4uart"));
07
08 if (usb1 != 5 && usb2 != 5 && usb3 != 5 && usb4 != 5 && usb1 != 8 && usb2 != 8 && usb3 != 8 && usb4 != 8) {
09 return null
10 }
11
12 if (msg.payload != 1 && msg.payload != 2 && msg.payload != 3 && msg.payload != 4 && msg.payload != 5 && msg.payload != 6 && msg.payload != 7)
13 msg.payload = "no sensor"
14
15 if (msg.payload == 1)
16 msg.payload = global.get("temp1");
17
18 if (msg.payload == 2)
19 msg.payload = global.get("temp2");
20
21 if (msg.payload == 3)
22 msg.payload = global.get("temp3");
23
24 if (msg.payload == 4)
25 msg.payload = global.get("temp4");
26
27 if (msg.payload == 5)
28 msg.global.get("dimmytemp1")
29
30 if (msg.payload == 6)
31 msg.global.get("dimmytemp2")
32
33 if (msg.payload == 7)
34 msg.payload = global.get("heaterroomtemp");
35
36
37 if (global.get("temp1") == "" && global.get("temp2") == "" && global.get("temp3") == "" && global.get("temp4") == "" && global.get("dimmytemp1") == "" && global.get("dimmytemp2") == "" && global.get("heaterroomtemp") == "") {
38 msg.payload = "no TempSensor"
39 }
40
41 if(msg.payload === "no TempSensor")
42 {
43 msg.payload ="TempMode not available, no InsideTempSensor set";
44 return [msg,null];
45 }
46 else
47 {
48 msg.topic="setpoint";
49 return [null,msg];
50 }
(Achtung, in dem Code befindet sich bereits mein 7. Sensor “heaterroomtemp”)
zunächst zum 1. Bug:
in den Zeilen 28 & 31 müsste es nach meiner Auffassung heißen:
msg.payload = global.get(“…”);
nun ein paar Worte zur Softwarequalität:
Ich bin NodeRed Neuling, daher kenne ich mich nicht sonderlich aus, dass jedoch eine ähnliche Funktion mindestens 4 x geschrieben wird, ist aus Gründen der Wartbarkeit problematisch (siehe zweiter Bug später). Ich kenne mich wie gesagt nicht mit NodeRed aus, und welche Möglichkeiten es zur Wiederverwendbarkeit von Funktionen bietet, alternativ könnte man die Prüfung ob und welcher Temperatursensor die Innenraumtemperatur überwacht ggf. zu den Einstellungen und dem Dropdownmenü zentral verfrachten, da würde dann anstelle des Sensor-Index der Variablenname / Key des gewählten Sensors gespeichert.
Bei Bug2 hat dann Tatsächlich die Wartbarkeit zugeschlagen, bei der Erweiterung der beiden Dimmy Sensoren wurde dies in der zweiten “get inside tempsensor” Funktion unter “HeaterControls + MaxFan” vergessen hinzuzufügen.
Weiter ein paar ein paar Worte zur Softwarequalität:
Die Funktion selbst ließe sich deutlich leichter schreiben, wenn die If- Statements der Zeilen 12-31 mit Elseif verknüpft wären. Das If-Statement aus Zeile 8 könnte dann durch ein einfaches abschließendes else ersetzt werden. Das verbessert die Lesbarkeit und würde auch das Erweitern vereinfachen. Allgemein würde ich in anderen Programmiersprachen dafür sorgen, dass die verschiedenen Temperatursensor Optionen aus einer Liste geladen werden und nicht in jeder Funktion hartgecoded auftauchen.
In Zeile 37 würde ich dann nicht überprüfen, ob irgendeiner aller Sensoren einen Wert liefert, sondern ob explizit der ausgewählte und abgefragte Innenraumsensor (an der Stelle ist dessen Wert bereits in msg.payload geschrieben) einen Wert liefert.
Da ich noch keinen Gesamtüberblick über das Backend habe, wollte ich die Änderungen noch nicht “fertig” bereitstellen. Nicht dass ich an anderer Stelle etwas zerschieße…
Nun ein paar Worte für Leute die nicht im Thema Software stecken:
Software wächst in der Regel “historisch”, alle Mitarbeitenden lernen dazu und insbesondere in kleinen Teams muss der Fokus der Entwicklung häufig auf Funktionalität und neuer Funktionalität liegen, da Softwarequalität kurzfristig keinen Mehrwert bietet und lauffähige Software mit Funktionalitäten gerade am Anfang definitiv wichtiger ist. Was bringt schöne Software, die nichts kann. Ich habe daher riesigen Respekt vor eurer bisherigen Arbeit und möchte dies hier (abgesehen von den beiden Bugs) eher als Anregung verstehen, da mir bewusst ist, dass man dafür Zeit / Resourcen benötigt.
Kurz noch als Ausblick, ich plane für meinen Bus folgendes, und kann das bei Gelegenheit bereitstellen:
- Einbindung des Raumtemperatursensors der Standheizung (erledigt)
- Verbesserter Temperaturmodus, aktuell gibt es von / für Autotherm
Thermostatmodus (vereinfacht: Temeratur > soll = Aus / Temperatur < soll = An), das ständige an/aus ist schlecht für die Heizung und benötigt viel Strom
Temperaturmodus (Heizung ballert bis zur Zieltemp und versucht diese dann auf Sufe 1 zu halten), bei manchen wird es dann aber weiter zu warm, bei mir zu kalt.
Ich will eine Regelung (vermutlich PI Regler), die je nach Temperatur die Heizungsstufe über den Powermode verändert, und falls die kleineste Sufe zu groß ist auch abschaltet. Das verbindet und erweitert die Vorteile der beiden obigen Varianten. (Danke auch an der Stelle schon mal für die Info per Mail) - eine Android App nach meinen Vorstellungen, angepasst auf meinen Van
- Verschiedene Datenverbindungen für die App, die automatisch nach gewissen Regeln gewählt werden
- Wlan, wenn sich Handy und Pi im selben Netz befinden und unlimited Internet im Netzwerk verfügbar ist
- Bluetooth, wenn kein unlimited Internet verfügbar ist, so nutzt das Handy weiter sein eigenes Internet
- Internet, wenn weder Bluetooth verfügbar ist, noch Pi und Handy im selben Netz sind. Kann entweder über die mobilen Daten des Bus gehen, oder wenn der Bus zuhause im Wlan hängt.
Mal schauen, wie weit ich komme, ich bin sehr Dankbar für euer Projekt, da es bereits eine gute Grundlage bietet und man schnell erste eigene Ideen umsetzen kann und Funktionen sieht, ohne Ewigkeiten in die Grundlagen zu stecken.
Viele Grüße