Hallo Zusammen,
ich habe eine Regel erstellt, die mehrere Items zusammen fasst und als einen String über MQTT ausgibt, aber ich beiße mir grade die Zähne an der Formatierung des Strings aus, ansonsten funktioniert alles wie gewünscht.
Erstmal die Regel selbst:
Code: Alles auswählen
rule "Summary_Naehrloesung"
when
Item Hydroponik_01_Send_Summary_Naehrloesung changed from 0 to 1
then
var Number w1 = (Hydroponik_01_Set_Woche.state as DecimalType).floatValue
var Number l1 = (Hydroponik_01_Set_Naehrloesung_01.state as Number).floatValue
var Number l2 = (Hydroponik_01_Set_Naehrloesung_02.state as Number).floatValue
var Number l3 = (Hydroponik_01_Set_Naehrloesung_03.state as Number).floatValue
var String Ausgabe = String::format ("{Woche : %.0f , Nährlösung 1 : %.1f , Nährlösung 2 : %.1f , Nährlösung 3 : %.1f}", w1, l1, l2, l3 )
Hydroponik_01_Summary_Naehrloesung.postUpdate(Ausgabe)
logInfo('rules', 'Ausgabe' + Hydroponik_01_Summary_Naehrloesung)
sendCommand(Hydroponik_01_Send_Summary_Naehrloesung, 0 )
sendCommand(Hydroponik_01_Send_Summary_Naehrloesung_AnzeigeInSitemap, 0 )
val mqttActions = getActions("mqtt","mqtt:broker:MyBroker")
mqttActions.publishMQTT("Hydroponik_01/Summary_Naehrloesung", Hydroponik_01_Summary_Naehrloesung.state.toString, true)
end
Entscheidend ist die entstehung des Strings, der an der folgenden Stelle zusammengesetzt wird:
var String Ausgabe = String::format ("{Woche : %.0f , Nährlösung_1 : %.1f , Nährlösung_2 : %.1f , Nährlösung_3 : %.1f}", w1, l1, l2, l3 )
Ich möchte gerne erreichen, das die Ausgabe über MQTT dann so aussieht:
{"Woche":"1","Nährlösung_1":"2.5","Nährlösung_2":"2.5","Nährlösung_3":"2.5",}
Doch ich komme einfach nicht darauf, wie ich die Sonderzeichen in einem String setzen muss, gibt es da eine Möglichkeit / Übersicht ?
Ich habe mich dabei an die MQTT Ausgabe Formatierung von Tasmota orientiert, daher der Wunsch.
Vielen Dank für die Mühe
Viele Grüße
Cali
von udo1toni » 22. Jan 2023 16:27
Puh, lass mich mal so sagen... das wird hässlich. Und String::format ist mutmaßlich nicht optimal dafür geeignet. Sinnvoller wäre es also, die vier Werte direkt als Strings anzulegen und diese dann einzubauen:
Code: Alles auswählen
rule "Summary_Naehrloesung"
when
Item Hydroponik_01_Send_Summary_Naehrloesung changed from 0 to 1
then
val strW1 = ((Hydroponik_01_Set_Woche.state as DecimalType) + 0.5).intValue.toString
val strL1 = String.format("%.1f",(Hydroponik_01_Set_Naehrloesung_01.state as Number).floatValue)
val strL2 = String.format("%.1f",(Hydroponik_01_Set_Naehrloesung_02.state as Number).floatValue)
val strL3 = String.format("%.1f",(Hydroponik_01_Set_Naehrloesung_03.state as Number).floatValue)
var strAusgabe = '{"Woche":"' + strW1 + '","Nährlösung_1":"' + strL1 + '","Nährlösung_2":"' + strL2 + '","Nährlösung_3":"' + strL3 +'",}"'
Hydroponik_01_Summary_Naehrloesung.postUpdate(strAusgabe)
logInfo("rules", "Ausgabe:{}", Hydroponik_01_Summary_Naehrloesung.state)
Hydroponik_01_Send_Summary_Naehrloesung.sendCommand(0)
Hydroponik_01_Send_Summary_Naehrloesung_AnzeigeInSitemap.sendCommand(0)
val mqttActions = getActions("mqtt","mqtt:broker:MyBroker")
mqttActions.publishMQTT("Hydroponik_01/Summary_Naehrloesung", strAusgabe, true)
end
Achte darauf, niemals innerhalb einer Rule ein Item zu setzen und direkt danach den Status dieses Items zu verwenden. openHAB arbeitet asynchron, das heißt, es gibt keinen garantierten Zustand des Items, es könnte noch der alte Zustand sein, genauso gut wie der neue.
Falls strAusgabe so nicht funktioniert, kannst Du auch mit Escaping arbeiten:
Code: Alles auswählen
var strAusgabe = "{\"Woche\":\"" + strW1 + "\",\"Nährlösung_1\":\"" + strL1 + "\",\"Nährlösung_2\":\"" + strL2 + "\",\"Nährlösung_3\":\"" + strL3 +"\",}\""
Eigentlich sollten beide Varianten funktionieren
Gehe zur vollständigen Antwort