hallo,
mein Problem ist folgendes ich verwende für meine Haussteuerung LinuxMCE und möchte stündlich die Zeit auf den BUS schicken. Ich kann zwar alles mögliche senden aber das Format stimmt nicht, denn die Zeit die mir der BI.Q anzeigt ist einfach falsch.
Was hab ich bis jetzt gemacht bzw. herausgefunden?
ich hab das perl-skript von RaK genommen und ausgeführt (kann natürlich nicht funktionieren da ich eibd nicht habe) um zu sehen wie das Zeitsignal aussieht.
Soweit so gut. Ich erhalte das Signal in einem HEX-Format. Danach gleich mal versucht mit LinuxMCE diesen Teil auf den bus zu senden. Ergebnis: Zeit ist irgendwie eingestellt...
Nachdem ich den SourceCode für den EIB Teil in LMCE durchsucht habe fand ich heraus dass er einen int erwartet.
Hier der Teil für das senden:
In Zeile 675 sieht man dass er in int umwandelt.
Nun meine konkrete Frage: wie muss ich das HEX umwandeln dass ich das richtige Format bekomme???
lg und danke
avajon
mein Problem ist folgendes ich verwende für meine Haussteuerung LinuxMCE und möchte stündlich die Zeit auf den BUS schicken. Ich kann zwar alles mögliche senden aber das Format stimmt nicht, denn die Zeit die mir der BI.Q anzeigt ist einfach falsch.
Was hab ich bis jetzt gemacht bzw. herausgefunden?
ich hab das perl-skript von RaK genommen und ausgeführt (kann natürlich nicht funktionieren da ich eibd nicht habe) um zu sehen wie das Zeitsignal aussieht.
Code:
#!/usr/bin/perl use Math::BaseCnv; # right $len chars sub rstr{ my $s = shift; my $len = shift; # printf("DEBUG %s %i\n",$s,$len); return substr($s, length($s) - $len, $len); } # read local time ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(time); # Mon is KNX 001 and Sun is 111 in Linux is Sun 1 und Sat 7 @weekDays = qw(111 001 010 011 100 101 110); # calc $hour in bin with exact 5 digits $bin_hour = rstr("000000".cnv( $hour, 10, 2) ,5); @args = ("/usr/bin/groupwrite", "ip:127.0.0.1", "0/6/6", # change protocoll to your needs sprintf("%02X", cnv( $weekDays[$dayOfWeek] . $bin_hour, 2, 10)), # calc weekday and hour in hex sprintf("%02X", $minute), # same for minute and second sprintf("%02X", $second)); # execute command system(@args) == 0 or die "system @args failed: $?";
Nachdem ich den SourceCode für den EIB Teil in LMCE durchsucht habe fand ich heraus dass er einen int erwartet.
Hier der Teil für das senden:
Code:
/** @brief COMMAND: #273 - EIB_Write */ 617 /** Peforms a WRITE request on the bus */ 618 /** @param #108 Address */ 619 /** EIB Group Address */ 620 /** @param #109 Data String */ 621 /** EIB Data */ 622 /** @param #110 DataType */ 623 /** EIB Data Type: 624 [1]-switch (1b) 625 [2]-dimming-control (4b) 626 [3]-time (3B) 627 [4]-date (4B) 628 [5]-value (2B) 629 [6]-scaling (1B) 630 [7]-drive control 631 [9]-float 632 [10]-16bit counter 633 [11]-32bit counter 634 [13]-ASCII character 635 [14]-8bit counter 636 [15]-character string */ 637 638 void EIB::CMD_EIB_Write(string sAddress,string sData_String,int iDataType,string &sCMD_Result,Message *pMessage) 639 //<-dceag-c273-e-> 640 { 641 LoggerWrapper::GetInstance()->Write(LV_STATUS, "Received a Write request: (To= %s, Data Type=%d, Data=%s) ", 642 sAddress.c_str(), iDataType, sData_String.c_str()); 643 644 if(sAddress.length() == 0) { 645 LoggerWrapper::GetInstance()->Write(LV_STATUS, "Empty Group Address passed as parameter"); 646 return; 647 } 648 649 TelegramMessage tlmsg; 650 tlmsg.setGroupAddress(sAddress.c_str()); 651 652 switch(iDataType) { 653 case DT_SWITCH: 654 case DT_DIMMING_CONTROL: 655 case DT_DRIVE_CONTROL: 656 case 8: 657 tlmsg.setShortUserData(atoi(sData_String.c_str())); 658 break; 659 660 case DT_SCALING: 661 case DT_ASCIICHAR: 662 case DT_COUNTER8: { 663 unsigned char data = atoi(sData_String.c_str()); 664 tlmsg.setUserData(&data, 1); 665 } break; 666 667 case DT_VALUE: 668 case DT_COUNTER16: { 669 unsigned short data = atoi(sData_String.c_str()); 670 tlmsg.setUserData((unsigned char*)&data, 2); 671 } break; 672 673 case DT_TIME: 674 case DT_DATE: { 675 unsigned int data = atoi(sData_String.c_str()); 676 tlmsg.setUserData((unsigned char*)&data, 3); 677 } break; 678 679 case DT_FLOAT: 680 case DT_COUNTER32: 681 case 12: { 682 unsigned int data = atoi(sData_String.c_str()); 683 tlmsg.setUserData((unsigned char*)&data, 4); 684 } break; 685 686 case DT_STRING: { 687 tlmsg.setUserData((unsigned char*)sData_String.c_str(), sData_String.length()); 688 } break; 689 690 default: 691 LoggerWrapper::GetInstance()->Write(LV_WARNING, "Unknown TYPE specified for Write request"); 692 return; 693 } 694 695 m_msgPool.sendTelegram(&tlmsg); 696 }
Nun meine konkrete Frage: wie muss ich das HEX umwandeln dass ich das richtige Format bekomme???
lg und danke
avajon
Kommentar