2 Scripte zusammenführen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Yankee0815
User
Beiträge: 2
Registriert: Sonntag 30. Dezember 2018, 03:09

Hallo zusammen,

ich bin absoluter Neuling im Bereich Python.

Ich habe einen Raspi, welcher per Python-Script einen LED-Streifen ansteuert.

Hier das Script für die LEDs
Funktioniert auch, wenn ich das script per Python an der Shell starte

python W2801.py 123 123 123 (dieZiffern sind die Farbe in RGB)
Die LEDs leuchten weiss

python W2801.py 0 0 0
Die LEDs sind wieder aus

Code: Alles auswählen


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import time, sys, inspect, ast
import RPi.GPIO as GPIO
 
# Import the WS2801 module.
import Adafruit_WS2801
import Adafruit_GPIO.SPI as SPI
 
# Configure the count of pixels:
PIXEL_COUNT = 32
 
# other settings
SPI_PORT   = 0
SPI_DEVICE = 0
 
pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE), gpio=GPIO)
 
################################################################################
# DEFINE YOUR FUNCTIONS HERE
################################################################################
 
def setRGBColor(pixels, r=255, g=255, b=255):
    # cast from string to int
    r, g, b = int(float(r)), int(float(g)), int(float(b))
    pixels.set_pixels( Adafruit_WS2801.RGB_to_color( r, g, b ) )
    pixels.show()
 
 
if __name__ == "__main__":
    if len(sys.argv) < 4:
        sys.exit(1)
    
    cmdargs = sys.argv[1:]
    setRGBColor(pixels, cmdargs[0], cmdargs[1], cmdargs[2])
 


Nun möchte ich die Farbe per MQTT steuern, mit diesem Script wird auch ein String in folgender Form empfangen:


python mqtt_subscribe.py

Code: Alles auswählen

import paho.mqtt.client as mqtt
 
MQTT_SERVER = "localhost"
MQTT_PATH = "test_channel"
 
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
 
    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe(MQTT_PATH)
 
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    # more callbacks, etc
 
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
 
client.connect(MQTT_SERVER, 1883, 60)
 
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()


Das Ergebnis sieht folgendermassen aus:

LED1/gesamt 48.00000000000001285714285714285800000000000 48.0000000000000128571428571428580 105.000000000000015

Wie kann ich jetzt den Empfang der Zahlen (des Strings) so in das LED-Script einbauen, das die Farbwerte per MQTT ausgewertet werden?
Ist es auch möglich, das Script dann auszuführen, wenn die Werte sich ändern?
Oder muss es dann als Dauerschleife laufen?

Sorry für die Fragen, aber ich bin jetzt echt ratlos.....


Gruß
Yankee
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Yankee0815: wieviel Python hast Du schon gelernt. Verstehst Du die beiden Skripte?

Der MQTT-Client hat für Dich schon eine Dauerschleife (loop_forever) und Du mußt nur auf Nachrichten reagieren. Und innerhalb der Nachrichtenbearbeitung mußt Du setRGBColor aufrufen. Nichts Kompliziertes, wenn man die Grundlagen von Python soweit gelernt hat, dass man die beiden Skripte lesen kann.
Yankee0815
User
Beiträge: 2
Registriert: Sonntag 30. Dezember 2018, 03:09

Grundsätzlich verstehe ich die Scripte schon, habe nur mit der Syntax so meine Probleme.

Ich habe das mal so versucht, funktioniert aber leider nicht und ich finde den Fehler nicht.....

Code: Alles auswählen


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import time, sys, inspect, ast
import RPi.GPIO as GPIO

# Import MQTT
import paho.mqtt.client as mqtt

 
# Import the WS2801 module.
import Adafruit_WS2801
import Adafruit_GPIO.SPI as SPI

# MQTT Variablen festlegen
MQTT_SERVER = "localhost"
MQTT_PATH = "test_channel"



 
# Configure the count of pixels:
PIXEL_COUNT = 32
 
# other settings
SPI_PORT   = 0
SPI_DEVICE = 0
 

 
################################################################################
# DEFINE YOUR FUNCTIONS HERE
################################################################################
 
def setRGBColor(pixels, r=255, g=255, b=255):
    # cast from string to int
    r, g, b = int(float(r)), int(float(g)), int(float(b))
    pixels.set_pixels( Adafruit_WS2801.RGB_to_color( r, g, b ) )
    pixels.show()
 
 
if __name__ == "__main__":
    if len(sys.argv) < 4:
        sys.exit(1)
    
#    cmdargs = sys.argv[1:]
    setRGBColor(pixels, str(msg.payload))
 

Ich habe da aber noch einen Fehler drin, den ich nicht finde.
Und wie lasse ich das Script dann auf Änderungen reagieren?
Es muss ja nicht in Daurschleife laufen, sondern nur wenn die Empfangenen Daten sich ändern....


Gruß
Yankee
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Welche Gedanken hast Du Dir bei dem neuen Skript gemacht? Warum hast Du welche Änderung vorgenommen?
Und falls Du hier Fragen nach Fehlern stellst: ein "Funktioniert nicht" ist eine schlechte Fehlerbeschreibung. Immer konkret schreiben, was das Verhalten ist, was Du statt dessen erwartet hast und wenn es Fehlermeldungen gab, diese auch posten, inklusive komplettem Traceback.
Antworten