Letzten Wert größer als Null finden? Array summieren und Variabeln Profil

Guten Morgen,

verzeiht mir diese Fragen:o Habe sicherlich gesucht, aber vielleichtl mit den falschen Begriffen.

a)
Ich möchte z.B. für Wetteraufzeichnungen, den letzten Niederschlag aus dem Archiv.
Ich könnte mit IPS_GetVariable die letzte Änderung nehmen, aber bin mir sicher, dass dann irgendwann mal eine Null daraus kommt. Wie würde der Befehl lauten sich den letzten Wert inkl. Datum zu holen, der eine bestimmte Größe hat?

b)
Ich habe einen Array, circa so:

Array
(
    [0] => Array
        (
            [TimeStamp] => 1457910000
            [Avg] => 83.489951171875
            [MinTime] => 1457910007
            [Min] => 0
            [MaxTime] => 1457972481
            [Max] => 0.039999999999964
        )

    [1] => Array
        (
            [TimeStamp] => 1457305200
            [Avg] => 177.06
            [MinTime] => 1457305201
            [Min] => 0
            [MaxTime] => 1457793794
            [Max] => 0.040000000000191
        )

Wie bekomme ich Summen gebildet (von einem bestimmten Wert, ohne es von Hand wie ein Bauer zu machen, dass es nicht so aussieht? Da geht doch sicher was:)? Aber auf php.net finde ich keinen heißen TIpp, die Werte IN einem Array zu differenzieren.

$last3h = ($werte2[1] ['Avg'] + $werte2[2] ['Avg'] + $werte2[3] ['Avg']);
$last6h = ($werte2[1] ['Avg'] + $werte2[2] ['Avg'] + $werte2[3] ['Avg'] + $werte2[4] ['Avg'] + $werte2[5] ['Avg'] +$werte2[6] ['Avg']);

und die letzte wäre nur wegen Schönheit - ich wollte neben den Min und Max Werten im WebFront ein Symbol am UnixTimestamp Profil haben. Wie kann ich das Profil duplizieren, sodass es auch funktioniert, oder wie kann ich es manuell so hinkriegen, dass es wieder ein Datum aus dem String macht?

Schönen Tag, Danke an die Geduldigen und Gruß!

Moin!

Spontan würde ich sagen > einfach die letzten Werte mit for/foreach durchgehen und mit diesem Code prüfen, ob die Zahl != 0 ist und dann auf der Schleife raus springen:

if ($wert != 0)
{
    // mach irgendwas
}

Bzgl. Werte addieren. Lass es so :slight_smile: Du könntest das auch eine eine for/foreach Schleife stecken und dann mit += noch umschreiben und bla…aber am Ende kommt immer das gleiche raus und so ist es, meiner Meinung nach, übersichtlich und passt :slight_smile:

Grüße,
Chris

Hallo Chris,

ich dachte ihr rollt Euch auf dem Boden, wenn ihr mein 1.Klasse addieren seht und du sagst - passt!:rolleyes:

Um den Wert >0 zu finden, benutze ich dafür AC_GetAggregatedValues oder gibt es das was, was nur den Variabelnwert/Eintrag ausspuckt?

Ich tue mich schwer, dann aus der entandenen Liste, den getroffenen Wert in eine Variabel zu bekommen:confused: im
Angenommen das Script findet ihn im Array, dann habe ich keinen Plan, wie ich IPS dann sage: Nimm DEN da und nicht den letzten oder ersten.

Verstehst Du?

Du solltest auf jeden Fall die aggregierten Werte nehmen!

Um welchen Wert geht es dir denn? Um den hier?
[Avg] => xx

Du machst einfach ein foreach. Da werden alle Array-Einträge von 0 bis Ende durchgegangen. Bei jedem prüfst du, ob der Wert != 0 ist, wenn ja, dann schreibst du diesen einfach in eine Variable weg und beendet das foreach mit einem break. Dann hast du deinen Wert in einer extra Variable und kannst damit anstellen was du möchtest.

Schau dich mal hier um:
IP-Symcon - Wie kann ich… 2.0
…da gibt es viele viele Beispiele zu allen möglichen Dingen. Und vom Code her kannst du alles natürlich auch für andere Bereiche verwenden. Geht mehr um die Code-Beispiele, wo man sich was abschauen kann :slight_smile:

Grüße,
Chris

Da hab ich bisher jede qualvolle Scriptzeile her und aus der Beschreibung natürlich.

Wenn ein Script perfekt ist, erkenne ich keine Funktionsweise mehr. Und wenn ich mir das kopiere oder meine ein nStück zu gebrauchen können, bastel ich lange daran, dass alle Klammern und ;:, wieder richtig sind.

Zum probieren möchte ich den AVG Wert des Arrays haben, welchen den MaxTime Stamp „1457793794“ hat als Beispiel.

Ich bekomme aber immer den ersten Wert im array weggeschrieben, nicht den, den ich suche.


foreach($werte  as $wert)
{
if ($wert['MaxTime'] = 1457793794)
$test =  $wert['Avg'];
        break;
    }
SetValue(19695 /*[Test\Avg]*/, $test )

FAST richtig :wink:

foreach($werte as $wert) 
{ 
    if ($wert['MaxTime'] == 1457793794) 
    {
        $test =  $wert['Avg']; 
        break;
    }
} 
SetValue(19695 /*[Test\Avg]*/, $test );

$wert = 3 // damit wird einer Variable ein Wert zugewiesen
if ($wert == 3) // wenn ein Wert 3 ist (man beachte „==“) Es gibt auch noch „===“…aber das kannst du selbst nachlesen :slight_smile:

Mit dem break bin ich mir grad unsicher. Wenn der im IF ist, muss man dann das IF und das FOREACH breaken? :confused: Bau einfach ein echo über das break, dann siehst du, ob das IF funktioniert :slight_smile:

Ach…und wenn es mehrere Werte gibt mit dieser MaxTime, dann wird nur der 1. genommen. Ohne break der Letzte. wird ja dann immer überschrieben die Variable. Da brauchst du ggf. ein Array. Kannst du so testen:

foreach($werte as $wert) 
{ 
    if ($wert['MaxTime'] == 1457793794) 
    {
        $test[] =  $wert['Avg']; 
    }
} 
print_r($test);

Grüße,
Chris

und wenn es mehrere Werte gibt mit dieser MaxTime, dann wird nur der 1

Das wäre aber crazy, dass ein Unixzeitstempel in einer Variable mehrere Einträge hat:confused:? Und wenn, der Erste wäre ja der, den ich möchte um z.B: „Tage seit letzem Niederschlag“ zu bekommen.

Danke für deine Geduld Chris, ich weiß nicht warum, aber es klappt.

Aus diesem Array:

Array
(
    [0] => Array
        (
            [TimeStamp] => 1458244800
            [Avg] => 0
            [MinTime] => 1458244803
            [Min] => 0
            [MaxTime] => 1458244803
            [Max] => 0
        )

    [1] => Array
        (
            [TimeStamp] => 1458241200
            [Avg] => 0
            [MinTime] => 1458241256
            [Min] => 0
            [MaxTime] => 1458241256
            [Max] => 0
        )

    [2] => Array
        (
            [TimeStamp] => 1458237600
            [Avg] => 30.3457
            [MinTime] => 1458237649
            [Min] => 0
            [MaxTime] => 1458237864
            [Max] => 0.57749999999987
        )

    [3] => Array
        (
            [TimeStamp] => 1458234000
            [Avg] => 70.95858
            [MinTime] => 1458234043
            [Min] => 0
            [MaxTime] => 1458235012
            [Max] => 0.94248000000016
        )

    [4] => Array
        (
            [TimeStamp] => 1458230400
            [Avg] => 88.5654
            [MinTime] => 1458230436
            [Min] => 0
            [MaxTime] => 1458231650
            [Max] => 0.99175999999989
        )

    [5] => Array
        (
            [TimeStamp] => 1458226800
            [Avg] => 86.91606
            [MinTime] => 1458226829
            [Min] => 0
            [MaxTime] => 1458228078
            [Max] => 1.1904200000004
        )

    [6] => Array
        (
            [TimeStamp] => 1458223200
            [Avg] => 81.37668
            [MinTime] => 1458223221
            [Min] => 0
            [MaxTime] => 1458225167
            [Max] => 0.96866
        )

    [7] => Array
        (
            [TimeStamp] => 1458219600
            [Avg] => 59.04514
            [MinTime] => 1458219615
            [Min] => 0
            [MaxTime] => 1458222585
            [Max] => 1.3536600000002
        )

    [8] => Array
        (
            [TimeStamp] => 1458216000
            [Avg] => 58.80644
            [MinTime] => 1458216008
            [Min] => 0
            [MaxTime] => 1458216732
            [Max] => 0.88396000000012
        )

    [9] => Array
        (
            [TimeStamp] => 1458212400
            [Avg] => 59.86134
            [MinTime] => 1458212461
            [Min] => 0
            [MaxTime] => 1458214421
            [Max] => 0.9055199999998
        )

    [10] => Array
        (
            [TimeStamp] => 1458208800
            [Avg] => 36.75518
            [MinTime] => 1458208853
            [Min] => 0
            [MaxTime] => 1458210159
            [Max] => 0.77153999999973
        )

bekomme ich mit:

<?

foreach($werte as $wert)
{
    if ($wert['Max'] !=0 )
    {
        $Time =  $wert['MinTime'];
        $Value =  $wert['Avg'];
        break;
    }
}

SetValue(19695 , $Time );
SetValue(14916 , $Value );

print_r($Value);
echo " ";
print_r(date("d.m.Y", $Time));


?>

das:

30.3457 17.03.2016

Gruß!