ich werd noch verrückt Ich sitze seit 3 Stunden über einem kleinen Problem, aber der Knoten will sich nicht lösen
Problemstellung:
Mein Auto übermittelt nun alle 5 Minuten seinen Kilometerstand mittels eines ESP8266.
Das funktioniert.
Nur leider ist dieser Kilometerstand nach einem Neustart meines ESP8266 wieder auf 0 zurückgesetzt und beginnt wieder nach oben zu zählen, wenn ich fahre.
Nun will ich also „NUR“ den Kilometerstand überleben lassen, wenn der ESP neu startet und er soll seine neuen Kilometer den alten hinzufügen und in eine Variable schreiben.
Da will sich der Knoten nicht lösen
Hier mein Lösungsansatz, der an „von hinten durch die Brust ins Auge“ nicht zu überbieten ist. Auch die 2. If Abfrage ist natürlich ein fail, wenn der ESP nochmal resettet…
<?php
$raw = GetValueInteger(23395); // Die Werte aus dem ESP8266
$save = GetValueInteger(59699); // Eine INT Variable zum zwischenspeichern
$ODO = 46366; // Die Variable, die alle gefahrenen Kilometer enthalten soll und geloggt wird
if ($raw > $save){
SetValueInteger(59699,$raw); // Normalbetrieb $save aktualisieren
sleep(1);
SetValueInteger($ODO,$save); // Wert in ODO schreiben
}
if ($raw < $save){ // Wenn $raw sich auf 0 resettet hat und kleiner als $save ist
SetValueInteger($ODO,$raw+$save);
}
Könnt ihr mir hier auf die Sprünge helfen?
Vielen lieben Dank und Gruß !
Sascha
nennt man Tageskilometerzähler
solltest du aber nur mit geloggt Variablen machen, einmal aus Versehen ausgelöst und alles ist auf Null.
So kannst du im Archiv den Stand rekonstruieren
vielen vielen Dank für die Lösungen.
Ich versuche mal Attains Version mit der kleinen Mod von Ralf
Tatsächlich muss der erste Wert nicht 0 sein. Wenn mein ESP resettet und ich gerade kein Handynetz habe, können da schon ein paar Kilometer zusammenkommen, bis ich wieder einen Upload vom ESP erhalte.
Verstehe ich das richtig, dass ich auf jeden Fall auf die Variable vom ESP loggen muss, damit das mit „Old Value“ funktioniert ?
bin gerade kurz noch einkaufen, kann dir aber später erklären, wie ich das gemacht habe.
Kurzer Teaser:
Der Kilometerstand ist nicht der, den das Auto hat, sondern an meinem ESP8266 hängt ein eigenes GPS Modul. Weiterhin habe ich im Auto einen mobilen Router mit 5V Versorgung und einer Daten SIM
Also ich verwende einen ESP8266 mit der Firmware „ESPeasy“.
Daran hängt ein GPS Modul von uBlox (M8N).
Das sendet mir dann mit MQTT alle gewünschten Werte nach Hause.
(Nicht nur GPS, es sind noch mehr Sachen verbaut, siehe Screenshot)
Und dank der Daten SIM im mobilen Router auch in Echtzeit, wenn ich unterwegs bin.
Ok, danke für die Erklärung. Hatte schon gedacht, den ESP kann man an das Fahrzeug koppeln.
In dem Zusammenhang eine zweite Frage: Wie kommen die Daten per MQTT aus der weiten Welt zu IPS? Ich meine, da gab es schonmal eine Diskussion über offene Ports als Einfallstor.
Ja, das mit dem Port habe ich noch nicht so im Griff
Zumindestens schicke ich über einen freien 6 Stelligen Port nach Hause und route dann um auf 1883 zu IPS. Aber sicher geht anders…das ist noch eine Baustelle.
Falls die anderen noch mitlesen, ich bin gerade mit dem Auto unterwegs und leider überlebt das Script den „Reset“ nicht. Es wird also ODO wieder zurück auf null gesetzt. Nach dem Reset schickt der ESP erstmal „-1“ als Wert. Kommt dadurch das Script durcheinander ?
Es gibt in der Testversion vom ESP gerade ein bug, was mich die Meter vor dem schicken nicht durch 1000 teilen lässt, damit ich kilometer bekomme.
Also berechne ich das jetzt auch vorübergehed in IPS.
Hier mal das Script, was gerade läuft:
Seht ihr da einen Fehler ?
Moin,
die -1 sollte keinen großen Einfluss haben. Schreibt vielleicht mal GetValue($0D0) sowie $_IPS[‚VALUE‘], $_IPS[‚OLDVALUE‘] und $diff ins IPS Logfile damit man mal sehen kann wann es zurückgesetzt wird und dann findet man bestimmt auch den Grund.
Bei Script 1 habe ich jetzt mal testweise deine zusätzliche Zeile herausgenommen.
Script 1 zählt jetzt nur noch jeden 3-4 Kilometer mit.
Dein Script Ralf (Script 2) überlebt einen Reset von meinem ESP, zieht mir dann aber einen Kilometer ab.
15 km in der Variable, ESP resettet, danach 14 km in der Variablen.
Wenn wir das noch in den Griff bekommen, würde ich mit diesem Script arbeiten wollen…
Script 1 liest sich zwar äußerst elegant, hat aber irgendwo noch einen größeren Haken…
Die ESP Variable ist in Metern, deswegen müssen die dazugehörigen Systemvariablen(VALUE /OLDVALUE) durch 1000 geteilt werden.
$ODO ist Kilometer und muss daher nicht geteilt werden.
da gebe ich dir mit den Metern recht. In meiner Variable ODO möchte ich nur Integer Kilometer angezeigt bekommen. Vom ESP kommen die Werte in meter.
Ich habe das gerade probiert umzubauen und habe mich dabei an meinen thread Titel erinnert
Wie kann ich in metern rechnen, aber die Variable mit km beschreiben ?
Morgen fahre ich mal ein paar Kilometer und schaue mir das verhalten nach einem Reset an.
Eventuell war das mit einmal zu viel durch 1000 teilen ja schon das Problem.