Mehrere Skripte zusammen fügen

Hallo,
da mein Feind PHP Skript mal wieder nicht so möchte wie ich, muss ich wohl hier wieder fragen.

Ich möchte gerne mehrere PHP Skripte der Status Meldungen eines MQTT Gerätes zusammen fügen, aber bekomme ein Ausrufezeichen vor dem Skript. Eigentlich ist das ja nichts anderes als einzelne Skripte die ich mit einem Ausgelösten Ereignis in die Variablen schreibe.

Das sind die einzelne Skripte pro Instanz:

und das ist das eine Skript mit den zusammen Führungen mit den Ereignis Meldungen:

und das der Inhalt:

<?php

$s = $_IPS['VALUE'];
$a = json_decode($s, true);
print_r($a); 


$array_var = json_decode($s, true);

// Instanz Status Informationen
setvalue (55666, $array_var['Status']['Module']);
setvalue (37528, $array_var['Status']['DeviceName']);
setvalue (25416, $array_var['Status']['FriendlyName']['0']);
setvalue (45508, $array_var['Status']['FriendlyName']['1']);
setvalue (41173, $array_var['Status']['Topic']);
setvalue (49747, $array_var['Status']['ButtonTopic']);
setvalue (52683, $array_var['Status']['Power']);
setvalue (12627, $array_var['Status']['PowerOnState']);
setvalue (43820, $array_var['Status']['LedState']);
setvalue (56702, $array_var['Status']['LedMask']);
setvalue (42182, $array_var['Status']['SaveData']);
setvalue (32602, $array_var['Status']['SaveState']);
setvalue (18723, $array_var['Status']['SwitchTopic']);
setvalue (19411, $array_var['Status']['SwitchMode']['0']);
setvalue (21706, $array_var['Status']['SwitchMode']['1']);
setvalue (13585, $array_var['Status']['SwitchMode']['2']);
setvalue (44890, $array_var['Status']['SwitchMode']['3']);
setvalue (33817, $array_var['Status']['SwitchMode']['4']);
setvalue (27350, $array_var['Status']['SwitchMode']['5']);
setvalue (56538, $array_var['Status']['SwitchMode']['6']);
setvalue (59101, $array_var['Status']['SwitchMode']['7']);
setvalue (37269, $array_var['Status']['ButtonRetain']);
setvalue (30841, $array_var['Status']['SwitchRetain']);
setvalue (23905, $array_var['Status']['SensorRetain']);
setvalue (23857, $array_var['Status']['PowerRetain']);
setvalue (22370, $array_var['Status']['InfoRetain']);
setvalue (45758, $array_var['Status']['StateRetain']);

// Instanz Geräte Informationen
setvalue (42822, $array_var['StatusPRM']['Baudrate']);
setvalue (53631, $array_var['StatusPRM']['SerialConfig']);
setvalue (34067, $array_var['StatusPRM']['GroupTopic']);
setvalue (13773, $array_var['StatusPRM']['OtaUrl']);
setvalue (14350, $array_var['StatusPRM']['RestartReason']);
setvalue (57526, $array_var['StatusPRM']['StartupUTC']);
setvalue (16139, $array_var['StatusPRM']['Uptime']);
setvalue (54142, $array_var['StatusPRM']['Sleep']);
setvalue (23309, $array_var['StatusPRM']['CfgHolder']);
setvalue (58330, $array_var['StatusPRM']['BootCount']);
setvalue (25503, $array_var['StatusPRM']['SaveCount']);
setvalue (13975, $array_var['StatusPRM']['SaveAddress']);
setvalue (36246, $array_var['StatusPRM']['BCResetTime']);

// Instanz Firmware Informationen
setvalue (38987, $array_var['StatusFWR']['Version']);
setvalue (59651, $array_var['StatusFWR']['BuildDateTime']);
setvalue (47137, $array_var['StatusFWR']['Boot']);
setvalue (27664, $array_var['StatusFWR']['Core']);
setvalue (42222, $array_var['StatusFWR']['SDK']);
setvalue (24889, $array_var['StatusFWR']['Hardware']);
setvalue (19848, $array_var['StatusFWR']['CR']);

// Instanz Log und Telemetrie Informationen
setvalue (39668, $array_var['StatusLOG']['SerialLog']);
setvalue (51890, $array_var['StatusLOG']['WebLog']);
setvalue (57355, $array_var['StatusLOG']['MqttLog']);
setvalue (50872, $array_var['StatusLOG']['SysLog']);
setvalue (19232, $array_var['StatusLOG']['LogPort']);
setvalue (15528, $array_var['StatusLOG']['SSId']['0']);
setvalue (46868, $array_var['StatusLOG']['TelePeriod']);
setvalue (46379, $array_var['StatusLOG']['Resolution']);
setvalue (13982, $array_var['StatusLOG']['SetOption']['0']);
setvalue (40831, $array_var['StatusLOG']['SetOption']['1']);
setvalue (43062, $array_var['StatusLOG']['SetOption']['2']);
setvalue (42784, $array_var['StatusLOG']['SetOption']['3']);

// Speicher Informationen
setvalue (30306, $array_var['StatusMEM']['ProgramSize']);
setvalue (27078, $array_var['StatusMEM']['Free']);
setvalue (38757, $array_var['StatusMEM']['Heap']);
setvalue (53702, $array_var['StatusMEM']['ProgramFlashSize']);
setvalue (30086, $array_var['StatusMEM']['FlashSize']);
setvalue (17483, $array_var['StatusMEM']['FlashChipId']);
setvalue (48774, $array_var['StatusMEM']['FlashFrequency']);
setvalue (43767, $array_var['StatusMEM']['FlashMode']);
setvalue (42194, $array_var['StatusMEM']['Features']['0']);
setvalue (20734, $array_var['StatusMEM']['Features']['1']);
setvalue (51416, $array_var['StatusMEM']['Features']['2']);
setvalue (39148, $array_var['StatusMEM']['Features']['3']);
setvalue (23588, $array_var['StatusMEM']['Features']['4']);
setvalue (48580, $array_var['StatusMEM']['Features']['5']);
setvalue (18805, $array_var['StatusMEM']['Features']['6']);
setvalue (57474, $array_var['StatusMEM']['Features']['7']);
setvalue (38433, $array_var['StatusMEM']['Features']['8']);
setvalue (19103, $array_var['StatusMEM']['Drivers']);
setvalue (40893, $array_var['StatusMEM']['Sensors']);

// Netzwerk Informationen
setvalue (59633, $array_var['StatusNET']['Hostname']);
setvalue (50510, $array_var['StatusNET']['IPAddress']);
setvalue (50094, $array_var['StatusNET']['Gateway']);
setvalue (58392, $array_var['StatusNET']['Subnetmask']);
setvalue (44068, $array_var['StatusNET']['DNSServer']);
setvalue (25412, $array_var['StatusNET']['Mac']);
setvalue (29827, $array_var['StatusNET']['Webserver']);
setvalue (29088, $array_var['StatusNET']['WifiConfig']);
setvalue (26816, $array_var['StatusNET']['WifiPower']);

// MQTT Informationen
setvalue (44217, $array_var['StatusMQT']['MqttHost']);
setvalue (19647, $array_var['StatusMQT']['MqttPort']);
setvalue (31733, $array_var['StatusMQT']['MqttClientMask']);
setvalue (36458, $array_var['StatusMQT']['MqttClient']);
setvalue (10948, $array_var['StatusMQT']['MqttUser']);
setvalue (54467, $array_var['StatusMQT']['MAX_PACKET_SIZE']);
setvalue (32311, $array_var['StatusMQT']['KEEPALIVE']);
setvalue (45397, $array_var['StatusMQT']['MqttCount']);

// Zeit Informationen
setvalue (49363, $array_var['StatusTIM']['UTC']);
setvalue (10077, $array_var['StatusTIM']['Local']);
setvalue (24974, $array_var['StatusTIM']['StartDST']);
setvalue (33818, $array_var['StatusTIM']['EndDST']);
setvalue (34087, $array_var['StatusTIM']['Timezone']);
setvalue (58197, $array_var['StatusTIM']['Sunrise']);
setvalue (56184, $array_var['StatusTIM']['Sunset']);

// Energie Monitoring
setvalue (54093, $array_var['StatusPTH']['PowerDelta']['0']);
setvalue (27155, $array_var['StatusPTH']['PowerDelta']['1']);
setvalue (55590, $array_var['StatusPTH']['PowerDelta']['2']);
setvalue (11380, $array_var['StatusPTH']['PowerLow']);
setvalue (56725, $array_var['StatusPTH']['PowerHigh']);
setvalue (46925, $array_var['StatusPTH']['VoltageLow']);
setvalue (39834, $array_var['StatusPTH']['VoltageHigh']);
setvalue (31663, $array_var['StatusPTH']['CurrentLow']);
setvalue (41240, $array_var['StatusPTH']['CurrentHigh']);

// Energie Verbrauch
setvalue (10494, $array_var['StatusSNS']['Time']);
setvalue (40863, $array_var['StatusSNS']['ENERGY']['TotalStartTime']);
setvalue (44838, $array_var['StatusSNS']['ENERGY']['Total']);
setvalue (40937, $array_var['StatusSNS']['ENERGY']['Yesterday']);
setvalue (26877, $array_var['StatusSNS']['ENERGY']['Today']);
setvalue (16781, $array_var['StatusSNS']['ENERGY']['Power']);
setvalue (32528, $array_var['StatusSNS']['ENERGY']['ApparentPower']);
setvalue (21786, $array_var['StatusSNS']['ENERGY']['ReactivePower']);
setvalue (44105, $array_var['StatusSNS']['ENERGY']['Factor']);
setvalue (18070, $array_var['StatusSNS']['ENERGY']['Voltage']);
setvalue (39715, $array_var['StatusSNS']['ENERGY']['Current']);

// Telemetrie Informationen
setvalue (53652, $array_var['StatusSTS']['Time']);
setvalue (46019, $array_var['StatusSTS']['Uptime']);
setvalue (52227, $array_var['StatusSTS']['UptimeSec']);
setvalue (50053, $array_var['StatusSTS']['Heap']);
setvalue (16944, $array_var['StatusSTS']['SleepMode']);
setvalue (48639, $array_var['StatusSTS']['Sleep']);
setvalue (37535, $array_var['StatusSTS']['LoadAvg']);
setvalue (16491, $array_var['StatusSTS']['MqttCount']);
setvalue (24610, $array_var['StatusSTS']['POWER1']);
setvalue (50013, $array_var['StatusSTS']['POWER2']);
setvalue (47784, $array_var['StatusSTS']['Dimmer']);
setvalue (40176, $array_var['StatusSTS']['Color']);
setvalue (14566, $array_var['StatusSTS']['HSBColor']);
setvalue (49661, $array_var['StatusSTS']['Channel']['0']);
setvalue (28984, $array_var['StatusSTS']['Channel']['1']);
setvalue (40280, $array_var['StatusSTS']['Channel']['2']);
setvalue (48076, $array_var['StatusSTS']['Scheme']);
setvalue (48777, $array_var['StatusSTS']['Fade']);
setvalue (37280, $array_var['StatusSTS']['Speed']);
setvalue (21400, $array_var['StatusSTS']['LedTable']);
setvalue (44154, $array_var['StatusSTS']['Wifi']['AP']);
setvalue (14955, $array_var['StatusSTS']['Wifi']['SSId']);
setvalue (53935, $array_var['StatusSTS']['Wifi']['BSSId']);
setvalue (15907, $array_var['StatusSTS']['Wifi']['Channel']);
setvalue (42913, $array_var['StatusSTS']['Wifi']['Mode']);
setvalue (53706, $array_var['StatusSTS']['Wifi']['RSSI']);
setvalue (31924, $array_var['StatusSTS']['Wifi']['Signal']);
setvalue (26469, $array_var['StatusSTS']['Wifi']['LinkCount']);
setvalue (15970, $array_var['StatusSTS']['Wifi']['Downtime']);

Was mache ich da falsch?

Mach mal testweise aus dem $_IPS[‚VALUE‘] in der ersten Zeile ein „GetValue(varIDmitPassendemInhalt);“ und führ das Script im Editor per Hand aus. Ausrufezeichen heißt häufig php Fehler.

meinst du so?

$s = GetValue(55666); //$_IPS[‚VALUE‘];

$a = json_decode($s, true);

print_r($a);

Das print_r ist dein rotes Ausrufezeichen!
Jede Ausgabe ist ein Fehler, sobald das Script nicht im Editor ausgeführt wird, wie z.b. durch ein Ereignis.
Michael

Ok, was ich nicht verstehe ist bei den einzelnen Skripte habe ich auch das print_r drin und da geht es oder verstehe ich dich falsch. Da müsste es ja dann das gleiche sein oder?

Auf jeden Fall sollte es dir das Logfile und Meldungsfenster fluten, da jede Ausgabe immer als Fehler interpretiert wird.
Zum testen im ScriptEditor kannst du auf $_IPS[‚SENDER‘] == ‚Execute‘ prüfen und nur dann prinr_r benutzen.
Dann wird die Ausgabe nur erzeugt, wenn du in der Konsole das Script zum testen ausführen willst.
Michael

Danke dir für die Info.
Habe jetzt das print_r ausgeklammert aber das Ausrufezeichen bleibt immer noch bestehen.

Und welche Meldung bekommst du, wenn du es im ScriptEditor ausführst?
Dazu muss aber, wie oben schon geschrieben, das GetValue benutzt werden, anstatt $_IPS[‚VALUE‘].
Michael

Notice: Trying to access array offset on value of type int in C:\ProgramData\Symcon\scripts\10343.ips.php on line 11

Notice: Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\10343.ips.php on line 11

Notice: Trying to access array offset on value of type int in C:\ProgramData\Symcon\scripts\10343.ips.php on line 12

Notice: Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\10343.ips.php on line 12

Notice: Trying to access array offset on value of type int in C:\ProgramData\Symcon\scripts\10343.ips.php on line 13

Notice: Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\10343.ips.php on line 13

Notice: Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\10343.ips.php on line 13

Notice: Trying to access array offset on value of type int in C:\ProgramData\Symcon\scripts\10343.ips.php on line 14

Notice: Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\10343.ips.php on line 14

Notice: Trying to access array offset on value of type null in C:\ProgramData\Symcon\scripts\10343.ips.php on line 14
Abort Processing during exceed of maximal ErrorCount: Trying to access array offset on value of type int
Error in Script C:\ProgramData\Symcon\scripts\10343.ips.php on Line 15

So und so ähnlich (letzte Ebene ist eine Zahl - int - und kein String) hast du das in vielen Zeilen. Vermtulich wäre

korrekt. Beachte die fehlenden Hochkomma ’
Ein var_dump anstelle des print_r könnte auch helfen die Datentypen zu betrachten.

Das Array hat nicht den Index und deswegen wirft PHP Fehlermeldung und du hast dein rotes Ausrufezeichen.
Zeigt doch bitte einmal die Ausgabe des print_r.
Michael

Hi,
jedes Event setzt vermutlich nur einen Wert und nicht die anderen. Ich schätze Du müsstest vor jedem

$array_var['Status']['Module']

noch mit isset prüfen ob es die Variable überhaupt gibt Wie schon öfter gesagt im symcon log bekommst Du den Fehler und die Zeile in der dieser Fehler auftrat.

Ralf

Hi,
irgendwie stehe ich auf dem Schlauch. Habe jetzt mal folgendes im Skript ergänzt und ausgeführt. Irgendwie schnalle ich das nicht, Sorry. Die ID 37932 ist die Value Variable mit dem JSON.

<?php

$s = GetValue(37932);//$_IPS['VALUE'];
print_r($s);

$a = json_decode($s, true);
print_r($a); 


$array_var = json_decode($s, true);
print_r($array_var);

Das ist die Ausgabe:

{"Status":{"Module":0,"DeviceName":"Tasmota","FriendlyName":["Tasmota","Tasmota2"],"Topic":"Plug_LED_01","ButtonTopic":"0","Power":0,"PowerOnState":3,"LedState":1,"LedMask":"FFFF","SaveData":1,"SaveState":1,"SwitchTopic":"0","SwitchMode":[0,0,0,0,0,0,0,0],"ButtonRetain":0,"SwitchRetain":0,"SensorRetain":0,"PowerRetain":0,"InfoRetain":0,"StateRetain":0}}Array
(
    [Status] => Array
        (
            [Module] => 0
            [DeviceName] => Tasmota
            [FriendlyName] => Array
                (
                    [0] => Tasmota
                    [1] => Tasmota2
                )

            [Topic] => Plug_LED_01
            [ButtonTopic] => 0
            [Power] => 0
            [PowerOnState] => 3
            [LedState] => 1
            [LedMask] => FFFF
            [SaveData] => 1
            [SaveState] => 1
            [SwitchTopic] => 0
            [SwitchMode] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                    [6] => 0
                    [7] => 0
                )

            [ButtonRetain] => 0
            [SwitchRetain] => 0
            [SensorRetain] => 0
            [PowerRetain] => 0
            [InfoRetain] => 0
            [StateRetain] => 0
        )

)
Array
(
    [Status] => Array
        (
            [Module] => 0
            [DeviceName] => Tasmota
            [FriendlyName] => Array
                (
                    [0] => Tasmota
                    [1] => Tasmota2
                )

            [Topic] => Plug_LED_01
            [ButtonTopic] => 0
            [Power] => 0
            [PowerOnState] => 3
            [LedState] => 1
            [LedMask] => FFFF
            [SaveData] => 1
            [SaveState] => 1
            [SwitchTopic] => 0
            [SwitchMode] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                    [6] => 0
                    [7] => 0
                )

            [ButtonRetain] => 0
            [SwitchRetain] => 0
            [SensorRetain] => 0
            [PowerRetain] => 0
            [InfoRetain] => 0
            [StateRetain] => 0
        )

)

Sieht doch gut aus - übrigens ist $a gleich wie $array_var

Jetzt kannste doch die Werte, z.B. $array_var['Status']['Module'] in eine andere Variable schreiben!

Oder wo ist jetzt das Problem?

Deshalb ist die Ausgabe auch zweimal vorhanden, wunderte mich schon. :sunglasses:

Das Problem bin ich selber :grinning:

Also so wie ich es gemacht habe:

setvalue (55666, $array_var['Status']['Module']);
setvalue (37528, $array_var['Status']['DeviceName']);
setvalue (25416, $array_var['Status']['FriendlyName']['0']);
setvalue (45508, $array_var['Status']['FriendlyName']['1']);
setvalue (41173, $array_var['Status']['Topic']);

aber so sieht es doch korrekt aus - jedenfalls wenn die IDs zu den Werten passen!?

Also so wäre es dann richtig. Das muss ich dann für jede Value Variable der einzelnen Instanzen im Skript mit der passenden ID einfügen oder kann ich hinter der ersten ID 37932 weitere ID’s einfügen. ich versuche mal mein Glück und berichte.

Naja, ich dachte du wolltest eigentlich auf ein Ereignis reagieren?!?

Das kannste doch machen und dann im Skript z.B. mit switch case (oder if then else) schauen welche Value Variable sich geändert hat und dann selektiv die Daten wegschreiben!

Gruß Heiko

Puh…mir qualmt die Birne.

Das Ereignis habe ich um die Variablen zu befüllen. Ich hole mit einem Skript und einem Ereignis minütlich die Daten vom Gerät ab und mit diesem Skript und Ereignis befülle ich die Variablen. Vielleicht geht das auch einfacher, hab keine Ahnung.

Vielleicht nochmal zum Mitschreiben von vorn …

Wie und wann wird die „Value“-Variable mit dem JSON befüllt? (Holst Du die Daten zeitgesteuert ab, werden sie über ein Gerät automatisch befüllt, oder wirst Du durch was getriggert und fragst die JSON Daten an und die werden dann in die Value Variable geschrieben)?

Vielleicht schreibst Du mal für mich zum Verständnis den gesamten Workflow auf und was die Geräten machen … also Temperatur messen oder oder oder . Dann kann ich mich vielleicht reindenken!

Gruß Heiko