AIOServer: Problem mit LUA Skript

Für alles was nicht zu den anderen Themen passt !

AIOServer: Problem mit LUA Skript

Beitragvon micha » 21. Juli 2014, 09:37

Guten Tag

Ich evaluiere derzeit den Mediola AIO Server. Ich habe die Debian Version auf meinem Server installiert.

Bisher sieht alles sehr gut aus und funktioniert auch sehr zuverlässig. Einzig bei der Implementierung eines Lua Skriptes komme ich einfach nicht mehr weiter. Entweder ist es mein Status als Lua Anfänger und ich mache etwas sehr sehr falsch … , oder es steckt noch ein Bug im System.

Vielleicht kann mir hier jemand helfen?

Für eine einfache Klima Regelung mit einer einfachen Zweipunktsteuerung, d.h. bei 28 Grad Klimaanlage anschalten und bei Erreichen von 26 Grad wieder ausschalten. Also sehr trivial, aber es funktioniert auch nach zig versuchen nicht. Nach langem testen bin ich auf folgenden Sachverhalt gestoßen.

Folgendes einfaches IF Statement wird nicht korrekt ausgeführt, obwohl die Bedingung mit dem aktuellen Messwert
z.B. state_temp_int=300 (gleich 30.0 Grad) zutrifft:

Code: Alles auswählen
if bool_KlimaAnlage == false and state_temp_int > 280 then
        -- Klima "off"
      bool_KlimaAnlage = true;
end


Dann habe ich mal die Differenz zwischen Messwert und Sollwert gebildet, da ich ein Problem mit den Datentypen bei der Umwandlung des Messwertes von String nach Zahl/Integer vermute.

Code: Alles auswählen
Int_delta = Int_delta - 280; -- hier geht es in die hose
if ( Int_delta > 0) then
--    Klima "on"
      bool_KlimaAnlage = true;
end


Das Ergebnis ist immer eine große 4 stellige negative Zahl (-2514), wo im obigen Beispiel 300-280=20 hätte rauskommen müssen. Zumindest wird das so in der zum Gateway übertragenen Variable so angezeigt.

Im Anschluss noch das Skript als Ganzes. Vielleicht kann mir jemand sagen, was für einen Fehler ich da eventuell mache? Ich habe schon viele möglichen Varianten ausprobiert.

Mit freundlichen Grüßen
Michael Klein

________________________________________
Code: Alles auswählen
--state_temp_str = "290";

function Klima(state)
-- nur wenn notwendig "Power" schicken
  if (not bool_KlimaAnlage) and (state=="on") then
        send_command("Services.Klima", "Power")
  end
  if (bool_KlimaAnlage) and (state=="off") then
        send_command("Services.Klima", "Power")
  end
end

-- Aktuelle Stati vom Gateway holen:

bool_KlimaAnlage = not not get_state("var:Status.B_KlimaAnlage");
state_temp_str = get_state("Services.Temperatur:1");
state_temp_int = 0;

-- Gateway liefert string, brauche int:
if (state_temp_str) then
   state_temp_int = tonumber(state_temp_str);
end

-- auf 3 Stellen normieren: state_temp_str:len() < 3
if string.len(state_temp_str) < 3 then
    state_temp_int = state_temp_int * 10;
end

Int_delta = (state_temp_int * 1)

--Int_delta = Int_delta - 280; -- hier geht es in die hose
--if ( Int_delta > 0) then
--    Klima "on"
--      bool_KlimaAnlage = true;
-- end

-- bool_KlimaAnlage == false & Temperatur > 28 d.h. Anschalten!

if bool_KlimaAnlage == false and state_temp_int > 280 then
        -- Klima "off"
      bool_KlimaAnlage = true;
end

-- bool_KlimaAnlage == true & Temperatur < 26 d.h. Abschalten!

if bool_KlimaAnlage == true and state_temp_int < 260 then
        -- Klima "off"
        -- bool_KlimaAnlage = false;
end

--Stati zum Gateway zurückschreiben:

-- bool in für Gateway notwendiges Textformat umwandeln

if bool_KlimaAnlage then
  TXT_bool_KlimaAnlage = "on";
else
  TXT_bool_KlimaAnlage = "off";
end

send_command("var:Status.B_KlimaAnlage", TXT_bool_KlimaAnlage);

send_command("var:Status.T_KlimaTemp", "+" .. Int_delta ); -- oder state_temp_int

wait(5);
-- warten damit wir den Aufruf im Monitor sehen können!

--
micha
 
Beiträge: 6
Registriert: 20. März 2012, 15:29

Zurück zu Off Topic

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron