Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 2. Aug 2019 13:55
Ich hab mir erst jetzt mal kurz die Rules zu Gemüte geführt - oberflächlich.
Eigentlich sollte es durch die Verwendung von .intValue keine Rolle spielen, ob der Wert nun als Integer oder als Float rein kommt.
Allerdings schreie ich innerlich auf bei so einer Formulierung:
Der in openHAB integrierte Logger beherrscht weit mehr, als vorn im Logfile das Wort auszutauschen. Man kann während der Laufzeit (!) das Loglevel anpassen, und zwar beliebig kleinteilig. Dazu muss man aber den logbefehl korrekt verwenden.
Erzeugt die Logzeile mit [INFO] nach dem Zeitstempel, aber nur unter der Bedingung, dass das LogLevel für org.smarthome.model.script.meinLogger mindestens auf INFO steht. Setzt man das Level auf WARN, werden keine Meldungen des Levels INFO mehr ausgegeben.
Das macht man während der LAufzeit von der Karaf Konsole aus per
Und das gilt dann nur für diese eine Rule (bzw. überall da, wo man halt meinLogger als Logger angegeben hat).
Man kann auch das Logging gemeinsam für alle Rules steuern, dann lässt man halt den hinteren Teil ab script weg (funktionert natürlich nur, solange man del Level noch nicht auf der unteren Ebene gesetzt hat).
Man spart sich also die Variable zu Beginn der Rules Datei, das if(log), wenn man Warnmeldungen ausgeben möchte, macht man das mit logWarn(), Fehler mit logError, Meldungen, die nur zum Debugging interessant sind, gibt man mit logDebug() aus. Dann muss man das Logging nur über die Karaf Konsole entsprechend setzen und bekommt die Logmeldungen entsprechend.
Weiterhin ist das Konstrukt mit toString an manchen Stellen nicht so gut, vor allem aber bei log-Meldungen. Diese beiden Zeilen:
sind weitgehend bedeutungsgleich, aber im zweiten Fall wird aus der Zahl automatisch ein passender String erzeugt. Die beiden werte werden nun als Werte übergeben, nicht als Teilstring.
Diese Zeile hier
ist auch so eine Sache. blind.name ist immer(!) ein String. Wenn schon, müsste es so aussehen:
Allerdings setzt das voraus, das blind.state schon eine gültige Zahl zurück liefert (das ist z.B. nach dem Systemstart nicht zwingend gegeben, auch
wenn das Item persistiert und mit restoreOnStartup wiederhergestellt wird!).
Besser ist es, in so einem Fall vorher mittels
zu prüfen, ob der nachfolgende Vergleich funktionieren kann.
Eigentlich sollte es durch die Verwendung von .intValue keine Rolle spielen, ob der Wert nun als Integer oder als Float rein kommt.
Allerdings schreie ich innerlich auf bei so einer Formulierung:
Code: Alles auswählen
if(log) logInfo(...)
Code: Alles auswählen
logInfo("meinLogger","Meine Meldung")
Das macht man während der LAufzeit von der Karaf Konsole aus per
Code: Alles auswählen
log:set WARN org.smarthome.model.script.meinLogger
Man kann auch das Logging gemeinsam für alle Rules steuern, dann lässt man halt den hinteren Teil ab script weg (funktionert natürlich nur, solange man del Level noch nicht auf der unteren Ebene gesetzt hat).
Man spart sich also die Variable zu Beginn der Rules Datei, das if(log), wenn man Warnmeldungen ausgeben möchte, macht man das mit logWarn(), Fehler mit logError, Meldungen, die nur zum Debugging interessant sind, gibt man mit logDebug() aus. Dann muss man das Logging nur über die Karaf Konsole entsprechend setzen und bekommt die Logmeldungen entsprechend.
Weiterhin ist das Konstrukt mit toString an manchen Stellen nicht so gut, vor allem aber bei log-Meldungen. Diese beiden Zeilen:
Code: Alles auswählen
logInfo(filename, logPrefix + "Beende, aktuelle Temperatur (" + localCurrentTemperature.state.toString() + ") ueberschreitet den eingestellten Grenzwert zum hochfahren von (" + AutoShading_Temp_raise.state.toString()+ ") ")
logInfo("beschattung","Beende, aktuelle Temperatur ({}) überschreitet den eingestellten Grenzwert zum hochfahren ({}) ",localCurrentTemperature.state, AutoShading_Temp_raise.state)
Diese Zeile hier
Code: Alles auswählen
if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue) {
Code: Alles auswählen
if ((blind.state as Number) < targetHights.get(blind.name).intValue) {
wenn das Item persistiert und mit restoreOnStartup wiederhergestellt wird!).
Besser ist es, in so einem Fall vorher mittels
Code: Alles auswählen
if (blind.state instanceof Number)