Prozess-Management

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Prozess-Management

Beitrag von Seecosmea » Fr 10. Nov 2017, 12:27

Moin

veruche ueber das ein Prozess-Management Programm an fortlaufenden Daten zu kommen. Im Terminal Program kann Ich mit dem folgendem code das Program fehlerfrei starten:

pi@raspberrypi:~ $ python /home/pi/py4.py

Unter Gambas habe ich den folgenden code:

Dim sContents As String
Exec ["python", "/home/pi/py4.py"] To sContents
TextArea1.text = sContents

Der Datenstrom soll dann im TextArea Window angezeigt werden. Der Daten Satz sollte Zeile fuer Zeile geschrieben werden, genau so wie im Terminal Window:

{"counter_mode": false, "debounce": 0, "value": 0, "bitvalue": 0, "dev": "input", "circuit": "1", "time": 3004096369}
{"interval": 15, "value": 23.4, "circuit": "28FFC50AB4160325", "address": "28FFC50AB4160325", "time": 1510306273.496407, "typ": "DS18B20", "lost": false, "dev": "temp"}

Kann mir Bitte jemand helfen.

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Prozess-Management

Beitrag von gambi » Fr 10. Nov 2017, 19:45

Hallo Seecosmea,
ich verstehe nicht, was du konkret erwartest.
Ist das gezeigte die Ausgabe im Terminal? Wie sieht dann die Ausgabe in der TextArea aus?

gg

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » Fr 10. Nov 2017, 20:45

Hallo Gambi,

das gezeigte ist die Ausgabe im Termnial; mein oben gezeigtes Programm funktioniert leider nicht. Eigentlich soll“Exec“ das Puthon Programm „ph4.py“ starten und den Datenstrom direkt in die Text Area umleiten.

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Prozess-Management

Beitrag von gambi » Fr 10. Nov 2017, 20:55

Was steht denn in sContents, wenn du die Variable ausliest?

gg

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » Sa 11. Nov 2017, 08:19

Hallo Gambi,

ich habe das Programm umgeschrieben, jetzt werden auch wieder Daten in die TextArea1 geschrieben. Leider werden Werte nicht Datensatz fuer Datensatz in die TextArea1 geschrieben. Jede 20 Sekunden kommt ein Schwall Daten an, 40 Datensaetze werden auf einemal in der TextArea1 geschrieben.

Besteht die Moeglichkeit den Code so zu veraendern das jeder Datensatz sofort in die Text Area geht?

Hier mein neuer Code:
------------------------------------------------------------------
Gambas class file
Private $hProcess As Process

Public Sub Form_Open()
$hProcess = Shell "python /home/pi/py4.py" For Read As "py4"
End

Public Sub py4_Read()
Dim sPuffer As String
TextArea1.Insert(gb.NewLine)
sPuffer = ""
Read #$hProcess, sPuffer, Lof($hProcess)
TextArea1.Insert(sPuffer)
End


Hier der Datensatz der auf einmal empfangen wird:


{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"counter_mode": false, "debounce": 0, "value": 1, "bitvalue": 1, "dev": "input", "circuit": "1", "time": 3987938578}
{"counter_mode": false, "debounce": 0, "value": 0, "bitvalue": 0, "dev": "input", "circuit": "1", "time": 3987939083}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 15, "value": 23.75, "circuit": "28FF7015B416031A", "address": "28FF7015B416031A", "time": 1510372049.495841, "typ": "DS18B20", "lost": false, "dev": "temp"}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.001391240831075188, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 15, "value": 24.05, "circuit": "28FF9105B41604B6", "address": "28FF9105B41604B6", "time": 1510372055.337789, "typ": "DS18B20", "lost": false, "dev": "temp"}
{"interval": 1.0, "value": 0.001391240831075188, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"counter_mode": false, "debounce": 0, "value": 1, "bitvalue": 1, "dev": "input", "circuit": "1", "time": 3998178709}
{"counter_mode": false, "debounce": 0, "value": 0, "bitvalue": 0, "dev": "input", "circuit": "1", "time": 3998179214}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.0013042882791329889, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 1.0, "value": 0.0014781933830173874, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}
{"interval": 2.0, "value": 0.001304288

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Prozess-Management

Beitrag von gambi » Sa 11. Nov 2017, 12:30

Hallo Seecosmea,
versuche doch mal diesen Ansatz: gambas code
Public Sub py4_Read()
  TextArea1.Insert($hProcess.ReadLine() & gb.NewLine) 
End
Ist das JSON, was da zurück gegeben wird? Dann willst du das sicherlich noch aufbereiten.

gg

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » Sa 11. Nov 2017, 14:42

Hallo Gambi

Danke erstmal fuer Deine Antwort und den Code. Habe Ihn gleich ausprobiert. Leider ist es so, das nach 10 bis 15 Sekunden wieder der ganze Datenschwall in die TextArea geschrieben wird. Ich habe versucht im Gambas Online Buch 3.10 eine Loesung zu finden aber leider ohne Erfolg. Ich verstehe nicht wie man es erreichen kann das der JSON Datensatz direct und sofort in die TextArea umgeleitet werden kann. Ich hoffe das Du noch ne Idee hast...

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Prozess-Management

Beitrag von gambi » Sa 11. Nov 2017, 18:57

Hallo Seecosmea,
also wenn du den Befehl direkt auf der Konsole eingibst, kommen auch sofort die Ergebnisse?
Wenn du das ganze mit Gambas versuchst, kommen erst nach einer Wartezeit die Daten - alle auf einmal.
Habe ich das so richtig verstanden?

Eigentlich sollte das Read-Ereignis sofort ausgelöst werden, wenn Daten zum Lesen anstehen.

Versuche doch mal Folgendes und berichte: gambas code
Public Sub py4_Read()
  Print now
End

EDIT: Zusätzlich mal die Standardfehlerausgabe überprüfen gambas code
Public Sub py4_Error(sErr as String)
  Print "Errorausgabe", now, sErr
End
gg

tux_
Moderator
Beiträge: 949
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Prozess-Management

Beitrag von tux_ » Sa 11. Nov 2017, 19:13

Ich denke, das entscheidende Wort hier ist "Datenstrom". Die Syntax 'Exec [...] To Buffer' fuehrt das gegebene Programm aus, wartet bis es terminiert und gibt dir dann auf einen Schlag all seine Ausgaben. Mit 'For Read' wird der Prozess nebenlaeufig ausgefuehrt und du erhaeltst ueber das Read-Ereignis Nachricht, wenn Daten gelesen werden koennen. Jetzt kannst du die Daten "live" darstellen. Der Haken: 'For Read' verbindet die beiden Prozesse mit einer Pipe und Pipes werden gern mal gepuffert (von wem auch immer -- glibc, Python, Gambas oder alle zusammen?). In einem kleinen Test hier sehe ich, dass sich bei jedem ausgeloesten Read-Event bereits 1024 bis 4096 Bytes in der Pipe angesammelt hatten (das hast du bereits selbst festgestellt). Du musst den Prozess 'For Input' oeffnen. In diesem Fall werden die Prozesse ueber eine PTY gekoppelt und du erhaeltst deine Daten -- wie ein Terminal -- zeilenweise. Probier es hiermit:
gambas code
Public Sub Form_Open()
  Exec ["python", "/home/pi/py4.py"] For Input As "py4"
End

Public Sub py4_Read()
  TextArea1.Insert(Last.Readline() & gb.Newline)
End
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » So 12. Nov 2017, 00:24

Hallo Gambi, Hallo Tux,

Danke fuer Eure Antworten. Mit Tux Code funktioniert es ! :D :D :D ! Ich bin super gluecklich !
Jetzt kann es weitergehen, dieses Problem hatte mich sehr lange beschaeftigt, Vielen Dank nochmal :)

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Prozess-Management

Beitrag von gambi » So 12. Nov 2017, 12:39

Hallo Seecosmea,
freut mich, dass es jetzt klappt.

Danke tux_, wieder was dazu gelernt :)

gg

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » Fr 12. Jan 2018, 11:05

Hallo Gambi, Hallo Tux,

Ich habe zwei neue Sensoren an mein 1-Wire Netzwerk angeschlossen, die auch im JSON Format ihre Strings senden.
Mein Gambas Programm bricht jetzt immer ab mit der Meldung "Null Object in:
gambas code
  If jCollection["dev"] = "input" And jCollection["circuit"] = "1" Then GridView1[0, 2].Text = jCollection["value"] 
Wenn die Sensoren nicht im Netzwerk sind geht alles und nun bricht das Programm immer ab sobald ein JSON String von den neuen Sensoren kommt. Die neuen Sensoren senden folgenden String:

CO2 Sensor:
{"vad": "1.23", "vdd": "5", "circuit": "2656DC84000003B7", "time": 1515692607.33644, "temp": "4.82031", "interval": 15, "typ": "DS2438", "lost": false, "dev": "temp", "humidity": 39.25448718301667}

Luftdruck Sensor:
{"vad": "2.49", "vdd": "5", "circuit": "265ADC84000003CA", "time": 1515747007.881459, "temp": "21.4258", "interval": 15, "typ": "DS2438", "lost": false, "dev": "temp", "humidity": 82.29317100084585}

Hier noch mal den Programm Abschnitt, wie die Strings reinkommen:
gambas code
Public Sub py4_Read()

Dim jCollection As JSONCollection
Dim dDate As Date
Try jCollection = JSON.Decode(Last.Readline(), True)


Hab Ihr eine Idee wo Ich ansetzen kann :?:

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Prozess-Management

Beitrag von gambi » Fr 12. Jan 2018, 14:38

Hallo Seecosmea,
das JSON-Array scheint in Ordnung zu sein, sagt zumindest http://freeonlinetools24.com/json-decode
Your json code is valid:
array (
'vad' => '2.49',
'vdd' => '5',
'circuit' => '265ADC84000003CA',
'time' => 1515747007.8814589977264404296875,
'temp' => '21.4258',
'interval' => 15,
'typ' => 'DS2438',
'lost' => false,
'dev' => 'temp',
'humidity' => 82.2931710008458452421109541319310665130615234375,
)

Aber wo ist denn der JSON Key "value"? Den sehe ich nirgends.

gg

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » Fr 12. Jan 2018, 17:06

Moin Gambi,

Die Sensoren senden Ihren String entweder bei einem Ereignis oder in diesem Fall nach 15 sec. Es folgen noch weitere "IF" Statements. Ich habe nur die erste IF Anweisung genommen weil Gambas dort das Programm abbricht und die Error Message wiedergibt : Null Objekt in:
gambas code
  If jCollection["dev"] = "input" And jCollection["circuit"] = "1" Then GridView1[0, 2].Text = jCollection["value"] 


Über Lösungsvorschläge währe Ich Sehr Dankbar..

Seecosmea
Foriker
Beiträge: 27
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Prozess-Management

Beitrag von Seecosmea » Fr 12. Jan 2018, 17:37

Moin nochmal,

Hier das extrahierte Gambas Program :
gambas code
' Gambas class file

Public jCollection As JSONCollection

Public Sub Form_Open()

GridView1.Columns.Count = 10
GridView1.Rows.Count = 10
Exec ["python", "/home/pi/py4.py"] For Input As "py4"

End

Public Sub py4_Read()

Dim jCollection As JSONCollection
Dim dDate As Date
Try jCollection = JSON.Decode(Last.Readline(), True)

If jCollection["circuit"] = "2859DC84000003EC" Then GridView1[0, 2].Text = jCollection["value"]

End
Ich habe die anderen IF Statements herausgenommen und nur den neuen Luftdruck Sensor am 1-Wire Port angeschlossen. Das Programm bricht wieder ab und wieder die Error Message"Null Object"

Das Problem habe Ich nur mit den neuen Sensoren, das Programm funktioniert mit den anderen Sensoren. Ich weiß nicht weiter...

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste