Netatmo Abfrage meldet "attempt to index field '?' (a nil value)"

Hallo zusammen,

ich habe die Netatmo Station mit Außeneinheiten für Wind und Regen und wollte diese über das hier bereitgestellte Skrip integrieren.
Wenn ich das Skript dann laufen lasse, dann kommt dies hier:

Hi zusammen,

ich habe auch ein Problem mit dem Skript. Habe alles so angepasst, wie beschrieben. Aber dann passiert das hier:

[DEBUG] 08:50:00: netatmo v.2.0 (NEW API) gestartet...
[DEBUG] 08:50:01: Daten werden alle 5 min aktualisiert. Bei debug = 0 wird nichts debuggt
[DEBUG] 08:50:03: oAuth 2.0 durchgeführt.
[DEBUG] 08:50:03: netatmo Sensoren werden gesucht...
[DEBUG] 08:50:03: Mainstation: 70:ee:50:28:99:14 erkannt.
[DEBUG] 08:50:06: Regensensor 05:00:00:03:ae:d4 erkannt.
[DEBUG] 08:50:09: Windmesser 06:00:00:01:9a:00 erkannt.
[DEBUG] 08:50:12: [1;31m2017-05-22 08:50:12.725920 [ fatal] LUA error: /opt/fibaro/scenes/57.lua:107: attempt to index field '?' (a nil value)

Habe das Skript / die Szene schon gelöscht und wieder neu angelegt, das Problem bleibt aber. Ich habe lediglich im Header die geforderten Änderungen gemacht, sonst nichts.
Hat jemand eine Idee?

Danke!! :slight_smile:
Niclas

Hi,

hast du mehrere Mainstations mit einem Account verknüpft?

Gruß

Hi boomx,

nein. Nur die Eine. Und an der betreibe ich das Außenmodul, einen Windmesser und einen Regenmesser.
Ich habe das Thema gestern an einen Entwickler von uns gegeben. Der hat es gelöst.

Hier, was er mir gesagt hat:

Er hat mich gebeten diese Zeilen des Originalskripts

         int_id = v._id
  		   Debug( 'green', 'Mainstation: ' ..int_id.. ' erkannt.' )
         local counter = 1
          while (counter < max_counter) do

in diese Zeilen zu ändern

       int_id = v._id
             Debug( 'green', 'Mainstation: ' ..int_id.. ' erkannt.' )
         local counter = 1
         local max_count = 0
         for _ in pairs (v.modules) do max_count = max_count + 1 end
         while (counter <= max_count) do

und die Deklaration der Variable max_counter im Header ersatzlos zu löschen:

local max_counter = 6

Er sagte, dass diese das Problem sei und das Skript die ja eigentlich selber ermitteln sollte.

Ich habe die Änderung gemacht, ohne sie restlos zu verstehen ;-), und es klappt. :slight_smile:

Vielleicht hilft das ja auch anderen!

HG
Niclas

Hi Niclas,

Super, hatte das gleiche Problem. Mal führte ein max_counter Wert von 3 und mal einer von 4 zum Fehler. Mit der for-Schleife läuft jetzt alles prima.

Ich schalte meinen Robomäher abhängig vom Tages-Niederschlag und bin deshalb darauf angewiesen, dass das Script verlässlich läuft.

Besten Dank
Alex

Hi zusammen,

ich verweifle und hoffe, boomx oder jemand anderes hat noch eine gute Idee. Meine Abfrage läuft nach wie vor nicht rund… Nachdem es dann immer mal wieder ein paar Tage funktioniert crasht sie dann wieder, von einer Minute auf die andere, ohne, dass ich es merke. Da ich mich aber darauf verlasse, da ich die Anlage als Windwächter für meine Raffstore nutze, ist das sehr unglücklich… Screenshot anbei. Von jetzt auf gleich hat er ein Problem mit einem @ ?!

Danke vorab!!

VG
Niclas

Bildschirmfoto-2017-07-13-um-13.33.29.png

Hi Niclas,
Ja, die gleiche Problematik habe ich auch. Ich habe jetzt eine Funktion eingebaut, welche die Szene einmal am Tag neu startet. Ich hatte seitdem allerdings noch keinen Crash und kann deshalb nicht sagen, ob es funktioniert. Ehrlich gesagt glaube ich eher nicht daran, da der Aufruf der Funktion ja von der Szene abhängig ist. Man müsste also eher die Szene von “aussen” rebooten. Was sagen die Experten? Ist so etwas sinnvoll?

Gruss
Alex

Hi Alex,

da hatte ich auch schon drüber nachgedacht. Ich teile aber Deine Sorge: Wenn der Reboot “in” der Szene lebt, dann denke ich, dass das nichts bringt. Genau aus den von Dir genannten Gründen: Szene tot, Reboot tot… :frowning: Und eine zuverlässige Möglichkeit, die Szene von außen zu rebooten, habe ich noch nicht gefunden. Da fehlt mir wahrscheinlich die Expertise…

LG
Niclas

Hi Niclas,
Ist vielleicht leichter als gedacht. Man könnte ja einfach eine zweite (Autostart) Szene anlegen, welche die Netatmo Szene regelmäßig abschießt und wieder neu startet. Damit sollte das ja möglich sein: http://www.fibarouk.co.uk/support/lua/library/fibarokillscenes/
http://www.fibarouk.co.uk/support/lua/library/fibarostartscene/
Für einen Programmierer ist diese Vorgehensweise aber bestimmt nur eine Notlösung.
Gruss
Alex

Hallo Zusammen,
bei mir ist die Regenszene auch immer abgestürzt.
Dank eurer Tips habe ich das jetzt folgendermassen gelöst (hoffentlich):

  1. Globale Variable rain_log angelegt
  2. In der Regenszene in der Funktion oAuth folgende Zeile eingefügt (etwa Zeile 69):
    if (debug == 1) then
    Debug( ‘green’, ‘oAuth 2.0 durchgeführt.’ )
    end
    fibaro:setGlobal(“rain_log”, os.date(os.time())) – neu 13.07.17
  3. Folgende Szene RegenReboot erstellt:
--[[
%% autostart
%% properties
%% events
%% globals
--]]

function tempFunc()
local wtime = os.date(os.time()) 
if os.difftime(wtime,fibaro:getGlobal("rain_log")) > 360 then
  fibaro:debug(os.difftime(wtime,fibaro:getGlobal("rain_log")))
  fibaro:debug("Kill Regenszene 675 und Neustart Szene")
  fibaro:killScenes(675) -- ID Regenszene
  fibaro:startScene(675) -- ID Regenszene
  else
  fibaro:debug(os.difftime(wtime,fibaro:getGlobal("rain_log")))
end  
setTimeout(tempFunc, 60*1000) 
end

tempFunc()


Hi Jeff,

oh, das sieht smart aus und sollte funktionieren. Es wird also bei jedem Durchlauf die Zeit in die Globale Variable geschrieben. Die zweite Szene vergleicht dann die aktuelle Zeit mit der Variablen und wenn die Differenz größer als 6min ist dann wird die Szene neu gebootet.

Prima, bau ich mir auch so ein.

Danke
Alex

Hi Jeff,

perfekt, ich habe das mal bei mir so eingerichtet. Da ich bereits etwas ähnliches (aber nicht so cool wie Du!! Ich hatte versucht pauschal 1 mal am Tag zu resetten) versucht hatte es aber immer Probleme gab beim Stoppen und wieder Starten (wenn ich die Scene manuell stoppe und dann wieder starte läuft sie nicht an, sie bleibt irgendwie “hängen”) hatte ich das verworfen.

Was ich nun gemacht habe:
Ich habe in der Scene ergänzt, dass er die Zeit in eine globale Variable schreibt (so wie Du).
Ich habe das Restart-Skript eingerichtet (so wie Du)
In das Skript habe ich zusätzlich eine Notification gepackt, d.h. ich bekomme eine Push-Nachricht, wenn die Screne kracht.

Ich weiß dann also zum einen, wie häufig das passiert (wenn ich die Push-Nachricht bekomme) und ob der Neustart funktioniert hat (denn wenn nicht, dann erhalte ich die Push-Nachricht alle 6 Minuten.

Wir werden sehen! :slight_smile:

Es ist nur “krass”, dass wir alle diese Probleme haben und keiner weiß, warum… Strange…

Herzliche Grüße
Niclas

Hi Jeff,

da ist ein kleiner Fehler in Deinem Skript. Es läuft nicht alle 6 Minuten sondern 60 Sekunden, wenn ich das richtig verstehe. Die Angaben sind Milisekunden. 60 * 1000 sind 60.000. Und 60.000 Milisekunden sind 60 Sekunden. Es müssten also, bei 6 Minuten, eigentlich 360.000 sein. Oder liege ich falsch?

Viele Grüße
Niclas

Hallo Niclas,
das Skript prüft alle 60 Sekunden, ob die Differenz größer als 360 Sekunden ist.
Du kannst die Abfrage gerne alle 300 Sekunden ausführen lassen.
Wenn du den (Kontrolldebug) nach dem else eingeschaltet hast kannst du das überprüfen.
Das else sowie den debug danach kannst du auch löschen oder auskommentieren.
Gruß
Jeff

Hi Jeff,
das Script hat bei mir im Einsatz leider nicht funktioniert. Die Szene wird zwar beim …index field…-Fehler neu gestartet, aber es ruft dann keine Werte vom Netatmo Server ab. In meinem Fall muss ich erst eine winzige Änderung in der Netatmo Szene vornehmen (z.B. ein Leerzeichen in einem Kommentar löschen/hinzufügen), speichern und neu starten. Erst dann liest das Script die Werte von Netatmo neu ein und setzt die Variablen. Hat irgendwer vielleicht noch eine Idee wie man den Fehler umgehen bzw. die Szene erfolgreich neu starten kann.
Gruss
Alex

Hallo lodi,
gib am Ende der Netatmo-Szene folgendes ein:

if (sourceTrigger['type'] == 'autostart') then
  oAuth()
  elseif (sourceTrigger['type'] == 'other') then  -- neu 13.07.17
  fibaro:debug("Szene automatisch gestartet") -- neu 13-07.17
  oAuth() -- neu 13-07.17
end

Damit sollte die Szene gestartet werden.

Hi Jeff,
Prima, habe ich eingebaut. Das könnte es gewesen sein. Bin mal gespannt ob es jetzt funktioniert.
Vielen Dank für Deine Hilfe.
Cheers
Alex

Moin Jeff,
Du bist mein Star. Netatmo Script ist heute Nacht zweimal hängen geblieben und dann sofort wieder erfolgreich neu gestartet worden. Jetzt kann ich mich endlich auf die Werte verlassen.
Besten Dank und schönes Wochenende
Alex

Hallo,
freut mich das es jetzt geht.
Jetzt brauchst du nur noch das WLAN-Modul für den Robby. Dann kannst du ihn auch in die Garage schicken wenn es während dem Mähen beginnt zu regnen.

Hallo Forum,

ich brauche mal Hilfe von Euch. Habe das Script von Boomx (netatmo Regen- & Windmesser-Daten im Fibaro HC2)übertragen und wollte meinen Windmesser einbinden.
Die anderen Messwerte bekomme ich schon über das Plugin.
Die Anpassung habe ich gemacht (client id usw.), aber es passiert nichts ausser:

[DEBUG] 19:20:59: netatmo v.2.0 (NEW API) gestartet…
[DEBUG] 19:20:59: Daten werden alle 5 min aktualisiert. Bei debug = 0 wird nichts debuggt

Da ich das HC2 erst seit einiger Zeit habe und mich mit LUA noch nicht intensiv beschäftigt habe, kann ich als Anfänger keinen Fehler finden.
Hat jemand einen Tipp?
Vielen Dank
Gruß Uwe

Hi Uwe,

Schau Dir mal in diesem Thread den Beitrag von Jeff vom 20.07. an und bau den Codeschnipsel wie beschrieben am Ende der Szene ein. Das könnte helfen.
Gruss
Alex