Seite 1 von 1

Wie mache ich einen Vergleich mit Blockly

Verfasst: 5. Jan 2023 21:11
von AndyRPi
Hallo Zusammen,
ich würde gerne folgendes Blockly umsetzen habe jedoch einen Fehler bei der Berechnung drin, ich glaube das Plus zwei Muss ich anderst lösen.
Kann mir dabei jemand helfen?
codeblockly.JPG

Re: Wie mache ich einen Vergleich mit Blockly

Verfasst: 5. Jan 2023 21:26
von udo1toni
Wie kommst Du darauf, dass Du text erzeugen musst? Zwei Texte können gleich sein oder sich unterscheiden, ein Größer oder Kleiner als ist aber nicht definiert. geht es um die Länge des Textes? Oder ist die alphabetische Reihenfolge gefragt? Ist 20 größer als 100 (weil die erste Stelle 2 nun mal nach der 1 kommt und damit größer ist)?

Und immer wieder die Frage: Muss es unbedingt Blockly sein? Denn: Aus Gewohnheit nutzt Du es sicherlich nicht...

Re: Wie mache ich einen Vergleich mit Blockly

Verfasst: 5. Jan 2023 21:30
von AndyRPi
udo1toni hat geschrieben: 5. Jan 2023 21:26

Und immer wieder die Frage: Muss es unbedingt Blockly sein? Denn: Aus Gewohnheit nutzt Du es sicherlich nicht...
Weil ich aus DSL Rules noch nicht schlau geworden bin...

Re: Wie mache ich einen Vergleich mit Blockly

Verfasst: 5. Jan 2023 22:11
von udo1toni
Einfacher geht es gar nicht mehr...

Dein Block oben:

Code: Alles auswählen

if(Thermostat_Bad_EG_Actual_Temperature.state >= Save_Temp_Fenster_auf_Bad_EG.state + 2)
    Neue_Textnachricht.sendCommand("Temperatur im Bad unten um 2 Grad gefallen, bitt...")
else if(Save_Temp_Fenster_auf_Bad_EG.state <= Thermostat_Bad_EG_Actual_Temperature.state - 2)
    Neue_Textnachricht.sendCommand("Temperatur im Bad unten um 2 Grad gestiegen, bitt...")
Wobei ich fürchte, dass der Code nicht stimmt.

Besser: (und das gilt ohne Einschränkung auch für die Umsetzung in Blockly):

Code: Alles auswählen

if(!(Thermostat_Bad_EG_Actual_Temperature.state instanceof Number)) {                      // falls kein gültiger Wert vorliegt
    logWarn("fenster","Thermofühler liefert keinen gültigen Wert! Rule abgebrochen.")      // Warnmeldung ausgeben
    return;                                                                                // und Ausführung beenden
}
val Number nIst = (Thermostat_Bad_EG_Actual_Temperature.state as Number).floatValue        // Wert als Float in lokale Konstante übernehmen

if(!(Save_Temp_Fenster_auf_Bad_EG.state instanceof Number)) {                              // falls kein gültiger Wert vorliegt
    logWarn("fenster","Grenzwertitem liefert keinen gültigen Wert! Rule abgebrochen.")     // Warnmeldung ausgeben
    return;                                                                                // und Ausführung beenden
}
val Number nGrenze = (Save_Temp_Fenster_auf_Bad_EG.state as Number).floatValue             // Wert als Float in lokale Konstante übernehmen

if(nIst < nGrenze - 2)                                                                     // Falls Messwert kleiner als gesicherter Wert - 2
    Neue_Textnachricht.sendCommand("Temperatur im Bad unten um 2 Grad gesunken, bitt...")  // Meldung: Temperatur gefallen
else if(nIst > nGrenze + 2)                                                                // Falls Messwert größer als gesicherter Wert + 2
    Neue_Textnachricht.sendCommand("Temperatur im Bad unten um 2 Grad gestiegen, bitt...") // Meldung: Temperatur gestiegen
Natürlich kannst Du die Prüfung auf instanceof weg lassen. Aber beschwere Dich nicht, wenn Du Fehlermeldungen erhältst, wenn das Item keine gültige Zahl enthält.
Die Gültigkeitsprüfung ist einfach guter Stil und sollte immer genutzt werden, wenn nicht zu 100 % auszuschließen ist, dass da unter Umständen eben keine Zahl kommt, sondern vielleicht NULL oder UNDEF (beides gültige Zustände für ein Number Item).
Die Umrechnung nach Float erzwingt einen Zahlenwert ohne Einheiten, ein Thermostat könnte leicht 22°C melden, das kann man nicht mit 20 vergleichen (also ohne Einheit).
Weil es zwei Vergleiche sind, lohnt auch der Einsatz der lokalen Konstanten.

Übrigens sollte man sich gut überlegen, ob man Itemnamen einfach so übernimmt, wie sie von openHAB angeboten werden EG_Bad_Temperatur_Ist wäre beispielsweise eine ganze Ecke Kürzer, ohne dabei wesentliche Informationen einzubüßen. Man könnte gar statt Temperatur einfach Temp schreiben, also EG_Bad_Temp_Ist und EG_Bad_Temp_FAuf.

Re: Wie mache ich einen Vergleich mit Blockly

Verfasst: 5. Jan 2023 22:54
von Harka
Hi,
bei Blockly musst Du die Werte von Items immer erst Variablen zuweisen wenn Du mit ihnen rechnen möchtest. Vermutlich hast Du den Weg über "create_Text_with" fälschlicher Weise deshalb gewählt. Warum Du Zahlen zum Vergleichen nicht in Text umwandeln solltest hat Udo ja schon angerissen. Manchmal hilft es noch mit dem Wert zu Rechnen (*1). Die stellt sicher das der Wert auch wirklich als Zahl und nicht aufgrund von
hartnäckige Maßeinheiten als Text behandelt wird. Dies habe ich hier mal beim else-Vergleich gemacht. Dann weiß ich nicht warum Du beim Save nur item an Stelle von get_State_of_Item nutzt.
ForumTemperaturVergleich.jpg