Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > Hallo, > > > > ich habe vor kurzem meine Probot ausgepackt und ein wenig damit herumgespielt. > > Mir kam schnell der Gedanke, dass es interessant wäre den Probot mit ein bisschen > > Computervision oder Sprachverarbeitung etwas intelligenter zu machen. > > Nett wäre es, wenn der Probot beispielsweise auf Gesten oder Worte reagieren könnte. > > Dazu würde ich gerne meinen Raspberry mit dem Probot kommunizieren lassen. > > Die Frage ist, wie verbinde ich die beiden miteinander, damit der Raspberry dem Probot Befehle > > scicken kann und auch umgekehrt. Ich würde ungerne das USB-Kabel benutzen. > > > > Ich hoffe ihr könnt mir da helfen :-) > > > > Viele Grüße > > Matthias > > Hallo Mathias, > ich habe eine AVR32 über die RS232 mit dem Raspberry verbunden und übertrage Messwerte. > Der Raspbeery dient als Webserver. > Die Methode ist recht zuverlässig und ist auch meistens ausreichend schnell. > > > <basic> > Sub RS_RasPi() > Dim sz As Integer > Dim vGes As Byte > Dim vszStr(2) As Char > Dim vRSTeilText(80) As Char > vGes = False > Serial_Init_IRQ(UART,buffer,80,300,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200) > RS232OKTime = DieMinuten() 'vorbereitend die Zeit der letzten Meldung vom Raspberry speichern > Do While True > Str_Printf(vZeitText,"%02d:%02d:%02d %02d.%02d.20%02d %d",Clock_GetVal(2),Clock_GetVal(1),Clock_GetVal(0),Clock_GetVal(3), > Clock_GetVal(4),Clock_GetVal(5),DCF_weekday) > If vGes = False Then 'erst wieder senden wenn eine Antwort vom Raspberry da ist > vRS_Buf = "" > Str_Printf(vRSTeilText,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", vTZWohnz, vTWWohnz, vTRWohnz, vTZGang, vTBGang, vTRGang, > vTZBad, vTBBad, vTRBad, vTZWC, vTBWC, vTRWC) > Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND) > Str_Printf(vRSTeilText,";%d;%d;%d;%d;%d;%u;%u;%u;%u;%u;%u", vTKessel, vTVorlUnten, vTVorlOben, vTAussen, vTWWBoiler, > vTimePST1, vTimePST2, vTimePST3, vTimePST4, vTimePST5, vTimePST6) > Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND) > Str_Printf(vRSTeilText,";%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%s;xxx", vMischerPos, vVentilstufeWo, vVentilstufeGa, > vVentilstufeBa, vVentilstufeWC, vSollTWo, vSollTGa, vSollTBa, vSollTWC, vTempAlarm, vStoerung, vHKWo, vHKBa, > vPumpenstufe, vZeitText) > Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND) > Serial_WriteText(UART,vRS_Buf) 'sendet den Inhalt von vRS_Buf über RS232 > vGes = True > 'Msg_WriteText(vRS_Buf) > 'Msg_WriteChar(13) > End If > sz = Serial_IRQ_Info(UART,RS232_FIFO_RECV) 'zählt die Zeichen im Empfangspuffer > vRSTeilText = "" 'Sting löschen > If sz > 25 Then 'sind mehr als 25 Zeichen im Empfangspuffer > Thread_Delay(10) > Do While True > sz=Serial_ReadExt(UART) 'liest ein Zeichen vom Empfangspuffer > If sz=0x100 Then 'prüft ob der Empfangspuffers leer ist > sz = Str_Comp("Nachricht von Raspberry Pi",vRSTeilText) 'empfangenen Text mit SollText vergleichen > If sz = 0 Then 'bei 0 war der Vergleich OK > RS232OKTime = DieMinuten() 'Zeit der letzten Meldung vom Raspberry speichern > vStoeQuitt = False 'Quittierung der Kommunikationsstörung löschen > 'Msg_WriteText(" Empfang OKr" ) > End If > Exit > End If > vszStr(0) = sz : vszStr(1) = 0 > Str_Copy(vRSTeilText,vszStr,STR_APPEND) > 'Msg_WriteChar(sz) > End While > 'Msg_WriteChar(13) > vGes = False > End If > If vStoeQuitt = False Then 'wurde eine Kommunikationsstörung noch nicht quittiert > If DieMinuten() > RS232OKTime + 10 Then 'TimeOut nach 10 Min > vStoerung = 80 > vStoerTextLCD1 = "RS 232 fehler" 'Störtext für LCD Zeile 1 > vStoerTextLCD2 = "zum Raspberry" 'Störtext für LCD Zeile 2 > vTextSD = "Kommunikation zum Raspberry gestört St.Nr.80" 'Störtext für Protokolldatei > Protokoll(0) 'Störung in Protokolldatei speichern > End If > End If > Thread_Delay(1000) '10s Pause > End While > End Sub > </basic> > > > Python-Code: > <code>#!/usr/bin/python3 > # datacolector.py > > import time > from time import sleep > import sqlite3 > import serial > import os > > os.system("sudo systemctl stop serial-getty@ttyAMA0.service;") > os.system("sudo systemctl disable serial-getty@ttyAMA0.service;") > > # ser2 ist die Verbindung zur Bewässerungssteuerung > ser2 = serial.Serial("/dev/ttyAMA0", timeout=0.5) > ser2.baudrate = 19200 > ser2.bytesize=serial.EIGHTBITS > ser2.parity=serial.PARITY_NONE > ser2.stopbits=serial.STOPBITS_ONE > # ser ist die Verbingung über USB-RS232 zur Heizungssteuerung > ser = serial.Serial('/dev/ttyUSB0', timeout=0.5) > ser.baudrate = 19200 > ser.bytesize=serial.EIGHTBITS > ser.parity=serial.PARITY_NONE > ser.stopbits=serial.STOPBITS_ONE > sleep(0.2) > ap=ser2.read(3000) > p=ser.read(3000) > sleep(0.2) > ser.write(b"Nachricht von Raspberry Pi") #zur Heizungsteuerung > ser2.write(b"Nachricht von Raspberry Pi") #zur Bodenheizung > sleep(0.2) > > connection = sqlite3.connect("/home/pi/Haussteuerung/MessDaten.db") > cursor = connection.cursor() > sql_command = """ > CREATE TABLE IF NOT EXISTS MessDaten ( > id INTEGER PRIMARY KEY, > Zeit INTRGER, > Ausst REAL, > WoZt REAL, > GaZt REAL, > BaZt REAL, > WCZt REAL, > Kesst REAL, > Boilt REAL, > Regen INTEGER, > Wind INTEGER, > Schnee INTEGER, > Sonne INTEGER, > BewZeit INTEGER, > BewZeitUD INTEGER);""" > cursor.execute(sql_command) > connection.commit() > connection.close() > vMinOld = 0 > vDL = True > dl = 0 #Durchlaufzähler > ap = '' > p = '' > BodenHWerte = '' > vRegen = 0 > vBewZeitRegenab = "" > vBewZeitRegenun = "" > BodenHformat = '''{0:s};{1:s};{2:s};{3:s};{4:s};{5:s};{6:s};{7:s};{8:s};{9:s};{10:s};{11:s};{12:s};{13:s};{14:s};{15:s}; > {16:s};{17:s};{18:s};{19:s};{20:s};{21:s};{22:s};{23:s};{24:s};{25:s};{26:s};{27:s};{28:s};{29:s};{30:s};{31:s};{32:s}; > {33:s};{34:s};{35:s};{36:s}''' > while True: > if ap[-3:]==b'xxx' and ap[:3]==b'xxx': # wenn das Schlusszeichen (xxx) des Datenstrings vorhanden ist > dlb=0 > try: > aBew = ap.split(b';') > if len(aBew)==62: #nur wenn die Länge stimmt > #print(ap) > aRegenM = aBew[1:25] > vR = int(aBew[1]) #Regenmenge der letzten Stunde > vRegen = str(vR) > aTempSt = aBew[26:50] > vRegenAktiev = int(aBew[50]) > vVentilEin = int(aBew[51]) > vVStatus = int(aBew[52]) > vR = int(aBew[53]) > vBewZeitRegenab = str(vR) > vR = int(aBew[54]) > vBewZeitRegenun = str(vR) > vDS18B20Temp = int(aBew[55]) > vRegenTakte = int(aBew[56]) > vFehler = int(aBew[57]) > vXOR = 0 > vPSum = 0 > for x in aRegenM: > vXOR = vXOR^int(x) > vPSum = vPSum + int(x) > for x in aTempSt: > vXOR = vXOR^int(x) > vPSum = vPSum + int(x) > x= 50 > while x < 58: > vXOR = vXOR^int(aBew[x]) > vPSum = vPSum + int(aBew[x]) > x += 1 > if vXOR==int(aBew[58]) and aBew[0]==b'xxx' and vPSum==int(aBew[59]): > fx=open("/mnt/RAMDisk/Bewaess_Werte.wet", "w") > fx.write(str(ap)) # stellt die Werte der Bewässerung > fx.close() # für die Webseite zu verfügung > vTimeDate = time.localtime() > if vMinOld!=vTimeDate[4]: # mehrere Durchläufe in der Minute 0 verhindern > vDL = True > if vTimeDate[4]==3 and vDL==True: # 1x pro Stunde > vMinOld = vTimeDate[4] > vDL = False > f=open("/mnt/RAMDisk/BodenH_Werte.wet", "r") > #f=open("A:/EigeneSonstigeDateien/Raspberry Pi/WWW/BodenH_Werte.wet", "r") > vstrf=f.read() > f.close() > aBodenHWerte = vstrf.split(';') > tAus = aBodenHWerte[0] > tWoZ = aBodenHWerte[1] > tGaZ = aBodenHWerte[6] > tBaZ = aBodenHWerte[11] > tWCZ = aBodenHWerte[16] > tKess = aBodenHWerte[22] > tBoil = aBodenHWerte[28] > vZeit = "%s%2.2i%2.2i%2.2i" % (vTimeDate[0], int(vTimeDate[1]), int(vTimeDate[2]), int(vTimeDate[3])) > #print(vZeit) > connection = sqlite3.connect("/home/pi/Haussteuerung/MessDaten.db") > cursor = connection.cursor() > sql = "INSERT INTO MessDaten(Zeit, Ausst, WoZt, GaZt, BaZt, WCZt, Kesst, Boilt, Regen, BewZeit, > BewZeitUD) VALUES(" > +str(vZeit)+","+str(tAus)+","+str(tWoZ)+","+str(tGaZ)+","+str(tBaZ)+","+str(tWCZ)+"," > +str(tKess)+","+str(tBoil)+","+str(vRegen)+","+str(vBewZeitRegenab)+","+str(vBewZeitRegenun)+")" > #print(sql) > cursor.execute(sql) > connection.commit() > connection.close() > except: > sleep(1) > sleep(0.3) > ap=ser2.read(300) #lesen von Bewässerungssteuerung > sleep(0.2) > > #**************ab hier Komunikation mit Heizungssteuerung ************************************************************* > > > if p[-3:] == b'xxx': # prüft ob der WerteString komplett ist > try: > CCWerte = p.split(b';') # Wertestring von der C_Control der Bodenheizungsteuerung splitten > if len(CCWerte)==39: # stimmt die Anzahl der Werte > #print(p) > if CCWerte[0].isdigit: > tWoZ = int(CCWerte[0])/10 # Zimmertemperaturen > if CCWerte[3].isdigit: > tGaZ = int(CCWerte[3])/10 > if CCWerte[6].isdigit: > tBaZ = int(CCWerte[6])/10 > if CCWerte[9].isdigit: > tWCZ = int(CCWerte[9])/10 > if CCWerte[1].isdigit: > tWoW = int(CCWerte[1])/10 # Wand/Bodentemperaturen > if CCWerte[4].isdigit: > tGaB = int(CCWerte[4])/10 > if CCWerte[7].isdigit: > tBaB = int(CCWerte[7])/10 > if CCWerte[10].isdigit: > tWCB = int(CCWerte[10])/10 > if CCWerte[2].isdigit: > tWoR = int(CCWerte[2])/10 # Rücklauftemperaturen > if CCWerte[5].isdigit: > tGaR = int(CCWerte[5])/10 > if CCWerte[8].isdigit: > tBaR = int(CCWerte[8])/10 > if CCWerte[11].isdigit: > tWCR = int(CCWerte[11])/10 > if CCWerte[28].isdigit: > tWoS = int(CCWerte[28])/10 # Solltemperaturen > if CCWerte[29].isdigit: > tGaS = int(CCWerte[29])/10 > if CCWerte[30].isdigit: > tBaS = int(CCWerte[30])/10 > if CCWerte[31].isdigit: > tWCS = int(CCWerte[31])/10 > if CCWerte[24].isdigit: > vWo = int(CCWerte[24]) # Ventilstufe > if CCWerte[25].isdigit: > vGa = int(CCWerte[25]) > if CCWerte[26].isdigit: > vBa = int(CCWerte[26]) > if CCWerte[27].isdigit: > vWC = int(CCWerte[27]) > if CCWerte[15].isdigit: > tAus = float(CCWerte[15])/10 # Aussentemperaur > if CCWerte[12].isdigit: > tKess = int(CCWerte[12])/10 # Kesseltemperatur > if CCWerte[13].isdigit: > tVorU = int(CCWerte[13])/10 # Vorlauftemperaur unten > if CCWerte[14].isdigit: > tVorO = int(CCWerte[14])/10 # Vorlauftemperatur oben > if CCWerte[16].isdigit: > tBoil = int(CCWerte[16])/10 # Boilertemperatur > if CCWerte[36].isdigit: > Pumpenstufe = int(CCWerte[36]) > if CCWerte[37][:2].isdigit: > CCStd = int(CCWerte[37][:2]) > if CCWerte[37][3:5].isdigit: > CCMin = int(CCWerte[37][3:5]) > if CCWerte[37][6:8].isdigit: > CCSek = int(CCWerte[37][6:8]) > if CCWerte[37][9:11].isdigit: > CCTag = int(CCWerte[37][9:11]) > if CCWerte[37][12:14].isdigit: > CCMon = int(CCWerte[37][12:14]) > if CCWerte[37][15:19].isdigit: > CCJah = int(CCWerte[37][15:19]) > if CCWerte[37][20:21].isdigit: > CCWt = int(CCWerte[37][20:21]) > try: > MischerPos = int(CCWerte[23]) > except: > MischerPos = '0' > if CCWerte[34].isdigit: > HKWo = int(CCWerte[34]) > strHKWo = 'Aus' > if HKWo == 1: > strHKWo = 'Ein' > if CCWerte[35].isdigit: > HKBa = int(CCWerte[35]) > strHKBa = 'Aus' > if HKBa == 1: > strHKBa = 'Ein' > if CCWerte[33].isdigit: > StoerNr = int(CCWerte[33]) > if CCWerte[32].isdigit: > Temperturalarm = int(CCWerte[32]) > if CCWerte[17].isdigit: > sB1 = round(int(CCWerte[17])/60,1) # aus Minuten Stunden mit Komma machen > if CCWerte[18].isdigit: > sB2 = round(int(CCWerte[18])/60,1) > if CCWerte[19].isdigit: > sB3 = round(int(CCWerte[19])/60,1) > if CCWerte[20].isdigit: > sB4 = round(int(CCWerte[20])/60,1) > if CCWerte[21].isdigit: > sB5 = round(int(CCWerte[21])/60,1) > if CCWerte[22].isdigit: > sB6 = round(int(CCWerte[22])/60,1) > if CCWerte[37].isdigit: > DateTime = CCWerte[37] > BodenHWerte = BodenHformat.format (str(tAus), > str(tWoZ), str(tWoS), str(tWoW), str(tWoR), str(vWo), > str(tGaZ), str(tGaS), str(tGaB), str(tGaR), str(vGa), > str(tBaZ), str(tBaS), str(tBaB), str(tBaR), str(vBa), > str(tWCZ), str(tWCS), str(tWCB), str(tWCR), str(vWC), > str(Pumpenstufe), str(tKess), str(sB1), str(tVorU), str(sB2), > str(tVorO), str(sB3), str(tBoil), str(sB4), str(MischerPos), > str(sB5), str(StoerNr), str(sB6), strHKWo, strHKBa, str(CCWerte[37]) > ) > f=open("/mnt/RAMDisk/BodenH_Werte.wet", "w") > f.write(BodenHWerte) # für PHP zur Verfügung stellen > f.close() > except: > sleep(1) > p = ser.read(600) # RS232 lesen von Heizungssteuerung > sleep(0.3) # 0,3s Pause > dl = dl + 1 > if dl > 10: > dl = 0 > ser.write(b"Nachricht von Raspberry Pi") > ser2.write(b"Nachricht von Raspberry Pi") > #print("Nachricht") > sleep(0.2) > </code>