Aufzeichnung von Sensordaten und grafische Auswertung mit Highcharts

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • So, da war ein Fehler im Script, keine Ahnung wie das passiert ist, aber der Opener hat plötzlich gefehlt,
      ist mir die ganze Zeit nicht aufgefallen.
      Naja, habe das jetzt angepasst, viel weiter bin ich trotzdem nicht:

      Die Seite 192.168.1... funktioniert nicht

      192.168.1.... kann diese Anfrage momentan nicht verarbeiten.
      HTTP ERROR 500

      Es ist zum Mäuse melken
    • tatsächlich:
      12 08:57:06.726412 2016] [:error] [pid 21276] [client 192.168.1.43:50277] PHP Parse error: syntax error, unexpected '$conn' (T_VARIABLE) in /var/www/sensors/datatemphumi.php on line 1


      Eine Idee?
      Kann das vielleicht daher kommen, das die Spalte "Spannung" leer ist?
      Ne oder?

      PHP-Quellcode

      1. <?php$conn = mysqli_connect("192.168.1.68","admin", "xxxxxx", "Sensoren"); if (!$conn) {
      2. die('Kann nicht verbinden: ' . mysql_error());
      3. }
      4. $sth = $conn->query("SELECT Temperatur FROM Keller"); $rows = array(); $rows['name'] = 'Temperatur'; while($r = mysqli_fetch_array($sth)) {
      5. $rows['data'][] = $r['Temperatur'];
      6. }
      7. $sth = $conn->query("SELECT Luftfeuchte FROM Keller"); $rows2 = array(); $rows2['name'] = 'Luftfeuchte'; while($rrrr = mysqli_fetch_array($sth)) {
      8. $rows2['data'][] = $rrrr['Luftfeuchte'];
      9. }
      10. $sth = $conn->query("SELECT Spannung FROM Keller"); $rows1 = array(); $rows1['name'] = 'Spannung'; while($rr = mysqli_fetch_array($sth)) {
      11. $rows1['data'][] = $rr['Spannung'];
      12. }
      13. $sth = $conn->query("SELECT Zeit FROM Keller"); $rows3 = array(); $rows3['name'] = 'Zeit'; while($rrr = mysqli_fetch_array($sth)) {
      14. $rows3['data'][] = strtotime($rrr['Zeit'])*1000;
      15. }
      16. $result = array(); array_push($result,$rows); array_push($result,$rows2); array_push($result,$rows1); array_push($result,$rows3); print
      17. json_encode($result, JSON_NUMERIC_CHECK); mysqli_close($conn); ?>
      Alles anzeigen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mastadook ()

    • hier der export, ist auf enabled:

      mysql

      MySQL Supportenabled
      Active Persistent Links0
      Active Links0
      Client API version5.5.50
      MYSQL_MODULE_TYPEexternal
      MYSQL_SOCKET/var/run/mysqld/mysqld.sock
      MYSQL_INCLUDE-I/usr/include/mysql
      MYSQL_LIBS-L/usr/lib/arm-linux-gnueabihf -lmysqlclient_r

      DirectiveLocal ValueMaster Value
      mysql.allow_local_infileOnOn
      mysql.allow_persistentOnOn
      mysql.connect_timeout6060
      mysql.default_hostno valueno value
      mysql.default_passwordno valueno value
      mysql.default_portno valueno value
      mysql.default_socket/var/run/mysqld/mysqld.sock/var/run/mysqld/mysqld.sock
      mysql.default_userno valueno value
      mysql.max_linksUnlimitedUnlimited
      mysql.max_persistentUnlimitedUnlimited
      mysql.trace_modeOffOff

      mysqli
      MysqlI Supportenabled
      Client API library version5.5.50
      Active Persistent Links0
      Inactive Persistent Links0
      Active Links0
      Client API header version5.5.50
      MYSQLI_SOCKET/var/run/mysqld/mysqld.sock

      DirectiveLocal ValueMaster Value
      mysqli.allow_local_infileOnOn
      mysqli.allow_persistentOnOn
      mysqli.default_hostno valueno value
      mysqli.default_port33063306
      mysqli.default_pwno valueno value
      mysqli.default_socket/var/run/mysqld/mysqld.sock/var/run/mysqld/mysqld.sock
      mysqli.default_userno valueno value
      mysqli.max_linksUnlimitedUnlimited
      mysqli.max_persistentUnlimitedUnlimited
      mysqli.reconnectOffOff
      mysqli.rollback_on_cached_plinkOffOff
    • OK, super, so hatte ich das aus Deinem 4er Pack (Scripte) rauskopiert... vielleicht schaust Du dort nochmal, nicht das andere auch das Problem bekommen.
      Oder mein Texteditor hat da Quatsch gemacht?

      Jetzt bekomme ich Deine Fehlermeldung: Kann nicht verbinden:

      Wir nähern uns dem Ziel, ich sehe es schon als Punkt am Ende des Tunnels ;)
    • Die Scripte im zip-File sehen bei mir gut aus, allerdings verwende ich hier Linux, da kann der Windows-Editor schonmal mit Zeilenumbrüchen Probleme haben (UTF-8 vs. UTF-16LE). Deshalb sollte man nie einfach wild loskopieren ;)

      Dass es mit der IP-Adresse nicht funktioniert liegt daran, dass mySQL standardmässig nur auf localhost lauscht, kannst du in der my.cnf einstellen. Bei

      bind-address = 127.0.0.1


      Was die leere Seite angeht: Heissen deine Variablen alle genauso wie bei mir? Hast du die Datei auch mal auf fehlerhafte Umbrüche überprüft?
    • von einem zweiten PI schreibe ich ja die Daten in die Datenbank,
      von demher hätte es gehen sollen mit der IP dachte ich, naja, egal ;)

      die datatemphumi.php scheint jetzt zu laufen, siehe hier:
      [{"name":"Temperatur","data":[21.5,21.5,21.5,21.5,21.5,21.5,21.5,21.5,21.6,22.3,21.6,21.6,21.5,21.5]},{"name":"Luftfeuchte","data":[68.9,69,69,69.1,68.9,68.9,67.4,65.9,65.1,64.7,66.3,66.8,67.3]},{"name":"Spannung","data":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]},{"name":"Zeit","data":[1473542571000,1473542574000,1473542576000,1473542578000,1473542581000,1473542597000,1473544803000,1473548404000,1473552002000,1473555603000,1473559203000,1473562803

      bei der temphumi.php habe ich nur dein "Bad" durch mein "Keller" ersetzt.
      Sehe da jetzt keine fehlenden Zeilenumbrüche.
      Ich poste trotzdem mal hier den Quelltext:

      HTML-Quellcode

      1. <!DOCTYPE HTML>
      2. <html>
      3. <head>
      4. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" / >
      5. <meta http-equiv="refresh" content="150">
      6. <title>Keller</title>
      7. <script type="text/javascript" src="charts/js/jquery.min.js"></script>
      8. <script type="text/javascript">
      9. $(document).ready(function() {
      10. ////////////////////////////////////////////// globale Optionen
      11. Highcharts.setOptions({
      12. lang: {
      13. contextButtonTitle: "Kontextmenü",
      14. decimalPoint: ",",
      15. downloadJPEG: "JPEG herunterladen",
      16. downloadPDF: "PDF herunterladen",
      17. downloadPNG: "PNG herunterladen",
      18. downloadSVG: "SVG herunterladen",
      19. drillUpText: "Zurück zu {series.name}",
      20. loading: "Lade...",
      21. months: [ "Januar" , "Februar" , "März" , "April" , "Mai" , "Juni" , "Juli" , "August" , "September" , "Oktober" , "November" , "Dezember"],
      22. noData: "Keine Daten zum Anzeigen",
      23. numericSymbols: [ "k" , "M" , "G" , "T" , "P" , "E"],
      24. printChart: "Diagramm drucken",
      25. resetZoom: "Zoom zurücksetzen",
      26. resetZoomTitle: "Zoomlevel auf 1:1 zurücksetzen",
      27. shortMonths: [ "Jan" , "Feb" , "Mär" , "Apr" , "Mai" , "Jun" , "Jul" , "Aug" , "Sep" , "Okt" , "Nov" , "Dez"],
      28. shortWeekdays: [ "So" , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa"],
      29. thousandsSep: ".",
      30. weekdays: [ "Sonntag" , "Montag" , "Dienstag" , "Mittwoch" , "Donnerstag" , "Freitag" , "Samstag"]
      31. }
      32. });
      33. ////////////////////////////////////////////// generelle Optionen des Diagramms
      34. var options = {
      35. chart: {
      36. zoomType: 'x',
      37. alignTicks: false,
      38. renderTo: 'container',
      39. type: 'spline',
      40. marginRight: 180,
      41. marginBottom: 120,
      42. backgroundColor: '#000000',
      43. plotBackgroundColor: '#000000',
      44. plotBorderWidth: 1,
      45. plotBorderColor: '#444444',
      46. plotBorderRadius: 5
      47. },
      48. title: {
      49. text: 'Keller',
      50. style: {color: '#ffffff'},
      51. x: -55
      52. },
      53. ////////////////////////////////////////////// Optionen der Charts
      54. plotOptions: {
      55. spline: {
      56. marker: {
      57. radius: 3
      58. },
      59. lineWidth: 3,
      60. states: {
      61. hover: {
      62. lineWidth: 5
      63. }
      64. },
      65. threshold: null
      66. }
      67. },
      68. ////////////////////////////////////////////// Optionen der X-Achse
      69. xAxis: {
      70. crosshair: false,
      71. type: 'datetime',
      72. tickInterval: 0.1,
      73. labels: {
      74. style: {color: '#ffffff'},
      75. format: '{value: %e.%b %Y<br/>%H:%M}',
      76. dateTimeLabelFormats: {
      77. second: '%d.%m.%Y<br/>%H:%M:%S',
      78. minute: '%d.%m.%Y<br/>%H:%M',
      79. hour: '%d.%m.%Y<br/>%H:%M',
      80. day: '%Y<br/>%d.%m',
      81. week: '%Y<br/>%d.%m',
      82. month: '%m.%Y',
      83. year: '%Y'
      84. }
      85. }
      86. },
      87. ////////////////////////////////////////////// Optionen der Y-Achsen
      88. yAxis: [{ //////////////////////////////////// Y-Achse 1
      89. title: {
      90. tickInterval: 0.1,
      91. text: 'Temperatur',
      92. rotation: -90,
      93. style: { color: '#ffffff'}
      94. },
      95. labels: {
      96. style: {color: '#ffffff'},
      97. format: '{value}°C',
      98. },
      99. gridLineWidth: 0
      100. },
      101. { //////////////////////////////////// Y-Achse 2
      102. title: {
      103. tickInterval: 0.1,
      104. text: 'Luftfeuchte',
      105. rotation: 90,
      106. style: {color: '#ffffff'}
      107. },
      108. labels: {
      109. style: {color: '#ffffff'},
      110. format: '{value}%',
      111. },
      112. opposite:true,
      113. gridLineWidth: 0
      114. },
      115. { //////////////////////////////////// Y-Achse 3
      116. title: {
      117. tickInterval: 0.1,
      118. text: 'Spannung',
      119. rotation: 90,
      120. style: { color: '#ffffff'}
      121. },
      122. labels: {
      123. style: {color: '#ffffff'},
      124. format: '{value}V',
      125. },
      126. opposite:true,
      127. gridLineWidth: 0
      128. }],
      129. ////////////////////////////////////////////// Optionen des Tooltips
      130. tooltip: {
      131. useHTML: true,
      132. backgroundColor: null,
      133. borderWidth: 1,
      134. borderColor: '#ffffff',
      135. shadow: false,
      136. formatter: function(){
      137. return '<div style="background-color:' + '#000000;' + 'color:' + '#ffffff' + '" class="tooltip"> ' +
      138. this.series.name + '<br>' + Highcharts.dateFormat('%e.%b %Y %H:%M',new Date(this.x))
      139. + '<br>' + this.y +'' + this.series.tooltipOptions.valueSuffix +
      140. '</div>';
      141. },
      142. },
      143. ////////////////////////////////////////////// Optionen für die Legende
      144. legend: {
      145. enabled: true,
      146. layout: 'horizontal',
      147. align: 'center',
      148. verticalAlign: 'bottom',
      149. y: -35,
      150. x: -55,
      151. itemStyle: {color: '#ffffff'},
      152. itemHoverStyle: {color: '#555555'},
      153. itemHiddenStyle: {color: '#000000'},
      154. labelFormatter: function() {
      155. return this.name;
      156. }
      157. },
      158. ////////////////////////////////////////////// Aufbereitung der Daten
      159. series: [],
      160. }
      161. $.getJSON("datatemphumi.php", function(json) {
      162. options.xAxis.categories = json[3]['data'];
      163. options.series = new Array();
      164. options.series[0] = json[0];
      165. options.series[1] = json[1];
      166. options.series[2] = json[2];
      167. ////////////////////////////////////////////// Farben der einzelnen Kurven
      168. options.series[0].color = { linearGradient: [0, 0, 0, 250],
      169. stops: [[0.2, 'rgb(255, 0, 0)'],
      170. [0.5, 'rgb(0, 255, 0)'],
      171. [0.6, 'rgb(0, 255, 0)'],
      172. [0.8, 'rgb(0, 0, 255)'],]};
      173. options.series[1].color = '#6666ff';
      174. options.series[2].color = '#888888';
      175. ////////////////////////////////////////////// Optionen der Labels an den Messpunkten
      176. options.series[0].dataLabels = {
      177. enabled: true,
      178. color: '#ffffff',
      179. formatter: function() {
      180. return this.y + '°C';
      181. }};
      182. options.series[1].dataLabels = {
      183. enabled: true,
      184. color: '#ffffff',
      185. formatter: function() {
      186. return this.y + '%';
      187. }};
      188. options.series[2].dataLabels = {
      189. enabled: true,
      190. color: '#ffffff',
      191. formatter: function() {
      192. return this.y + 'V';
      193. }};
      194. gekürzt wegen zuvieler Zeichen...
      Alles anzeigen
      ich sehe da nichts weiter.

      mit der ersten Version von Dir sieht es auch nicht besser aus.
    • mir fehlt die charts/js/jquery.min.js
      die soll wohl laut dem Script:

      Quellcode

      1. <script type="text/javascript" src="charts/js/jquery.min.js"></script>
      vorhanden sein, ist sie dort aber nicht.
      sagt Dir das was?
      Ich habe sie weder im Paket von Highcharts auf dem PC noch auf dem PI

      Werde mal neu runterladen---

      auch im neuen Paket nicht, komisch
    • Habe die jquery.min.js von derer Homepage geladen.
      In das gewünschte Verzeichnis kopiert und sie da, TADAAAAAAA, mein erstes Chart poppt auf :)

      Komisch das die Datei fehlt, aber nagut, hat sich ja geklärt.
      Ich danke Dir Dir für Deinen Hilfe und auch den anderen die Tipps gegeben haben einen netten Dank. ;)

      Ich freu mich :D
      Dateien
      • Unbenannt.PNG

        (69,51 kB, 40 mal heruntergeladen, zuletzt: )
    • Freut mich, dass es funktioniert. An die jquery.min.js hätte ich auch selbst denken können. Ursprünglich hatte ich von Highcharts nur die Minimalvariante. Die besteht nur aus der besagten jquery.min.js und der highcharts.js, allerdings fehlen da viele erweiterte Funktionen, deshalb hab ich mir dann die komplette Version runtergeladen und die jquery.min.js einfach in das Verzeichnis kopiert, sorry.

      Aber was mir am Wochenende schon aufgefallen ist und was man an deinem Screenshot auch schon sehen kann:

      Je mehr Daten auflaufen, desto unübersichtlicher wird der Chart. Leider liefert Highcharts keine vernünftige Funktion, um das zu umgehen. Deshalb habe ich am Wochenende schonmal angefangen, das ganze nach Highstock zu portieren. Da ist die Funktionalität von Highcharts mit drin, aber eben noch bessere Funktionen für die Organisation. Die beiden Bibliotheken sind fast kompatibel, aber eben nur fast. Im Moment bin ich noch am Basteln, aber hier schonmal ein kleiner Vorgeschmack, mit Rangeselector und Zeitleiste:

      highstock.png

      Highcharts will die Daten in einem etwas anderen JSON-Format, deswegen musste ich auch die datatemphumi.php ändern. Aber dazu später mehr ;)