Code: Alles auswählen
val telegramAction = getActions("telegram","telegram:telegramBot:telegram")
blinds.members.forEach[blind|
telegramAction.sendTelegram(5128384828L, "Verschattung für " + blind.label + " aktiviert, schließen auf " + targetHights.get(blind.name) + " %%")
blind.sendCommand(targetHights.get(blind.name))
]
Das hast Du in Deinem Code schon drin, nur hast Du diesen Teil ursprünglich nicht gepostet... Bei Dir ist es die Schleife shutters.allMembers.forEach[]
Zu Deinem Code (in der Reihenfolge des Auftretens...):
Erst mal wäre es sinnvoll, alle nicht (mehr) benötigten Variablen zu entfernen. Das betrifft z.B. message, filename, blind* und die *Temperature Variablen bzw. Konstanten.
Weiterhin hast Du die Variablen DWD1 und DWD2 global definiert, definierst sie jedoch innerhalb der Rule erneut. Entweder global, oder lokal definieren, aber bitte nicht beides gleichzeitig.
Die Sache mit den Funktionen... kann man machen, trägt allerdings nicht unbedingt zur Lesbarkeit des Codes bei

Die Map... Du verwendest eine HashMap, entsprechend solltest Du auch eine HashMap als Typ verwenden, nicht einfach Map (gilt auch für den import).
log-Befehle... ganz grundsätzlich: der erste String ergänzt den Loggernamen, der zweite String ist die Meldung.
Über den Loggernamen kann man das LogLevel zur Ausführungszeit steuern, also die Meldungen "ein- bzw. ausschalten", und zwar in Abhängigkeit des Meldungstyps (Debug, Info, Warn, Error). Es erscheint sinnvoll, für unterschiedliche Bereiche auch unterschiedliche Loggernamen zu verwenden."rules" ist kein sinnvoller Loggername, denn alle aus Rules heraus generierten Logeinträge nutzen als Namespace org.openhab.core.model.script, wobei im log die letzen 36 Zeichen angezeigt werden. sinnvoll könnte z.B. "shutter" sein, damit kannst Du dann alle Logmeldungen im Zusammenhang mit der Verschattung gemeinsam ein- oder ausschalten, ohne aber Logmeldungen anderer Rules zu beeinflussen.
logXxxx() beherrscht für den zweiten String Substitution, das ist sehr hilfreich wenn man variable Inhalte ausgeben möchte. Natürlich kann man Strings verketten, das ist aber schlecht lesbar:
Code: Alles auswählen
logInfo("rules", logPrefix + "Fahre Rollladen (" + blind.name + ") auf (" + targetHights.get(blind.name).intValue + ") %" )
Code: Alles auswählen
logInfo("shutter", "Fahre Rollladen {} auf {} %",blind.name, targetHights.get(blind.name))
Der Witz: Du nutzt das an anderer Stelle im Code schon...
Weiter im Text...
Wie erwähnt, liefert .name genau wie .label ein String Objekt. .toString() als Methode aufzurufen ist hier unsinnig. Die HashMap liefert Number zurück, das könnte man bequem auf Integer ändern, dann kann man sich das .intValue ersparen.
Als Beispiel sollte das Lambda shadingStart also eher so aussehen:
Code: Alles auswählen
val shadingStart = [GroupItem shutter |
val HashMap<String, Integer> targetHights = newHashMap(
"Shellyswitch25LesezimmerRollerControl" -> 40,
"Shellyswitch25BueroRollerControl" -> 100,
"Shellyswitch25SZRechtsRollerControl" -> 90,
"Shellyswitch25SZLinksRollerControl" -> 85,
"Shellyswitch25BadRollerControl" -> 80,
"Shellyswitch25RollladenRaphaelRollerControl" -> 80,
"Shellyswitch25KucheRollerControl" -> 0
)
// Rollladen werden geschlossen
logInfo("shutter", "Grenzwerte wurden erreicht, Rollladen werden geschlossen")
val telegramAction = getActions("telegram","telegram:telegramBot:telegram")
shutter.allMembers.forEach[ blind |
val iTarget = targetHights.get(blind.name)
if((blind.state as Number).intValue < iTarget) {
logInfo("shutter", "Fahre Rollladen {} auf {} %", blind.label, iTarget)
blind.sendCommand(iTarget)
// Telegram versenden
telegramAction.sendTelegram(5128384828L, "Verschattung für " + blind.label + " aktiviert, schließen auf " + targetHights.get(blind.name) + " %%")
} else {
logInfo("shutter", "Rollladen {} ist bereits weiter geschlossen ({} %) als er geschlossen werden sollte und wird daher ignoriert", blind.label, blind.state)
}
]
AutoShading_Start_last.postUpdate(new DateTimeType())
return;
]
Code: Alles auswählen
val shadingStart = [GroupItem shutter |
val HashMap<String, Integer> targetHights = newHashMap(
"Shellyswitch25LesezimmerRollerControl" -> 40,
"Shellyswitch25BueroRollerControl" -> 100,
"Shellyswitch25SZRechtsRollerControl" -> 90,
"Shellyswitch25SZLinksRollerControl" -> 85,
"Shellyswitch25BadRollerControl" -> 80,
"Shellyswitch25RollladenRaphaelRollerControl" -> 80,
"Shellyswitch25KucheRollerControl" -> 0
)
// Rollladen werden geschlossen
logInfo("shutter", "Grenzwerte wurden erreicht, Rollladen werden geschlossen")
var String strNewPos = "Folgende Rollläden wurden geschlossen: " //39 Zeichen
var String strOldPos = "Folgende Rollläden bleiben auf Position: " // 41 Zeichen
shutter.allMembers.forEach[ blind |
val iTarget = targetHights.get(blind.name)
if((blind.state as Number).intValue < iTarget) {
logInfo("shutter", "Fahre Rollladen {} auf {} %", blind.label, iTarget)
if(strNewPos.length > 39) strNewPos = strNewPos + ", "
strNewPos = strNewPos + blind.label + " (" + iTarget.toString + " %)"
blind.sendCommand(iTarget)
} else {
if(strOldPos.length > 41) strOldPos = strOldPos + ", "
strOldPos = strOldPos + blind.label + " (" + blind.state.toString + " %)"
logInfo("shutter", "Rollladen {} ist bereits weiter geschlossen ({} %) als er geschlossen werden sollte und wird daher ignoriert", blind.label, blind.state)
}
]
val telegramAction = getActions("telegram","telegram:telegramBot:telegram")
telegramAction.sendTelegram(5128384828L, strNewPos + ". " + strOldPos + ".")
AutoShading_Start_last.postUpdate(new DateTimeType())
return;
]
Man könnte es noch auf die Spitze treiben und das letzte Komma durch ein " und" ersetzen...