Tabellen json

Hallo
habe eine frage.

Ich möchte nur einen teil einer Tabelle ausgeben und schaffe es nicht.
/docs/#!/consumption/getEnergyFromTo


--GET /energy/{timestampFrom}/{timestampTo}/{dataSet}/{type}/{unit}/{id}
local response = api.get("/energy/1467227100/1467231600/compare/devices/power/14")
local energy = json.encode(response)
print(energy)

im debug wird das ausgegeben.
[DEBUG] 09:13:44: [{“min”:1,“id”:14,“avg”:0,“W”:1,“name”:“ZwStWaschmaschine_14”,“kWh”:0.5,“max”:2050.2}]

Die frage ist wie kann ich mir nur die “kWh” oder "name"ausgeben.
habe es versucht mit print(energy.kWh) aber geht nicht.

Bitte um einen tip.

Hi,

hmmm… schwierig. Die Response ist leider keine reine json-response… Warum auch immer. Durch die vorangestellten [ und ] geht es nicht.

Muss dazu nochmal etwas testen.

Gruß

Hallo

ich habe einiges gelesen und probiert nichts hat funktioniert.
Habe sogar aus dem String die [] mit diesem “energy = string.sub(energy, 2, #energy-1)” raus genommen abertrotz den funktioniert es nicht.

Hier wird auch so mit den [] klamern gearbeitet es…> LinkLua Tabellen

Danke im voraus.

Hallo
Habe die lösung funktioniert perfekt.
Ich verstehe das k und das v aus der schleife nicht.
Kan mann was dazu sagen???


jsonListe = api.get("/energy/1467227100/1467231600/compare/devices/power/14")    --api.get("/panels/heating")
-----------------------------------------------------------------------
result = ""
for k, v in pairs(jsonListe) do
  result = v.kWh
end
result = result
fibaro:debug("Energy "..result.." kWh")

Hi,

da könnte auch a & b stehen. Da du ein Table von der Abfrage zurückbekommst, werden damit die einzelnen Zeilen der Tabelle durchgegangen. In der Zeile v steht dann der json-response.

Gruß

Hallo
Wolte es nur bekant machen.
habe eine noch elegantere Lösung mit den Eckigen klammern in einer Tabelle.
Das ist die erste Lösung und funktioniert auch gut.


jsonListe = api.get("/energy/1467227100/1467231600/compare/devices/power/14") 
-----------------------------------------------------------------------
result = ""
for k, v in pairs(jsonListe) do
  result = v.kWh
end
result = result
fibaro:debug("Energy "..result.." kWh")

 

Das ist die Elegante Lösung, ganz schlank.


jsonListe = api.get("/energy/1467227100/1467231600/compare/devices/power/14") 
print(json.encode(jsonListe[1].kWh))

Gruß Parip69

Hallo
habe eine Funktion geschrieben um Zustände zu überprüfen aus einer Tabelle mit ID’s.
Beispiel: wen jemand wissen will ob irgend ein licht an oder aus. Die return hat 3 Zustände.
Habe es für meine “Lichter an solange Bewegung” erkant wird.


local lichterID = {129,145,147} 

function lichtCheckAnAus();
local r1 = 0; local r2 = 0
for i,n in ipairs(lichterID) do 
if (tonumber(fibaro:getValue(n, "value")) == 0) then;
r1 = 1 else; r2 = 1; end; end;  
-- return: 10-alle AUS, 01-alle Ein, 11-Ein Schalter ist mindestens AN oder AUS. 
return (r1..r2);end;

Gruss

Hi
habe eine Funktion geschrieben bei der mann vermeidet den gleichen debug Eintrag hintereinander zu schreiben.
Mich hat es genervt das Der Debug vollteuft mit dem gleichen Eintrag. Ich habe in meinem Waschmaschinen Script mit einer Hilfsvariable gelöst war aber umständlich und nicht flexibel genug.
Wer es braucht hier.

Scene ID anpassen und den debug wie im beispiel.

Wenn es andere Vorschläge gibt oder Verbesserungen dann bin ich interessiert.


--[[
%% properties
%% events
%% globals
--]]
local sceneID = 34  -- Id der eigenen scene.
---#######################################################################################
debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
---#### kalaCheckDebug(color , txtDebug) #################################################
function kalaCheckDebug(color , txtDebug);  
  local jsonString = api.get("/scenes/"..sceneID.."/debugMessages")
  if (json.encode(jsonString)) == "[]" then;
     debug("blue", txtDebug);return false; 
  else;
      local debugTxt = (json.encode(jsonString[#jsonString].txt));
      if txtDebug == string.match(debugTxt,txtDebug) then; return true; 
      else; debug(color, txtDebug); return false; end; end;
end;

kalaCheckDebug("green","Die Grunstellung wurde angestossen.");

Gruss

Vielen Dank für deine Gedanken, welche du dir machst. Durch Leute wie dich wächst unsere Communtiy immer weiter und lernt von einander :slight_smile:

Gruß

Hallo
ich habe festgestellt das die Funktion nicht vergleichen kann obwohl beim ausdruck im debug beide Variabel gleich sind.
Es kommt nie zu einer Übereinstimmung.
Ich komme nicht weiter seit tage habe ich versucht heraus zu finden wo der fehler liegt…komme nicht dahinter.
Bitte um einen tip.

Den test code kann mann in eine scene eingeben und die ID anpassen und man kann sehn das er duch den repeat 5x durchläuft und darf das eigentlich nicht.
Wenn es eine übereinstimmung geben würde mus er im debug Rot erscheinen.


--[[
%% properties
%% events
%% globals
--]]
local sceneID = 34  -- Id der eigenen scene.
---#######################################################################################
debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
---#### kalaCheckDebug(color , txtDebug) #################################################
function kalaCheckDebug(color , txtDebug);
  local jsonString = api.get("/scenes/"..sceneID.."/debugMessages")
  
  if (json.encode(jsonString)) == "[]" then;
     debug("blue", txtDebug..' Nach leere debug.');return false; 
  else;
      local debugTxt = (json.encode(jsonString[#jsonString].txt));
    		debugTxt = string.sub(debugTxt, 2, #debugTxt -1)
    print(debugTxt)
      if txtDebug == string.match(debugTxt,txtDebug) then;
      	debug("red", txtDebug); return true; 
      else; 
      	debug(color, txtDebug); return false; 
      end; 
  end;
end;
 ------------------------------------------------------------------------------------------------
test1 = 1
repeat;

  kalaCheckDebug('royalblue',os.date("Licht um %H:%M Uhr (%d.%m.%Y) Ausgeschaltet. Die Lichter waren."));
  --kalaCheckDebug("green","Die Grunstellung wurde angestossen.");
  

  fibaro:sleep(3*1000);
  test1 = test1+1
until test1 >= 5

print('..........................')

So schaut es in der api aus.


[
  {
    "timestamp": 1484352980,
    "type": "DEBUG",
    "txt": "<span style=\"color:blue;\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren. Nach leere debug."
  },
  {
    "timestamp": 1484352983,
    "type": "DEBUG",
    "txt": "<span style=\\\"color:blue;\\\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren. Nach leere debug."
  },
  {
    "timestamp": 1484352983,
    "type": "DEBUG",
    "txt": "<span style=\"color:royalblue;\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren."
  },
  {
    "timestamp": 1484352986,
    "type": "DEBUG",
    "txt": "<span style=\\\"color:royalblue;\\\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren."
  },
  {
    "timestamp": 1484352986,
    "type": "DEBUG",
    "txt": "<span style=\"color:royalblue;\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren."
  },
  {
    "timestamp": 1484352989,
    "type": "DEBUG",
    "txt": "<span style=\\\"color:royalblue;\\\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren."
  },
  {
    "timestamp": 1484352989,
    "type": "DEBUG",
    "txt": "<span style=\"color:royalblue;\">Licht um 01:16 Uhr (14.01.2017) Ausgeschaltet. Die Lichter waren."
  },
  {
    "timestamp": 1484352992,
    "type": "DEBUG",
    "txt": ".........................."
  }
]

Grus ich hoffe das jemand einen tip hat.

Hallo
habe es geschafft war eine harte nuss für mich.
Die return kann man raus nehmen damit der Code schlanker und schneller wird.
Hatte Probleme mit nicht druckbare eichen mit > diesem Zeichen.
Kann man das schlanker machen oder zusammenfassen? debugTxt = string.sub(debugTxt, 1, #debugTxt -1); debugTxt = debugTxt:match(">([^,]+)");

viel spass jetzt ist der Debug übersichtlich.


--[[
%% properties
%% events
%% globals
--]]
local sceneID = 34  -- Id der eigenen scene.
---#######################################################################################
debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
---###### kalaCheckDebug(color , txtDebug) #################################################
function kalaCheckDebug(color , txtDebug);  
  local jsonString = api.get("/scenes/"..sceneID.."/debugMessages")
  if (json.encode(jsonString)) == "[]" then; debug(color, txtDebug);return false; 
  else; local debugTxt = (json.encode(jsonString[#jsonString].txt));
	debugTxt = string.sub(debugTxt, 1, #debugTxt -1); debugTxt = debugTxt:match(">([^,]+)");  
	if  debugTxt == txtDebug then; return true; 
	else; debug(color, txtDebug); return false; end; end;
end;

 ----[[----------------------------------------------------------------------------------------------
test1 = 1
repeat;

  kalaCheckDebug('royalblue',os.date("Licht um %H:%M Uhr (%d.%m.%Y) Ausgeschaltet. Die Lichter waren."));
  --kalaCheckDebug("green","Die Grunstellung wurde angestossen.");
  

  fibaro:sleep(3*1000);
  test1 = test1+1
until test1 >= 10

print('.... Erfolgreich 10 durchläufe ohne wiederholung. .....')

----]]

Hallo
Habe mal wieder eine frage.
Ich weis das Das was ich unten dargestellt habe nicht funktioniert, aber wie kann ich den wert auslesen aus der jsonListe.


local jT = json.decode(fibaro:getGlobalValue("HomeTable"))
fibaro:debug(json.encode(jT.WohnZimmer))

--die  jT schaut dan so aus im Debug -> {"RolloWZ1":183,"RolloWZ2":192,"RolloWZ4":198,"RolloWZ3":195,"RolloWZ5":189,"RolloWZ6":186}

for k, v in pairs(jT) do
  fibaro:call(v, 'open');
end

Vielen dank im voraus.

Hallo Parip69,

versuche mal fibaro:call(jT.WohnZimmer.RolloWZ1, ‘open’); das sollte erstmal gehen!
In jT steht ja Deine ganze HomeTable drin. Diese besteht sicherlich aus mehr Einträgen als nur Wohnzimmer
Deswegen kann es in pairs(jT) nicht funktionieren. Da fehlt der Sprungpunkt Wohnzimmer

Gruß
ChrisBeat

Hallo Parip69,

du könntest aber auch alle Devices vom Typ Roller Shutter in Raum abfragen und dann diese schalten oder prüfen.


--Mittels folgendem Code wird im Raum ID 5 nach allen com.fibaro.doorSensor gesucht und die Werte 
-- id und lastBreached ausgegeben

APIroomDevices = api.get('/devices?roomID=7')
		
    for j=1, #APIroomDevices do
		
	if APIroomDevices[j].type == 'com.fibaro.doorSensor' or APIroomDevices[j].type == 'com.fibaro.windowSensor' then
		print("SensorID: " ..APIroomDevices[j].id) 
    		print("Name: " ..APIroomDevices[j].name) 	
    		print("Ausgelöst: " ..(os.date("%d.%m.%Y - %H:%M:%S", APIroomDevices[j].properties.lastBreached)))			
	end		
    end 

Leider mangels RollerShutter kann ich Dir den DeviceTyp nicht nennen.