Realisiere gerade ESP32 Gewächshaus-Controller, der jetzt 10 Werte zu
meinem Portal www.robosolar.de loggt und möchte die Regel-Logik nicht
fest codieren. Serverseitige Kontrolle geht auch nicht, da ich nur alle
30 Minuten drei 10-Minuten Logs hochlade.
Klar könnte ich jetzt in so 2 Tage eigene "Scriptsprache" entwickeln die
z.B. Lüfter anschaltet wenn (T_in > 35°C) und (V_batt>3.5V)
Hab dann aber eher keine Freude auch noch das webinterface zu
programmieren. Und über ein beta-Stadium würde ich wohl nie hinaus
kommen.
Also vielleicht kennt jemand schon so etwas.
Die 10 Werte liegen im Esp32 praktisch schon als float-array for, so
dass ich diese variablen leicht adressieren kann.
Ich würde das Endresultat (Lüfter an oder aus) dann zeilenweise
berechnen:
0: T_in > 35.0 => result0 = 1 oder 0
1: V_batt > 3.5 => result1 = 1 oder 0
2. result0 + result1 => result2 = 1 oder 2 oder 3
3. result2 == 3 => Lüfter an oder aus
Es gäbe also das 10-Werte Array, ein Parameter-Array und ein
Result-Array.
Dazu die Zeilenweise x?y Berechnung.
Wobei "?" ein Operator sein kann wie Wert>Parameter oder Wert>Wert oder
Wert>Result oder Result>Result.
Jeden Operator + - * / > < == gäbe es also vier mal.
Kodier in einem ascii Zeichen hätte ich Platz für (128-32)/4 = 24
mathematische/logische Operatoren.
Solch ein "Programm" lässt sich leicht codieren und vom Server zum
ESP-Client schicken.
Mag aber nicht schon wieder das Rad neu erfinden.
Also Ideen immer zu mir.
das Roland
Wenn ich den Anspruch hätte, dass das so allgemein geht, würde ich das
einfach selber schreiben. So schwer ist das nicht, ist vermutlich in 2-3
Stunden gemacht, und die Zeit würdest du zum Verstehen, Einbinden und
Anpassen irgendeiner komischen Bibliothek auch brauchen.
Das Interface würde ich sparen und die Regeln stattdessen in JSON oder
irgendeiner einfachen DSL (aka, selbst gebauten Mini-Sprache) kodieren.
Das Problem ist einfach zu klein für eine eigene Bibliothek, und zu
speziell um Teil einer größeren zu sein.
Das mit dem neu erfinden des Rades ist beim Programmieren auch oft
überbewertet. Das gilt für die allgemeinen, bekannt komplexen Probleme,
für die es etablierte, zuverlässige, getestete und dokumentierte
Bibliotheken gibt. Für jedes Obskurum von Github eine seit Jahren nicht
gewartete 100-Zeilen-Murksbibliothek zu importieren die so ungefähr das
tut was man braucht, davon ist eher abzuraten. Dann lieber selber
machen, dann weiß man was man hat.
Das R. schrieb:> Also vielleicht kennt jemand schon so etwas.
Im Bereich Home Automation gibt es diese ganze Scripterei auch mit
Datenbank und Visualisierung, z.B. OpenHAB mit InfluxDB/Grafana oder wie
sie alle heißen. Das läuft dann allerdings eher auf einem Raspberry Pi.
Wenn es textuell sein soll und es sich lediglich um Logik-Funktionen
handeln soll, könntest du dich vielleicht an AWL aus der SPS-Technik
orientieren. Einfaches Und / oder und Grenzwertvergleiche sind damit
recht einfach zu handhaben und die übersetzund auf dem
Automatisierungssystem unter Einschränkung der Funktionalitäten auch
kein Hexenwerk.
Für dein Lüfterbeispiel sähe das dann so aus:
Stefanus F. schrieb:> NodeMCU?
Ja an Lua hab ich auch gedacht. Hab aber wohl zu viele I2C Module am
Esp32..
Sven B. schrieb:> einfach selber schreiben. So schwer ist das nicht, ist vermutlich in 2-3> Stunden gemacht, und die Zeit würdest du zum Verstehen, Einbinden und
Ja wer das in 2-3 Stunden schafft ist wirklich gut. Hier meine 3
Stunden:
**online testen** ---> http://www.robosolar.de/calcy.htm
Die Berechnung wie "(v2>46.3)+(v10>3.0)=2=:s1" erfolgt von links nach
rechts.
v? = (sensor data)
g? = (global variables)
s? = (system variable like time or outupt-pins)
Der "=" Operator ist der Vergleichsoperator
Der "=:" Ist der Zuweise-Operator
Man kann also Werte für spätere Berechnung in g? speichern.
Mit s? kann man so auch die aktuelle Uhrzeit in die Berechnung
einbeziehen und zum Beispiel einen Lüfter für 2 Minuten anschalten..
Und nun freue ich mich auf bugs :-)
1
<html>
2
<body>
3
<divid=demo></div>
4
<script>
5
6
vars;// the calculation string
7
varaValue;// the array of values
8
varaGlobal;// the array of global variables
9
varaSystem;// the array of system variables,
10
// some readonly like time, some writeonly like output bits
11
12
functionGetTypeArray(sType)
13
{
14
switch(sType)
15
{
16
case"v":returnaValue;
17
case"g":returnaGlobal;
18
case"s":returnaSystem;
19
}
20
return0;
21
}
22
23
functionCalc(s)
24
{
25
variLen=s.length;
26
varo1=NextNum(s,0,iLen);
27
while(1)
28
{
29
varsOp=s.charAt(o1.j);
30
varo2=NextNum(s,o1.j+1,iLen);
31
varf=0;
32
switch(sOp)
33
{
34
case">":f=(o1.fRet>o2.fRet)?1:0;break;
35
case"<":f=(o1.fRet<o2.fRet)?1:0;break;
36
case"=":f=(o1.fRet==o2.fRet)?1:0;break;
37
case"+":f=o1.fRet+o2.fRet;break;
38
case"-":f=o1.fRet+o2.fRet;break;
39
case"~":
40
if (!o2.t)// syntax error: can not set o1.f to a constant variable
Das R. schrieb:> tefanus F. schrieb:>> NodeMCU?
meine empfehlung wäre MicroPython!!!
ich finde mit python kann man sehr effektiv/schnell solche aufgaben
erledigen und beispiele/projekte/lib's gibt es reichlich zum
starten/lernen/anwenden.
ich programmiere immer mehr in mpy und bin begeistert wie "einfach" sich
viele aufgaben in mpy erledigen lassen. in c muss ich da deutlich mehr
"klimmzüge" machen und python kenntnisse kann man auch sonst gut
ausserhalb embedded anwendungen gebrauchen.
mt