Ich habe in einem anderen Thread (Klick) unter Hilfe von einigen Usern hier eine Möglichkeit gefunden, mein Induktionskochfeld per serieller Schnittstelle anzusteuern. Das passende Arduino-Skript läuft auch schon.
Nun folgt die Einbindung des Arduinos in CBPi, nur dass ich von Python keine Ahnung habe. Daher brauche ich mal das Expertenwissen der CBPi-Profis hier.
Die Ansteuerung des Feldes erfolgt von einem Arduino aus, welcher nun von CBPi aus befehle erhalten soll.
Meine Idee war Folgende:
CBPi rechnet den %-Wert (PID) der Heizleistung aus und übergibt diesen Wert an den Arduino
Der Arduino rechnet die Heizstufe (P1-P5) aus und setzt diese, ggf. wird innerhalb der Heizstufe über "Pulsen" noch feiner gesteuert.
Alle PID-Plugins die ich gefunden habe, steuern jedoch nur über "AN/AUS", hier ein Beispiel aus dem "PID Arduino":
Code: Alles auswählen
while self.is_running():
heat_percent = pid.calc(self.get_temp(), self.get_target_temp())
heating_time = sampleTime * heat_percent / 100
wait_time = sampleTime - heating_time
self.heater_on(100)
self.sleep(heating_time)
self.heater_off()
self.sleep(wait_time)
Hier könnte man ja ansetzen und nur "self.power(heat_percent)" einfügen, oder nicht? also quasi so:
Code: Alles auswählen
while self.is_running():
heat_percent = pid.calc(self.get_temp(), self.get_target_temp())
self.heater_on(heat_percent)
Da überlege ich noch, wie. Per HTTPActor ist zu träge, daher dachte ich an eine Serielle Schnittstelle per USB. Dafür müsste ein Actor dann die entsprechenden Befehle seriell übertragen. Eine Auswertung am Arduino sollte kein Problem darstellen.
Ich habe mir mal was zurechtkopiert:
Code: Alles auswählen
from modules import cbpi
from modules.core.hardware import ActorBase
from modules.core.props import Property
import serial
@cbpi.actor
class SerialActor(ActorBase):
device = Property.Text("Device Name", configurable=True, default_value="/dev/ttyUSB0", description="Serial Device Port")
baud = Property.Number("Baud Rate", configurable=True, default_value=9600, description="Serial Baud Rate")
power = 0
cmd_on = "ON"
cmd_off = "OFF"
def send(self, command):
try:
s = serial.Serial(self.device, self.baud)
s.open()
s.write("command")
s.close()
def on(self, power=None):
self.send(self.cmd_on)
if power is not None:
self.set_power(power)
def off(self):
self.send(self.cmd_off)
def set_power(self, power):
if power is not:
if power != self.power:
self.power = int(power)
self.send(power)
Außerdem würde ich gerne die Möglichkeit haben, Fehlermeldungen zurückzumelden. Beispiel: Mein Arduino kann auslesen, wenn kein Topf auf dem Feld steht. Das würde ich gerne als Fehler oder Hinweis in CBPi angezeigt bekommen. Dafür fehlt mir jedoch noch die Idee, wie das gehen kann.
Vielen Dank!
Edit: Halb fertigen Satz beendet ;)