Knoten im Hirn!

Hallo Gemeinde,

ich werd noch verrückt :slight_smile: Ich sitze seit 3 Stunden über einem kleinen Problem, aber der Knoten will sich nicht lösen :frowning:

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 :frowning:
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

Hi,
versuch mal:

$current_value = GetValue(59677); // von ESP
$last_value = GetValue(24218); // Zwischenspeicher
$summe = GetValue(50994); 

if ($current_value < $last_value){
    $summe += $current_value;
}
else{
    $summe += ($current_value - $last_value);

}
SetValue(50994, $summe);
SetValue(24218, $current_value);

Ralf

Script wird getriggert auf Veränderung der ESP Variable.

<?php
$ODO  = 46366;

$diff = $_IPS['VALUE'] - $_IPS['OLDVALUE'];
If ($diff > 0)
{
    SetValue($ODO,GetValue($ODO)+$diff);
}

nennt man Tageskilometerzähler :grin:
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

Hi Attain,

kleine Änderung:

If ($diff > 0)
{
    SetValue($ODO,GetValue($ODO)+$diff);
}
else
{
    SetValue($ODO,GetValue($ODO)+$_IPS['VALUE']);
}

sonst verlierst Du den ersten neuen Wert was sich auf Dauer aufsummieren kann.

Ralf

Hi Ralf,

der Erste Wert ist 0 und damit irelevant.

Nur leider ist dieser Kilometerstand nach einem Neustart meines ESP8266 wieder auf 0 zurückgesetzt

Hi,

verlassen würde ich mich sicherheitshalber darauf nicht. Hängt von vielen Faktoren ab.

P.S. deine Lösung ist deutlich eleganter :smiley:
Ralf

1 „Gefällt mir“

Hallo Gemeinde,

vielen vielen Dank für die Lösungen.
Ich versuche mal Attains Version mit der kleinen Mod von Ralf :slight_smile:
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 ?

Vielen Dank für eure Hilfe !

Nein, ein loggen ist nicht nötig.

1 „Gefällt mir“

Die lapidare Aussage bringt mich schon zum Staunen. Wie funktioniert das?

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

Sooo, jetzt wieder da :slight_smile:

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 :frowning:
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 ?

<?php
$ODO  = 46366;

$diff = ($_IPS['VALUE']/1000) - $_IPS['OLDVALUE'];
If ($diff > 0)
{
    SetValue($ODO,((int)GetValue($ODO/1000)+$diff));
}
else
{
    SetValue($ODO,((int)GetValue($ODO/1000)+$_IPS['VALUE']/1000));
}





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.

Ralf

Guten Morgen Ralf :slight_smile:

meinst du so in etwa ?
Hab noch nie etwas ins log geschrieben :frowning:

IPS_LogMessage($_IPS['SELF'], "Value = " .$_IPS['VALUE']);
IPS_LogMessage($_IPS['SELF'], "Old Value = " .$_IPS['OLDVALUE']);
IPS_LogMessage($_IPS['SELF'], "Diff = " .$diff);

Hi,
ich würde es so:

IPS_LogMessage("ESP8266", "Value = " .$_IPS['VALUE']." Old Value = " .$_IPS['OLDVALUE']." Diff = " .$diff); 

machen ist Platzsparender und die Werte würden untereinander stehen zum schnelleren Vergleich.

Ralf

Hallo zusammen,

jetzt wirds langsam wild :slight_smile:
Ich habe parallel beide Scripte gerade laufen.

Script 1:

<?php
$ODO  = 46366;

$diff = ($_IPS['VALUE']/1000) - $_IPS['OLDVALUE'];
If ($diff > 0)
{
    SetValue($ODO,((int)GetValue($ODO/1000)+$diff));
}
else
{
    //SetValue($ODO,((int)GetValue($ODO/1000)+$_IPS['VALUE']/1000));
}


IPS_LogMessage("ESP8266", "Value = " .$_IPS['VALUE']." Old Value = " .$_IPS['OLDVALUE']." Diff = " .$diff);

und Script 2:

<?php

$current_value = GetValue(23395)/1000; // von ESP
$last_value = GetValue(50944); // Zwischenspeicher
$summe = GetValue(10681); 

if ($current_value < $last_value){
    $summe += $current_value;
}
else{
    $summe += ($current_value - $last_value);

}
SetValue(10681, (int)$summe);
SetValue(50944, (int)$current_value);

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…

Liebe Grüße

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.

$ODO  = 46366;

$diff = (int)($_IPS['VALUE']/1000) - (int)($_IPS['OLDVALUE']/1000);
If ($diff > 0)
{
    SetValue($ODO,GetValue($ODO)+$diff);
}
else
{
    //SetValue($ODO,GetValue($ODO)+(int)($_IPS['VALUE']/1000));
}


IPS_LogMessage("ESP8266", "Value = " .$_IPS['VALUE']." Old Value = " .$_IPS['OLDVALUE']." Diff = " .$diff);

Wäre es aber nicht genauer die Meter zu loggen, als bei jeder Datenübertragung rundungsfehler zu bekommen?

Attain

Hallo Attain,

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 :frowning:

Wie kann ich in metern rechnen, aber die Variable mit km beschreiben ?

Das habe ich momentan am laufen:

<?php
$ODO  = 46366;

$diff = ($_IPS['VALUE']/1000) - $_IPS['OLDVALUE']/1000;
If ($diff > 0)
{
    SetValue($ODO,((int)GetValue($ODO)+$diff));
}
else
{
    SetValue($ODO,((int)GetValue($ODO)+$_IPS['VALUE']/1000));
}

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.

Liebe Grüße