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?
Wie mache ich einen Vergleich mit Blockly
-
- Beiträge: 68
- Registriert: 3. Jan 2021 11:06
- Wohnort: Wörlitz / Obertshausen
Wie mache ich einen Vergleich mit Blockly
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Openhab 4.0.0 RPi SSD
Homematic CCU3
Phoscon
Shelly
FRITZ!Box
Alexa
Homematic CCU3
Phoscon
Shelly
FRITZ!Box
Alexa
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie mache ich einen Vergleich mit Blockly
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...
Und immer wieder die Frage: Muss es unbedingt Blockly sein? Denn: Aus Gewohnheit nutzt Du es sicherlich nicht...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 68
- Registriert: 3. Jan 2021 11:06
- Wohnort: Wörlitz / Obertshausen
Re: Wie mache ich einen Vergleich mit Blockly
Weil ich aus DSL Rules noch nicht schlau geworden bin...
Openhab 4.0.0 RPi SSD
Homematic CCU3
Phoscon
Shelly
FRITZ!Box
Alexa
Homematic CCU3
Phoscon
Shelly
FRITZ!Box
Alexa
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie mache ich einen Vergleich mit Blockly
Einfacher geht es gar nicht mehr...
Dein Block oben:
Wobei ich fürchte, dass der Code nicht stimmt.
Besser: (und das gilt ohne Einschränkung auch für die Umsetzung in Blockly):
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.
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...")
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
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 489
- Registriert: 30. Apr 2021 13:13
Re: Wie mache ich einen Vergleich mit Blockly
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.
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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.