NEWS
Bier maischen Script mit Blockly
-
Also, zuerst einmal vielen Dank für die Anregungen.
Ich habe das Script anhand deiner Ideen Ralla, abgeändert. Erst einmal so:
Leider ohne den erwarteten Erfolg. Nach diesem Script heizt der Heizstab das Wasser bis zu einer Endtemperatur von 40°C in einem durch auf.
@AlCalzone: Das Bild in dem die Blöcke nicht verbunden waren, war eigentlich nur zur Verdeutlichung gedacht, weil sich die Blöcke nicht so verbinden ließen, wie ich es aus deiner Beschreibung gelesen habe. Es tut mir leid, wenn ich mich so blöd anstelle, aber das hier ist absolutes Neuland für mich.
Ich habe es jetzt so gebastelt, wie du vorgeschlagen hast und dieses Script funktioniert:
Es steuert dein Heizstab so an, dass die Temperatur erst auf 20°C hochgefahren wird, diese dann für 10 Minuten hält und nach Ablauf der 10 Minuten die Temperatur auf 30°C hochfährt. So weit SUPER!! Vielen Dank dafür!!!
Ab hier wird das Script im Prinzip für jede Art von Bier etwas unterschiedlich. Als Beispiel:
Für ein Weizenbier möchte ich mehrere Temperaturstufen durchfahren:
1. Einmaischen bei 45°C halten für 10 Minuten
2. Eiweißrast bei 55°C halten für 15 Minuten
3. Maltoserast bei 63°C halten für 60 Minuten
4. Verzuckerungsrast bei 72°C für 30 Minuten
5. Abmaischen bei 78°C
Für andere Biere muss ich andere Stufen durchfahren. Eine helles Lager würde ich wahrscheinlich so machen:
1. Einmaischen bei 55°C halten für 10 Minuten
2. Kombirast bei 68°C für 60 Minuten
3. Abmaischen bei 78°C
Dazwischen gibt es verschiedene Variationen, die eine individuelle Anpassung vor jedem Brauvorgang unerlässlich macht.
Das bedeutet, ich muss das Script ab diesem Punkt so gestalten, dass ich hier skalierbar bleibe und etwaige Stufen ein oder ausbauen kann, ohne Abhängigkeiten zu beeinträchtigen.
Leider ist es nicht so ganz einfach, ab hier weiterzubauen. Ich habe über die letzten Tage viele verschiedene Kombinationen ausprobiert, aber keine hat den gewünschten Erfolg begracht. Ich habe dann auch mit kopieren einzelner Blöcke experimentiert:
aber anscheinend passiert dann genau das. Das ganze Script funktioniert dann nicht mehr so, wie ich es eigentlich möchte. Anscheinend werden hier dann Abhängigkeiten überschrieben.
Also noch einmal vielen vielen Dank für eure Gedult und entschuldigt bitte mein Unvermögen, mich in diese Dinge reinzuversetzen, wie es nötig wäre.
Wenn ihr mir hier noch einmal einen Schubs geben könntet, wäre das wirklich super….
-
schubs,
Baue dir ein Grundgerüst / script für Bierbrauen alle Sorten mit Variablen.
Var anlegen für einmaischen, kombirast, abmaischen usw.
Die Variablen definierst du dann für Hell oder Weizen Bier usw.
Also im Prinzip Bierbrauen alle ein und die Variablen besetzen mit den
gespeicherten Werten für Hell oder Weizen oder so.
z.B. Weizen aktiv setze Var
einmaischen auf x
kombirast auf x
abmaischen auf x
Beispielbild anbei.
-
schubs 2,
Hauptprogramm " Bier alle " etwa so,
Vorbesetzen der Biere etwa so,
siehe Bilder.
Probiere es, viel Arbeit, fang mit einer Biersorte an.
Das wird ein etwas größeres Programm.
Grundbausteine haste jetzt.
Die Gestaltung des Hauptprogramms "Bier alle" muß für alle Biersorten gleich sein.
Kriegste hin.
Viel Spass
5230_bier_haupt_prg.jpg
5230_biersorten_var_vorbestzen.jpg -
Ach du meine Güte, ist das viel Zeug, Wahnsinn. :shock:
Vielen Dank, Ralla. Da habe ich aber was zu basteln. Mal sehen, ob ich es umsetzen kann.
Echt Toll. Danke dafür.
-
Also, ich habe das jetzt mal wie folgt zusammengeklöppelt:
Ausprobieren kann ich das heute nicht mehr, Küche ist belegt. Nichtsdestotrotz stellen sich mir folgende Fragen:
Wenn ich in den Variablen die Zeiten definiere, woher weiß das Script, dass es sich um Minuten handelt und nicht um Stunden, Sekunden oder Kekse? Müsste ich die nicht auch irgendwo definieren?
Wenn das Script erkennt, dass es sich um Minuten handelt, wozu müsste ich dann einen Timeout setzen?
Wird der nächste Sprungpunkt immer erst nach Ablauf des vorherigen angesteuert?
Wenn es die Zeit zulässt, lasse ich es morgen mal durchlaufen und gebe dann Rückmeldung.
Vielen Dank bis hierher schonmal.
-
Morgen mehr.
Nachtrag 14.01
versuche erst einmal nur mit Hellbier und Einmaischen.
Der Rest wenn läuft ist dann nur Copy und Paste.
Das Problem im Bild ist der Timeout.
Wenn Timeout aktiv wird die Heizungsregelung < 55 Grad >55 Grad inaktiv bzw
die Heizung bleibt an oder aus. Also sinkt / steigt die Temp wärend des Timeouts
unkontrolliert.
Wir wollen aber das wenn der Timeout läuft die Temp gehalten wird auf 55 Grad.
Ich Versuche das mal heute Abend mit einem Intervall und Runterzähler zu lösen.
Was für ne Aufgabe, Puh
Wir nähern uns langsam.
Kriegen wir gemeinsam hin.
Bild reiche ich heute Abend nach.
5230_bier_haupt_v15.jpg -
aber anscheinend passiert dann genau das. Das ganze Script funktioniert dann nicht mehr so, wie ich es eigentlich möchte. Anscheinend werden hier dann Abhängigkeiten überschrieben. `
Du hast mittig zwischen deinen Abschnitten für die beiden Stufen zwei Blöcke, in denen du die Zieltemperatur änderst. Diese werden jedes Mal, wenn der Fühler einen neuen Wert meldet, ausgeführt und überschreiben die Zieltemperatur. Das sollte wie ich das verstehe aber nur dann passieren, wenn du eine Stufe für längere Zeit gehalten hast und die nächste angefahren werden soll. Also innerhalb eines der Timeout-Blöcke einer Stufe.
Zum "flexiblen Gerüst":
Verdammt sind das viele Stufen! Ich persönlich (mit etwas mehr Erfahrung) würde Blockly dafür sein lassen und auf JS wechseln.
Dort kannst du dir erstens (geht auch in Blockly) Funktionen deklarieren, z.B. für "Temperatur halten" oder "heizen".
Zweitens geht die Ablauf-Steuerung dort sehr schön, wenn man Promises verwendet. Das ist zwar recht fortgeschritten, was die Programmierung angeht, die Definition des Ablaufs geht aber sehr schön (siehe unten). Ich könnte dich da gerne unterstützen.
Ein Dummy-Skript (ohne Funktionalität) könnte in etwa so aussehen:
function heizen(zielTemperatur) { // TODO: Gibt Promise zurück, der erst nach Erreichen der Zieltemperatur fulfilled. } function halten(dauer) { // TODO: Gibt Promise zurück, der nach "dauer" Minuten fulfilled. } // Brau-Ablauf definieren: Promise.resolve() .then(() => heizen(35000)) // Stufe 1 .then(() => halten(10)) .then(() => heizen(55000)) // Stufe 2 .then(() => halten(20)) // ... ;
Diesen Ablauf kannst du dir dann auch wieder in Funktionen packen und nur noch aufrufen, z.B.
weizenbier().then(() => /* Sprachausgabe: Prost */)
-
Da hat AlCalzone recht,
das geht besser in JS.
Selbst da nicht ganz ohne.
Du mußt ja alles betrachten Temp, Zeiten, Halten ,Vorheizen usw. und das beim Einmaischen, Kombirast usw.
Mit JS aufwendig, mit Blockly sehr aufwendig.
Mal eben geht das nicht bei deinen Anforderungen.
Hinweis, das Blocky Bild ist nur ein Vorschlag, nicht getestet und Verbesserungswürdig.
Eben schnell erstellt.
Da Spass an der Freude.
Betrachtet wurde nur, Hellbier, Einmaischen und Runterzähler.
Damit du weißt was in Blockly auf dich zukommt wenn Mann wie ich kein JS kann.
Kommentare habe ich so gut es ging eingefügt.
Versuche mal zu erkunden was passiert wenn Hellbier ist 0 oder 1.
Viel Spass
:mrgreen:
5230_hellbier_fertig_v1.jpg -
Wow, erstmal vielen Dank für die Anregungen.
Ralla, ich habe zwar heute keine Gelegenheit mehr, das Script am "lebenden Objekt" auszuprobieren, aber hier kommt mir etwas seltsam vor:
Die abgefragte Temperatur einsetzen? Irgendwie macht das keinen Sinn für mich. Welcher Wert soll denn da rein? Der Zielwert, oder aktuell gemessene?Wenn es der Zielwert ist, wird der ja im weiteren Script nochmal definiert.
Es wäre ja dann so:
Nach meiner Auffassung würde dann ja jedes mal, wenn sich die Temperatur ändert, die Temperatur wieder auf den Eingangspunkt von 55°C zurückspringen.
Ich kenne mich zwar nicht mit Blockly aus, würde aber meinen, dass das Script von oben nach unten abläuft. Dann würde es ja in einer Schleife hängen. Oder habe ich jetzt einen kompletten Denkfehler? :?
Wie gesagt, ich bau es um und teste es am Kessel mal aus. Aber das wird wohl erst am Mittwoch gehen. Heute war lange auf der Arbeit und morgen wird es das wohl auch. Abends haben wir dann ein Spiel. Aber vielen Dank für die Denkanstöße.
@AlCalzone: Ja, wenn man ein wenig Erfahrung mit Scripten generell oder Javascript speziell hat. Aber leider bin ich da absolut unbewandert. Es sind zwar sehr viele einzelne Stufen, aber das sind auch alle möglichen Stufen. Mehr gibt es eigentlich nicht, da ich sie für jede Art von Bier anpassen kann. Die Temperaturen und Zeiten ändern sich marginal, aber der Ablauf wäre immer gleichbleibend.
Aber danke für den Tipp. Vielleicht kaufe ich mir ja mal ein Buch über JS, aber erst wenn ich etwas mehr Zeit habe.
Jedenfalls finde ich es total super, dass ihr beiden euch hier so reinhängt. Sobald das Script fertig ist und das erste Bier damit gebraut wurde, schicke ich euch eine Flasche zum probieren. Müsst mir dann nur per PM eure Adressen geben und etwas Geduld haben. Ein gute Bier braucht schon ein paar Wochen bis es trinkfertig ist…
-
Stand heute 21:53 Uhr , Bild anbei.
Programm von gestern wurde verbessert.
Wenn du Fragen dazu hast gerne,
vergiss das von gestern, heute gibt es die neue Version.
Melde dich wenn Zeit dazu ist.
Frage von mir, wenn Funke ist wahr ist die Heizung dann aus oder an ?
Hast du glaube ich negiert.
Wenn Funke ist wahr Heizung ist aus, richtig ?
-
Hallo Ralla, ganz kurz von der Arbeit aus. Wenn Funke ist wahr = Steckdose ist an.
Vielen Dank und einen schönen Arbeitstag…
-
@AlCalzone: Ja, wenn man ein wenig Erfahrung mit Scripten generell oder Javascript speziell hat. Aber leider bin ich da absolut unbewandert. Es sind zwar sehr viele einzelne Stufen, aber das sind auch alle möglichen Stufen. Mehr gibt es eigentlich nicht, da ich sie für jede Art von Bier anpassen kann. Die Temperaturen und Zeiten ändern sich marginal, aber der Ablauf wäre immer gleichbleibend. `
Deswegen das Angebot zur Hilfe bei der Skripterstellung. Du müsstest im Prinzip nur den unteren Abschnitt mit dem High-Level-Ablauf anpassen, der Rest wäre universal. Und ich finde den kann man auch ohne JS-Kenntnisse gut bearbeiten (Zahlen ändern, Zeilen hinzufügen, Kommentare).Wie gesagt… sag Bescheid!
-
Hi,
ja dann müsste Funke wahr / unwahr getauscht werden.
Habe mal im Netz gelesen, kann zwar Bier trinken werde aber höchst wahrscheinlich nie brauen.
Dann wäre ja das Programm in folgender Reihenfolge :
Bierbrauen ein ( aus Datenpunkt )
Kessel vor heizen bis 37 Grad
Einmaischen 35-37 Grad , Rast 10 min
Gummirast bei Roggen 35 – 40 Grad, Rast 15 – 30 min
Ferularrast bei Weizen 45 -48 Grad, Rast 15 min
Eiweißrast 50 -58 Grad , Rast 20 – 30 min
Maltroserast 60 -68 Grad, Rast 30 -90 min
Verzuckerung 68 – 76 Grad, Rast 15 – 60 min
Abmaischen 75 – 77 Grad ( Max 80 Grad), Rast 20 min
oder
Kombirast 64 bis 70 Grad, Rast 60 – 90 min
Abkühlphase ??
Programm Ende
Evtl Var neu besetzen fürs nächste brauen.
Bierbrauen aus ( Datenpunkt )
Nach einmaischen wiederholt sich ja alles.
aufheizen, halten, aufheizen, halten usw.
Sondervogel ist ja nur die Kombirast. Aufheizen, halten, fertig.
Dann sollten die Rasten für die verschiedenen Biere und Rastarten
ein und ausschaltbar sein.
Richtig so ?
Mir sendest du aber ein kräftiges Weizenbier auch wenn du das in JS machen solltest.
Dann gehört wohl Ferularrast dabei. :lol:
Ralla
-
Und sollte es beim programmieren mal hapern fang mit der Visu an. :lol:
Status: Normal , Heizung ist ein oder Heizung ist aus.
Gestehe, habe den Not Aus vergessen.
Passt aber nicht in die Optik.
Drücke ein Fass für Not Aus. Klick.
Das wird schon.
Ralla
5230_vis_bier_v4.jpg -
Noch einmal angepasst stand Heute.
Intro geändert,
Zeitplan eingefügt der alle 59 Sekunden triggert,
wenn Brauen ist ein wird das Programm ausgeführt.
nicht mehr per Kessel Temperatur
Brauen Ein / Aus eingefügt, DP Brauen Ein / Aus angelegt.
Der Rest wurde Versuchsweise angepasst / optimiert.
Versuche jetzt erst einmal eine Simulation des Programm zu erreichen.
Live testen geht ja nicht.
Wenn die Simu läuft geht es weiter.
Kann aber dauern.
Next,
Thema Sicherheit, Programm startet nur wenn ??
Hier z.B Stromausfall / Reboot, das Programm darf nie anlaufen.
Bei triggern automatischer Sicherheitskette ein Erfolgt was ?
Brauen ein geht nur wenn Biersorte gewählt ist.
Verbleibe erst einmal so
Ralla
5230_15_01_2019_teil_3.jpg
5230_15_01_2019_teil_2.jpg
5230_15_01_2019_teil_1.jpg -
Hi IOBroker,
Stück für Stück geht es weiter.
Visu und Datenpunkte sind minimal angelegt worden.
Slider zur Simulation habe ich noch eingefügt um den Kesselfühler zu simulieren.
Erste Test laufen nun aus der VIS heraus um das Programm von Fehlern zu bereinigen.
Da zu sind zwei Fragen aufgetaucht.
Die Schleife prüft die Bedingung am Anfang oder Ende der Schleife ?
Würde das Grundkonzept ja gerne nach Prüfung euch zur Verfügung stellen.
Der Blockly Code kann ja exportiert werden.
Mal angenommen jemand importiert diesen.
Müssen dann die Datenpunkte erst da sein ?
Ist der Import von Versionen abhängig ?
Möchte schon das es bis zur Grundversion läuft.
Gebrauchen kann ich das Programm nicht.
Ehrgeiz, ja etwas.
Treibt ja keiner..
Warum ? Um selbst zu lernen und Spass an der Freude.
Einen Einblick wie Bier gebraut wird habe ich auch bekommen.
Prost.
:mrgreen:
Danke Ralla
5230_dp_17012019.jpg
5230_vis_17012019.jpg
5230_schleife.jpg -
Hallo Ralla, hallo AlCalzone,
ihr beide seit echt der Knaller, vielen lieben Dank erstmal für eure Mühen, sich mit so einem Noob abzugeben und so viel Zeit in so ein Projekt zu investieren. da ich leider bis einschließlich heute extrem eingespannt war, bin ich nicht dazu gekommen, hier weiter zu bauen. Aber morgen habe ich was früher frei und es ist endlich Wochenende.
Ich werde mich umgehend wieder an dieses Hammerscript geben und weiter basteln und euch dann (hoffentlich) positive Auskunft über den Ablauf der Tests am "lebenden Objekt" geben können…
[Edit]: wie hast du denn diese grafische Darstellung auf dem mittleren Bild hingekriegt? Ist das auch IOBroker?
[Edit²]: Ach du liebe Zeit, was hast du denn da alles für Objekte angelegt? Hier steigt mein Verstand jetzt grade komplett aus. Ich habe doch nur 2 Objekte. Die Steckdose und mein Temperaturfühler. Wo kommen die ganzen anderen Dinger denn her und wie soll/ kann ich die in den Instanzen anlegen?
Ich bin grade komplett verwirrt… :?
-
Mittleres Bild ist aus IoBroker Vis.
In Vis kannst du Bilder einfügen, Schalter anlegen, Analoge Manometer darstellen usw.
Die Schalter, Manometer usw. haben eine Verbindung zu deinen Datenpunkten in den Objekten.
Du kannst Werte abholen oder in den Datenpunkten hinein schreiben.
Nee, keine Sorge, das Bild wäre eine Endausbaustufe.
Datenpunkte hast du nicht so viele.
Brauen ein,
Biersorte wählen,
Temperatur
Funke
Viel mehr wird das nicht.
Klöppel dir mal ein Grundgerüst zusammen was du minimum brauchst.
Kommentare füge ich ein.
Das wird nicht laufen, ist aber auch nur dafür gedacht das du ein Grundgefühl
dafür bekommst was du an Parametern brauchst.
Ralla
-
Jeder hat mal angefangen.
Anbei die Grundkonfig.
Wenn du Bierbrauen in Objekte / Datenpunkt auf true setzt wird sofort auf false geschaltet.
Aber logisch da deine Temperatur nicht eingebunden ist.
-
WOW, also Ralla,
ich habe das alles mal nachgebaut. Am lebenden Objekt kann ich es erst morgen gegen Mittag testen, da bis dahin die Küche für mich gesperrt ist.
Ich bin mir aber bei einigen Dingen ncht ganz sicher, ob die so funktionieren können.
Einmal die ganzen Objekte, bzw. Datenpunkte. Ich habe mal, davon ausgehend, dass ich erst einmal mit nur 3 Stufen ( Einmaischen, Kombirast und Abmaischen) anfange, die entsprechenden Stufen, bzw. Objekte erstellt. Sieht dann so aus:
Kann das so sein, oder müssen da noch Parameter gesetzt werden?
Das nachgebaute Script wäre ja ungefähr so:
Und hier kommt mein Dillema. Wenn ich die Logik richtig interpretiere, müsste das Script (für ein einfaches Lager mit einer ganz einfachen Kombirast) ja dann ungefähr so aussehen:
ich habe das einfach mal zusammengecopypasted, aber ich denke, ich habe das noch einige Denkfehler, die es zu bereinigen gilt. Ich teste das Ganz mal im Laufe des morgigen Tages, sobald mein Weibchen aus der Küche raus ist.
Dann sehen wir weiter.
Aber so weit erst einmal vielen lieben Dank für die Hilfe an diesem Projekt.
Und keine Sorge, mein Weizen hat alle Rasten durch und ist bei allen bis dato gut angekommen…