Ana içeriğe atla

Python PySide2 ile IOTHOOK dan JSON Veri Alma


PySide2, Qt nin Python projelerinde Qt 5.12+ framework e erişimini sağlayan resmi Python modülüdür. PySide2 yi kullanmadan önce yüklenmesi gereken modüller şu şekildedir.
$ pip install matplotlib
$ pip install numpy
$ pip install PySide2
Python kütüphanelerinin yükleme işlemi pip ile yapılmıştır. Sisteminizde pip yüklü değil ise https://bootstrap.pypa.io/get-pip.py adresine giderek dosyayı bilgisayarınıza kaydediniz ve çalıştırınız.
Biz burada PySide2 ve matplotlib kullanarak oluşturduğumuz Window içerisinde gelen verileri grafik olarak göstereceğiz.
Script çalıştırıldığında aşağıdaki gibi bir pencere görmemiz gerekiyor.
pyside2-matplotlib-iothook.png
Bu örnekde QT Designer kullanılarak arayüz tasarımı yapılmıştır. Widget için Promote to ... seçeneği ile MplWidget sınıfı kullanılmıştır. Bu örneği hazırlamada manap.se Manap ve yapayzekalabs.blogspot.com Yapayzekalabs sitelerinden faydalandım. Bu sitelerde daha fazla kaynak bulabilirsiniz.
Test işlemi IoThook da bulunan 230 id numaralı 5 channel test isimli cihaz ile yapılmıştır.
Bu cihaz demo kullanıcısına aittir.
Bu örneğe ve diğerlerine IOTHOOK Git sayfasından ulaşabilirsiniz.
iothook.ui dosyası:
iothook.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>689</width>
    <height>553</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QLabel" name="label">
     <property name="text">
      <string>Read API KEY</string>
     </property>
    </widget>
   </item>
   <item row="0" column="1">
    <widget class="QLineEdit" name="lineEdit"/>
   </item>
   <item row="0" column="2">
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>Connect</string>
     </property>
    </widget>
   </item>
   <item row="1" column="0" colspan="3">
    <widget class="MplWidget" name="MplWidget" native="true"/>
   </item>
  </layout>
 </widget>
 <customwidgets>
  <customwidget>
   <class>MplWidget</class>
   <extends>QWidget</extends>
   <header>mplwidget.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>
iothook.py dosyası:
iothook.py
import requests
from PySide2.QtWidgets import *
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile, QTimer

from matplotlib.backends.backend_qt5agg import (
    FigureCanvas, NavigationToolbar2QT as NavigationToolbar)

from matplotlib.figure import Figure

import numpy as np
import random


class MplWidget(QWidget):

    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.canvas = FigureCanvas(Figure())

        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)
        vertical_layout.addWidget(NavigationToolbar(self.canvas, self))

        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.setLayout(vertical_layout)


class MainWidget(QWidget):

    def __init__(self):
        QWidget.__init__(self)

        designer_file = QFile("iothook.ui")
        designer_file.open(QFile.ReadOnly)
        loader = QUiLoader()
        loader.registerCustomWidget(MplWidget)
        self.ui = loader.load(designer_file, self)
        designer_file.close()

        self.setWindowTitle("IOTHOOK")

        self.field_1_list = []
        self.field_2_list = []
        self.field_3_list = []
        self.field_4_list = []
        self.field_5_list = []
        self.field_6_list = []
        self.field_7_list = []
        self.field_8_list = []

        self.lineEdit = self.ui.findChild(QLineEdit, 'lineEdit')
        self.pushButton = self.ui.findChild(QPushButton, 'pushButton')

        self.pushButton.clicked.connect(self.result)

        grid_layout = QGridLayout()
        grid_layout.addWidget(self.ui)
        self.setLayout(grid_layout)

    def result(self):
        self.timer = QTimer()
        self.timer.setInterval(5000)
        self.timer.timeout.connect(self.status)
        self.timer.start()

    def status(self):
        print("update")
        # read api key
        # API_KEY = '4c8f1e0277c7f694e698739b'  # demo #230 5 channel test
        API_KEY = self.lineEdit.text()
        if API_KEY:
            self.pushButton.setText("Stop")
            url = 'http://iothook.com/api/device/?api_key=' + API_KEY + "&results=1"
            response = requests.get(url)
            data = response.json()
            print(data)

            try:
                self.ui.MplWidget.canvas.axes.clear()
                self.field_title_list = []

                if data[0]['field_1']:
                    self.field_title_list.append('field_1')
                    self.field_1_list.append(data[0]['field_1'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_1_list)

                if data[0]['field_2']:
                    self.field_title_list.append('field_2')
                    self.field_2_list.append(data[0]['field_2'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_2_list)

                if data[0]['field_3']:
                    self.field_title_list.append('field_3')
                    self.field_3_list.append(data[0]['field_3'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_3_list)

                if data[0]['field_4']:
                    self.field_title_list.append('field_4')
                    self.field_4_list.append(data[0]['field_4'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_4_list)

                if data[0]['field_5']:
                    self.field_title_list.append('field_5')
                    self.field_5_list.append(data[0]['field_5'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_5_list)

                if data[0]['field_6']:
                    self.field_title_list.append('field_6')
                    self.field_6_list.append(data[0]['field_6'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_6_list)

                if data[0]['field_7']:
                    self.field_title_list.append('field_7')
                    self.field_7_list.append(data[0]['field_7'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_7_list)

                if data[0]['field_8']:
                    self.field_title_list.append('field_8')
                    self.field_8_list.append(data[0]['field_8'])
                    self.ui.MplWidget.canvas.axes.plot(self.field_8_list)

                self.ui.MplWidget.canvas.axes.legend((self.field_title_list), loc='upper right')
                self.ui.MplWidget.canvas.draw()

                self.repaint()
            except:
                pass


app = QApplication([])
window = MainWidget()
window.show()
app.exec_()


Bu örneği canlı test edebilmek için tarayıcınıza aşağıdaki linki yapıştırarak verilerin değişimini gözlemleyebilirsiniz.

https://iothook.com/api/update/?api_key=3fb1150c2736b82cff5323c6&field_1=5&field_2=0&field_3=0&field_4=20&field_5=7





Yorumlar

Bu blogdaki popüler yayınlar

C# ile JSON veri alma

oThook kullanıcısının tüm kanallarına ait veriyi alabilmesi için GET metodu ile ‘?data=last’ değişkeninin gönderilmesi gereklidir. Aynı örnekdeki data değişkeninin alabileceği değerler: ?data=all : Kullanıcının tüm datalarını getir?data=first : Kullanıcının ilk datasını getir?data=last : Kullanıcının son datasını getir CSharp örneğinde HttpWebRequest metodu kullanılmıştır. Bu örneği http://bit.ly/iot_csharp_get Github sayfasından inceleyebilirsiniz.

/* C# ile IoThook REST Api Testi Bu örnek ile CSharp ve Request metodu ile kullanıcının datalarının get metodu ile alınması gerçekleştirilmiştir. 'autorization' ile kullanıcı adı ve parola değeri verilmelidir. Bu ornek IotHook servisine veri almak/gondermek icin baslangic seviyesinde testlerin yapilmasini amaclamaktadir. 29 Temmuz 2017 Sahin MERSIN Daha fazlasi icin http://www.iothook.com ve https://github.com/electrocoder/iotHook sitelerine gidiniz. Sorular ve destek talepleri icin https://github…

C# ile Json veri gönderme

. IoThook kullanıcısının kanal ve elementlerine veri gönderebilmesi için POST metodu ile JSON olarak değişkenlerin gönderilmesi gereklidir. CSharp örneğinde using Newtonsoft.Json; metodu kullanılmıştır. Bu kütüphaneyi indirmek için http://www.newtonsoft.com/json adresine gidiniz. Bu örneği http://bit.ly/iot_csharp_post Github sayfasından inceleyebilirsiniz.

/* C# ile IoThook REST Api Testi Bu örnek ile CSharp ve JSON ile kullanıcının dataları POST metodu ile gönderme işlemi gerçekleştirilmiştir. 'autorization' ile kullanıcı adı ve parola değeri verilmelidir. Bu ornek IotHook servisine veri almak/gondermek icin baslangic seviyesinde testlerin yapilmasini amaclamaktadir. 29 Temmuz 2017 Sahin MERSIN Daha fazlasi icin http://www.iothook.com ve https://github.com/electrocoder/iotHook sitelerine gidiniz. Sorular ve destek talepleri icin https://github.com/electrocoder/iotHook/issues sayfasindan veya Meşe Bilişim den yardım alabilirsiniz. Yayi…

Raspberry Pi 3 IP sabitleme, Static IP verme

Raspberry Pi 3 ün terminal ekranı açılır.

work ssh pi@192.168.1.201 pi@192.168.1.201's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Aug 3 20:00:07 2017 pi@raspberrypi:~ $








sudo nano /etc/dhcpcd.conf ile ayar dosyası açılır ve aşağıdaki satırlar yapıştırılır veya yazılır.


# kablolu bağlantı için - ethernet interface eth0 static ip_address=192.168.1.201/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 # kablosuz bağlantı için - wifi interface wlan0 static ip_address=192.168.1.202/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1